已授权Stripe支付的取消方案咨询(PHP后端场景)
解决Stripe支付中库存售罄的授权取消问题
核心思路
Stripe快速入门默认是自动捕获支付,你需要改成手动捕获模式:创建支付意向(Payment Intent)时仅完成支付授权,等用户完成3D验证后再检查库存,决定是执行捕获(实际扣费)还是取消授权(无实际扣费、无手续费)。
具体步骤
1. 创建Payment Intent时开启手动捕获
修改你创建Payment Intent的PHP代码,添加capture_method参数设为manual,确保仅完成授权而非直接扣费:
require_once('vendor/autoload.php'); \Stripe\Stripe::setApiKey('sk_test_your_secret_key'); $paymentIntent = \Stripe\PaymentIntent::create([ 'amount' => 2000, // 金额单位:分 'currency' => 'usd', 'payment_method_types' => ['card'], 'capture_method' => 'manual', // 关键:开启手动捕获模式 ]); // 将client_secret返回给前端,用于发起支付流程 echo json_encode(['client_secret' => $paymentIntent->client_secret]);
2. 用户完成验证后,检查库存并处理
用户完成3D验证后,会触发两个关键节点:一是被重定向到你的返回URL,二是Stripe会推送payment_intent.succeeded的webhook事件(优先依赖webhook,避免用户关闭页面不跳转的情况)。在这两个节点执行以下操作:
- 检查活动门票的剩余库存
- 库存充足:调用API捕获支付,完成实际扣费
- 库存售罄:调用API取消已授权的Payment Intent,终止交易
捕获支付的PHP代码示例
// 根据Payment Intent ID查询订单 $paymentIntent = \Stripe\PaymentIntent::retrieve('pi_your_payment_intent_id'); // 执行捕获操作 $capturedIntent = $paymentIntent->capture(); // 捕获成功后,扣减库存、生成用户订单
取消授权的PHP代码示例
// 根据Payment Intent ID查询订单 $paymentIntent = \Stripe\PaymentIntent::retrieve('pi_your_payment_intent_id'); // 取消已授权的支付 $canceledIntent = $paymentIntent->cancel(); // 取消后,告知用户活动已售罄,无需退款
3. 关键注意事项
- 必须依赖webhook:不能仅靠返回URL处理,部分用户可能在验证后直接关闭页面,只有webhook能确保交易状态被及时处理
- 加库存锁防超卖:高并发场景下,检查库存时要加数据库行锁或分布式锁,避免多个用户同时通过验证后超卖
- 授权有效期:信用卡授权一般有效期为7天,取消操作需在有效期内执行
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

