如何在Flutter中获取Stripe支付的Token?
Stripe支付获取Token问题解决
问题描述
我首次实现Stripe支付方式,API开发人员要求我提供Stripe支付的Token。我查阅了相关教程,但未找到获取Token的方法。目前我已完成支付功能的实现并成功完成支付,但仍需获取该Token。
以下是我的尝试代码,但运行报错:
Future<void> makePayment() async { try { paymentIntent = await createPaymentIntent("20", "USD"); if (paymentIntent == null) { // handle the error print("Error creating payment intent"); return; } await Stripe.instance .initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( paymentIntentClientSecret: paymentIntent?['client_secret'], // applePay: PaymentSheetApplePay(merchantCountryCode: "+971"), // googlePay: PaymentSheetGooglePay(testEnv: true, currencyCode: "AE"), style: ThemeMode.dark, merchantDisplayName: "Marketingo")) .then((value) {}); displayPaymentSheet(); var tokenData = await Stripe.instance.createToken(params); if (tokenData.tokenId != null) { var token = tokenData.tokenId; // Use the token to complete the payment on your server. } } catch (e) { print("exception $e"); } }
问题分析
你的代码直接调用createToken(params)但未定义params参数,这是报错的直接原因。另外,你用的是Stripe推荐的Payment Sheet支付流程,这个流程本身不会返回支付Token——因为Payment Sheet是直接通过Payment Intent完成支付,所有敏感卡片数据都由Stripe托管,前端不会接触到Token这类敏感信息。
解决方案
方案1:通过后端从Payment Intent关联数据中获取Token(推荐)
支付完成后,前端无法直接拿到Token,必须通过后端调用Stripe API获取:
- 支付成功后,前端把Payment Intent的ID传给后端
- 后端调用Stripe的「查询Payment Intent」接口,拿到关联的
payment_method字段 - 再调用「查询Payment Method」接口,从返回的
card对象中提取token字段
方案2:前端手动收集卡片生成Token(不推荐,需合规处理)
如果必须在前端生成Token,你需要自行收集用户卡片信息,再调用createToken方法,但这种方式需要你处理PCI合规问题,安全性远不如Payment Sheet:
// 示例:创建卡片Token final tokenData = await Stripe.instance.createToken( const CreateTokenParams.card( card: CardParams( number: '4242424242424242', expMonth: 12, expYear: 2025, cvc: '123', ), ), ); if (tokenData.tokenId != null) { // 拿到tokenId后进行后续处理 }
注意:这种方式不能和Payment Sheet流程混用,二者是两套独立的支付路径。
关键提示
- Payment Sheet是Stripe官方推荐的集成方式,它全程托管敏感数据,无需你处理Token这类信息,合规性和安全性更高
- 如果只是需要记录支付凭证,直接使用Payment Intent ID或Payment Method ID即可,不一定非要获取Token
内容的提问来源于stack exchange,提问作者Mansoor Malik
相关产品推荐
相关产品推荐

