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

Flutter调用presentPaymentSheet时抛出StripeException:支付Sheet未初始化

问题原因排查及解决办法

导致该报错的核心原因通常是PaymentSheet初始化流程实际已经失败,但你没有捕获到对应的错误,具体可以按照以下步骤逐一排查修复:


1. 首先修复后端Node.js的异步逻辑冲突

你当前的后端代码同时混用了await和回调函数处理Stripe接口请求,属于异步逻辑冲突,会导致云函数要么提前终止,要么返回的client_secret为空,前端拿到无效的参数自然会初始化PaymentSheet失败。
请替换为全async/await写法的后端代码:

const functions = require("firebase-functions");
const stripe = require('stripe')(functions.config().stripe.testkey);

exports.stripePayment = functions.https.onRequest(async (req, res) => {
  // 本地调试需要加跨域配置,上线可以移除
  res.set('Access-Control-Allow-Origin', '*');
  try {
    const paymentIntent = await stripe.paymentIntents.create({
      amount: 170,
      currency: 'usd'
    });
    res.json({
      paymentIntent: paymentIntent.client_secret
    });
  } catch (err) {
    console.log('Stripe接口报错:', err);
    res.status(500).json({error: err.message});
  }
})

2. 确认Flutter端已完成Stripe全局初始化

很多开发者会漏掉全局公钥初始化的步骤,没有这一步PaymentSheet会静默初始化失败,你需要在应用启动时完成配置:

import 'package:flutter_stripe/flutter_stripe.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  // 替换为你自己Stripe账号的测试公钥
  Stripe.publishableKey = 'pk_test_xxxxxxxxxxxxxxx';
  runApp(const MyApp());
}

3. 补充Dart端的错误捕获和参数校验

你当前的代码没有校验后端返回值,也没有捕获初始化阶段的报错,就算初始化失败也会继续执行唤起操作,修改后的支付逻辑如下:

Future<void> makePayment() async {
  try {
    final url = Uri.parse('${firebaseFunction}');
    final response = await http.get(url, headers: {'Content-Type': 'application/json'});
    
    // 先校验后端请求是否成功
    if (response.statusCode != 200) {
      throw Exception('后端请求失败,状态码:${response.statusCode}');
    }
    
    this.paymentIntentData = json.decode(response.body);
    final clientSecret = paymentIntentData?['paymentIntent'];
    // 校验支付秘钥是否有效
    if (clientSecret == null || clientSecret.isEmpty) {
      throw Exception('后端返回的支付凭证为空');
    }

    // 初始化PaymentSheet,报错会直接进入catch块
    await Stripe.instance.initPaymentSheet(
        paymentSheetParameters: SetupPaymentSheetParameters(
            paymentIntentClientSecret: clientSecret,
            applePay: true,
            googlePay: true,
            style: ThemeMode.dark,
            merchantCountryCode: 'UK',
            merchantDisplayName: 'Test Payment Service'));
    setState(() {});
    print('initialised');

    await Stripe.instance.presentPaymentSheet();
    setState(() {
      paymentIntentData = null;
    });
    if(mounted) {
      ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
        content: Text('支付成功!'),
      ));
    }
  } catch (e) {
    print('支付流程报错:$e');
    if(mounted) {
      ScaffoldMessenger.of(context).showSnackBar(SnackBar(
        content: Text('支付失败:${e.toString()}'),
      ));
    }
  }
}

额外注意事项

  • 确认你使用的flutter_stripe包是最新稳定版,旧版本存在初始化相关的已知bug
  • 安卓调试时请开启硬件加速,否则PaymentSheet渲染异常会导致初始化失败
  • 确认前后端使用的Stripe密钥属于同一个账号,且测试环境不要混用生产密钥

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:54:03