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
相关产品推荐
相关产品推荐

