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

stripe-react-native使用预构建UI实现延后向客户扣款的问题求助

解决方案

你需要使用Stripe的预授权+手动捕获机制实现延后扣款,无需更换PaymentSheet预构建UI,只需要调整以下三处逻辑即可:

1. 修改服务端PaymentIntent创建参数

创建PaymentIntent时新增capture_method: 'manual'配置,指定该笔交易为手动捕获模式,此时用户完成支付验证后只会冻结对应卡片额度,不会实际入账扣款,修改后代码如下:

const paymentIntent = await stripe.paymentIntents.create({
  amount: 299,
  currency: 'gbp',
  customer: customer.id,
  confirm:false,
  off_session:true,
  capture_method: 'manual', // 新增这一行,指定手动捕获
  metadata: {
    business_order_id: '你的业务订单ID' // 可选,方便关联你的业务数据
  }
});

接口返回时建议同时将paymentIntent.id返回给前端,或者在服务端直接将PaymentIntent ID和对应业务订单绑定存储。

2. 调整前端支付完成后逻辑

用户完成PaymentSheet内的支付验证操作后,将PaymentIntent ID同步到你的服务端,和待校验的业务订单绑定:

private openPaymentsheet = async()=>{
  const { error, paymentOption } = await presentPaymentSheet();
  if (error) {
    throw error
  }
  // 新增逻辑:将PaymentIntent ID传给自己的后端,和业务订单绑定
  // 这里paymentIntentId可以从之前configure-paymentsheet接口返回的client_secret解析,或者接口直接返回
  await axios.post("http://192.168.1.199:3000/bind-order-payment", {
    order_id: '当前业务订单ID',
    payment_intent_id: '你拿到的PaymentIntent ID'
  })
}

3. 校验完成后发起实际扣款/取消预授权

业务校验通过后,调用Stripe的捕获接口完成实际扣款:

// 服务端校验通过后执行
const captureResult = await stripe.paymentIntents.capture('对应绑定的PaymentIntent ID')
// 捕获成功后更新业务订单状态即可

如果业务校验不通过,调用取消接口释放用户卡片的冻结额度:

const cancelResult = await stripe.paymentIntents.cancel('对应绑定的PaymentIntent ID')

注意事项

  • 卡组织的预授权冻结有效期通常为7天,超过7天未捕获的预授权会自动失效,额度原路退回用户,若你的校验流程超过7天,需要提前重新发起预授权流程。
  • 捕获时支持调整实际扣款金额,最多可较预授权金额上浮15%(不同地区、卡种规则略有差异),可根据实际业务需求调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:27:02