You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter集成Google Pay与flutter_stripe时遇Invalid token ID错误

解决Google Pay集成flutter_stripe时的"Invalid token ID"问题

1. 检查Google Pay Tokenization配置

首先确认Pay插件的Google Pay配置中,已正确设置Stripe作为网关,否则生成的token无法被Stripe识别:

final googlePayConfig = GooglePayPaymentConfiguration(
  environment: GooglePayEnvironment.test,
  merchantId: '你的商户ID',
  gateway: 'stripe', // 必须设置为stripe
  stripe: const StripeParameters(
    publishableKey: 'pk_test_你的测试公钥',
    countryCode: 'CN', // 对应你的支付地区
  ),
);

2. 修正Token解析逻辑

Pay插件返回的token可能是**Stripe Payment Method ID(pm_开头)**而非传统的tok_开头的token,此时不需要使用cardFromToken,直接用PaymentMethodParams.id传入:

final token = paymentResult['paymentMethodData']['tokenizationData']['token'];

// 跳过json.decode,直接使用token值作为payment method ID
final params = PaymentMethodParams.id(
  paymentMethodId: token,
);

await Stripe.instance.confirmPayment(
  paymentIntentClientSecret: clientSecret,
  data: params,
);

如果打印token发现是JSON字符串,解析后检查type字段:

final token = paymentResult['paymentMethodData']['tokenizationData']['token'];
final tokenJson = json.decode(token);

// 如果type是payment_method,用id字段
if (tokenJson['type'] == 'payment_method') {
  final params = PaymentMethodParams.id(
    paymentMethodId: tokenJson['id'],
  );
  await Stripe.instance.confirmPayment(
    clientSecret: clientSecret,
    data: params,
  );
} 
// 如果是token类型,再用cardFromToken
else if (tokenJson['type'] == 'card') {
  final params = PaymentMethodParams.cardFromToken(
    paymentMethodData: PaymentMethodDataCardFromToken(
      token: tokenJson['id'],
    ),
  );
  await Stripe.instance.confirmPayment(
    clientSecret: clientSecret,
    data: params,
  );
}

3. 验证Token有效性

可以通过Stripe API验证拿到的token是否有效(使用测试密钥):

# 测试tok_开头的token
curl https://api.stripe.com/v1/tokens/tok_xxx \
  -u sk_test_你的测试密钥:

# 测试pm_开头的payment method
curl https://api.stripe.com/v1/payment_methods/pm_xxx \
  -u sk_test_你的测试密钥:

如果返回404,说明生成的token不是Stripe的有效凭证,大概率是Google Pay配置错误导致的。

4. 确认Payment Intent配置

服务器端创建Payment Intent时,需确保:

  • 货币类型与Google Pay配置的countryCode匹配
  • 金额单位是最小货币单位(比如人民币为分,美元为美分)
  • 测试模式下使用Stripe测试卡片(Google Pay测试可使用4242 4242 4242 4242等)

内容的提问来源于stack exchange,提问作者rya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:02:31