You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Stripe PHP:草稿发票支付意向创建及检索问题咨询

解决Stripe订阅升级后支付意向检索的问题

我看你在处理Stripe订阅升级时,遇到了支付意向无法正确检索的麻烦——先是用$inv->pay()触发支付失败生成意向,但通过订阅的latest_invoice拿不到;后来尝试直接检索发票又返回空。这里有两个靠谱的解决方案,帮你搞定这个问题:

一、替代$inv->pay():主动生成支付意向的更优方式

其实你完全不需要靠$inv->pay()失败来被动生成支付意向,可以直接对草稿发票执行定稿操作,之后就能直接获取到支付意向,步骤很清晰:

  1. 先将草稿发票从draft状态定稿为open
$inv = \Stripe\Invoice::retrieve($invoice_id);
$inv->finalizeInvoice(); // 完成发票定稿
  1. 定稿完成后,发票会自动关联支付意向,你可以直接获取,要是需要详细信息,检索时记得展开字段:
// 直接获取支付意向ID
$payment_intent_id = $inv->payment_intent;

// 或者获取完整的支付意向对象
$updated_inv = \Stripe\Invoice::retrieve([
  'id' => $invoice_id,
  'expand' => ['payment_intent']
]);
$payment_intent = $updated_inv->payment_intent;

这种方式不需要触发支付失败,流程更可控,也能避免你之前遇到的检索问题。

二、如果坚持用$inv->pay(),正确检索的姿势

要是你还是想保留现有$inv->pay()的流程,问题出在调用pay()后没有刷新发票对象,也没处理异常。当$inv->pay()因卡片验证失败抛出异常时,支付意向其实已经生成了,你只需要:

  1. 捕获支付异常,然后重新检索该发票:
try {
    $inv->pay();
} catch (\Stripe\Exception\CardException $e) {
    // 支付失败后,重新检索发票并展开支付意向
    $updated_inv = \Stripe\Invoice::retrieve([
        'id' => $inv->id,
        'expand' => ['payment_intent']
    ]);
    $payment_intent = $updated_inv->payment_intent;
    // 这里就能拿到有效的支付意向了
}
  1. 至于你之前$updated_inv = \Stripe\Invoice::retrieve($invoice_id)返回为空,大概率是invoice_id有误——确认你用的是新创建的草稿发票ID,而不是旧的未结发票ID。另外,Stripe的API操作基本是同步的,不需要等待异步更新,所以重点检查ID是否正确。

补充:关于订阅的latest_invoice字段

你之前尝试通过订阅的latest_invoice获取支付意向失败,是因为手动创建的草稿发票不会自动更新订阅的latest_invoice字段——这个字段只会指向订阅自动生成的最新发票。所以手动创建的发票必须单独跟踪和检索,不要依赖订阅的这个字段。

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

火山引擎 最新活动