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

PHP中为Stripe发票添加custom_fields报错求助

解决Stripe发票custom_fields报错及格式问题

问题核心

你碰到两个关键问题:

  1. PHP代码生成的custom_fields是带索引的对象({0:{name:'Company',value:'Apple'}}),而非Stripe要求的数组格式,导致参数校验失败。
  2. 在invoice.created事件中操作时,订阅生成的发票会快速进入finalized状态,此时无法修改发票字段。

针对性解决方案

1. 修正参数格式问题

你的代码写法本身符合Stripe要求,但如果仍出现格式异常,可按以下方式排查:

  • 升级Stripe PHP SDK:旧版本SDK可能存在数组序列化bug,执行composer update stripe/stripe-php更新到最新版。
  • 显式构建索引数组:避免数组被隐式转为关联数组,可采用更明确的写法(虽非必需,但能快速定位格式问题):
$customFields = [];
$customFields[] = ['name' => 'Company', 'value' => 'Apple'];

\Stripe\Invoice::update($invoice_id, [
    'custom_fields' => $customFields
]);

2. 调整事件监听或订阅设置

订阅发票默认会自动触发finalize流程,invoice.created事件触发后极短时间内发票就会变为不可修改状态,可通过两种方式解决:

  • 改用invoice.finalizing事件:该事件在发票即将被finalize时触发,此时发票仍处于可编辑状态,适合添加custom_fields。
  • 关闭订阅自动finalize:修改订阅的auto_advance参数为false,待完成custom_fields修改后再手动finalize发票:
// 修改订阅自动finalize设置(仅需执行一次)
\Stripe\Subscription::update($subscription_id, [
    'auto_advance' => false
]);

// 在invoice.created事件中修改字段后手动finalize
\Stripe\Invoice::update($invoice_id, [
    'custom_fields' => [['name' => 'Company', 'value' => 'Apple']]
]);
\Stripe\Invoice::finalizeInvoice($invoice_id);

验证建议

  1. 查看Stripe返回的具体报错:如果是Cannot update finalized invoice,确认是发票状态问题;如果是参数格式错误,重点排查数组序列化逻辑。
  2. 测试环境中可先关闭自动finalize,手动触发流程验证修改是否生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:55:18