Flutter使用flutter_stripe时出现PaymentIntent client_secret不匹配报错如何解决
问题描述
我遇到了相同的报错,以下是我的代码,我尝试过多种其他逻辑但均出现同一错误。我使用了Flutter依赖flutter_stripe,已经创建了Firebase函数,也试过不使用Firebase的方案。
代码片段
// ignore_for_file: deprecated_member_use import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_stripe/flutter_stripe.dart'; import 'package:http/http.dart' as http; class PaymentData { static Future<void> makePayment() async { Map<String, dynamic>? paymentIntentData; final url = Uri.parse( 'firebase function url'); final response = await http.get(url, headers: {'Content-Type': 'application/json'}); paymentIntentData = jsonDecode(response.body); print(paymentIntentData); await Stripe.instance.initPaymentSheet( paymentSheetParameters: SetupPaymentSheetParameters( paymentIntentClientSecret: paymentIntentData!['paymentIntent'], applePay: true, googlePay: true, style: ThemeMode.system, merchantCountryCode: 'US', merchantDisplayName: 'Raja', )); //displayPaymentSheet(paymentIntentData); } static Future<void> displayPaymentSheet( Map<String, dynamic>? paymentIntentData) async { try { await Stripe.instance.presentPaymentSheet( parameters: PresentPaymentSheetParameters( clientSecret: paymentIntentData!['paymentIntent'], confirmPayment: true)); } catch (e) { print(e); } } }
报错信息
提供的client_secret与PaymentIntent关联的client_secret不匹配
解决方案
按以下优先级排查即可修复问题:
- 首先检查后端返回字段的正确性:你代码中取client secret的key是
paymentIntent,但Stripe官方创建PaymentIntent后返回的client secret对应字段为client_secret,先查看你打印的paymentIntentData日志内容,确认存储client secret的字段名是否和代码中取值的key完全一致,包括大小写、拼写不要出错。 - 检查Stripe密钥的匹配性:确认你Firebase函数中使用的Stripe密钥、Flutter端初始化
Stripe.publishableKey所用的密钥,属于同一个Stripe账号的同一环境(测试/生产不能混用),跨账号、跨环境创建的PaymentIntent的client secret无法互通,会触发该报错。 - 避免PaymentIntent重复创建:检查
makePayment方法是否存在重复触发的情况,多次调用后端接口会生成多个不同的PaymentIntent,如果你用前一次请求返回的client secret初始化、后一次的提交,就会出现不匹配的问题,可给请求加锁避免重复调用。 - 校验两次传入client secret的一致性:你当前代码注释了
displayPaymentSheet的调用,如果是单独触发该方法,要确认传入的paymentIntentData和之前初始化PaymentSheet时用的是同一个对象,不要出现初始化用了新的、提交用了旧的的情况。 - 临时验证方案:你可以先把后端返回的有效client secret硬编码到代码中替换动态取值的逻辑,如果不再报错,可100%确认是后端返回字段或者动态取值逻辑的问题。
内容的提问来源于stack exchange,提问作者faraz ahmed
相关产品推荐
相关产品推荐

