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

已授权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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:50:35