Stripe订阅后发送发票时出现PHP非对象上下文使用$this错误
问题分析与解决
错误核心原因
你遇到的「非对象上下文中使用$this」错误,本质是错误地以静态方法方式调用了Stripe SDK的实例方法。Stripe PHP SDK里的sendInvoice是Invoice类的实例方法,必须在已实例化的Invoice对象上调用;直接用\Stripe\Invoice::sendInvoice()静态调用时,没有对应的对象实例,自然会触发$this不存在的错误。
同时你的代码顺序完全颠倒:先调用sendInvoice再创建订阅,这会导致$stripe_subscription未初始化,即使没触发当前错误,也会传入无效的发票ID。
修正后的代码
// 第一步:先创建订阅,获取有效的latest_invoice $stripe_subscription = \Stripe\Subscription::create([ 'customer' => $stripe_customer->id, 'payment_behavior' => 'allow_incomplete', 'items' => [['price' => $price->id]], 'metadata' => ['Address' => "address"], ]); // 第二步:通过retrieve方法获取Invoice实例 $invoice = \Stripe\Invoice::retrieve($stripe_subscription->latest_invoice); // 第三步:调用实例方法sendInvoice $invoice->sendInvoice([]);
关键说明
- Stripe SDK中,大部分操作资源的方法都是实例方法,比如发送发票、更新资源等,必须先通过
retrieve或create方法获取对象实例后再调用 - 确保代码执行顺序正确:依赖某个资源的操作,必须放在该资源创建/获取之后
内容的提问来源于stack exchange,提问作者zohaib irshad
相关产品推荐
相关产品推荐

