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

React Native中Stripe支付交易无法完成的问题求助

问题排查与修复建议

1. 必须处理initPaymentSheet的初始化结果

你当前未捕获initPaymentSheet的Promise错误,大概率PaymentSheet初始化阶段就已失败,但未被察觉,导致后续presentPaymentSheet行为异常。修改代码,确保初始化成功后再调用支付面板:

const handlePayment = async () => {
  try {
    // 先执行初始化并捕获错误
    const { error: initError } = await initPaymentSheet({
      merchantDisplayName: "Acme, Inc.",
      // 配置项后续修正,见第2点
    });

    if (initError) {
      console.error('PaymentSheet初始化失败:', initError);
      setExplanation(`初始化支付面板失败: ${initError.message}`);
      return;
    }

    // 初始化成功后,再唤起支付面板
    const paymentResult = await presentPaymentSheet();
    // 处理支付结果
    if (paymentResult.error) {
      myConfirmHandler({ sResultCode: 'C' }, paymentResult);
    } else {
      myConfirmHandler({ sResultCode: 'F' });
    }
  } catch (err) {
    console.error('支付流程异常:', err);
    setExplanation(`支付出错: ${err?.message}`);
    myConfirmHandler({ sResultCode: 'C' }, { error: err });
  } finally {
    console.log('支付流程结束');
  }
};

2. 修正intentConfiguration的使用逻辑

你的配置存在逻辑矛盾:

  • 当使用mode: { amount, currencyCode }时,Stripe期望你在confirmHandler中调用后端接口生成新的Payment Intent,而非传入预先生成的clientSecret。
  • 如果你的业务是预先创建好了Payment Intent(已有transaction.piPaymentIntent.clientSecret),应直接使用paymentIntentClientSecret参数,放弃intentConfiguration:
// 预先已有Payment Intent的正确配置方式
await initPaymentSheet({
  merchantDisplayName: "Acme, Inc.",
  paymentIntentClientSecret: transaction.piPaymentIntent.clientSecret,
});

若确实需要前端触发创建Payment Intent(动态生成),confirmHandler需调用后端接口生成新Intent后返回clientSecret:

confirmHandler: async (paymentMethod, _, intentCreationCallback) => {
  try {
    // 调用你的后端接口创建Payment Intent
    const response = await fetch('/api/create-payment-intent', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        amount: transaction.amountOwed * 100,
        currency: 'USD',
        payment_method_id: paymentMethod.id,
      }),
    });
    const { clientSecret } = await response.json();
    intentCreationCallback({ clientSecret });
  } catch (err) {
    intentCreationCallback({ error: { message: '创建支付订单失败' } });
  }
}

3. 补全StripeProvider平台必要配置

iOS平台必须添加merchantIdentifier(从Apple开发者后台获取),否则会导致支付流程异常:

<StripeProvider
  publishableKey={publishableKey}
  merchantIdentifier="merchant.com.your-app-bundle-id" // iOS必填
>
  <View style={styles.container}></View>
</StripeProvider>

4. 查看原生日志获取详细错误

"Something went wrong"是通用提示,需通过设备原生日志定位具体问题:

  • iOS:打开Xcode控制台,过滤"Stripe"关键词查看详细错误
  • Android:使用Android Studio的Logcat,过滤"Stripe"或"PaymentSheet"关键词

5. 确认测试卡号与Payment Intent匹配

确保测试卡号的使用场景符合要求:

  • 例如4242 4242 4242 4242仅适用于USD货币,且金额需大于0、不超出Stripe测试限制
  • 后端生成Payment Intent时,amount、currency必须与前端完全一致,且Intent状态为requires_payment_method

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 01:30:56