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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:45:05