Stripe PHP:草稿发票支付意向创建及检索问题咨询
解决Stripe订阅升级后支付意向检索的问题
我看你在处理Stripe订阅升级时,遇到了支付意向无法正确检索的麻烦——先是用$inv->pay()触发支付失败生成意向,但通过订阅的latest_invoice拿不到;后来尝试直接检索发票又返回空。这里有两个靠谱的解决方案,帮你搞定这个问题:
一、替代$inv->pay():主动生成支付意向的更优方式
其实你完全不需要靠$inv->pay()失败来被动生成支付意向,可以直接对草稿发票执行定稿操作,之后就能直接获取到支付意向,步骤很清晰:
- 先将草稿发票从
draft状态定稿为open:
$inv = \Stripe\Invoice::retrieve($invoice_id); $inv->finalizeInvoice(); // 完成发票定稿
- 定稿完成后,发票会自动关联支付意向,你可以直接获取,要是需要详细信息,检索时记得展开字段:
// 直接获取支付意向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()因卡片验证失败抛出异常时,支付意向其实已经生成了,你只需要:
- 捕获支付异常,然后重新检索该发票:
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; // 这里就能拿到有效的支付意向了 }
- 至于你之前
$updated_inv = \Stripe\Invoice::retrieve($invoice_id)返回为空,大概率是invoice_id有误——确认你用的是新创建的草稿发票ID,而不是旧的未结发票ID。另外,Stripe的API操作基本是同步的,不需要等待异步更新,所以重点检查ID是否正确。
补充:关于订阅的latest_invoice字段
你之前尝试通过订阅的latest_invoice获取支付意向失败,是因为手动创建的草稿发票不会自动更新订阅的latest_invoice字段——这个字段只会指向订阅自动生成的最新发票。所以手动创建的发票必须单独跟踪和检索,不要依赖订阅的这个字段。
内容的提问来源于stack exchange,提问作者Ryan




