Laravel 8中Stripe Webhook队列Job已存在却提示不存在的问题求助
我正在用Laravel 8开发项目,已经配置了Stripe的Webhook,支付完成后Webhook会触发应用端点并将任务发送到队列,但队列处理任务时抛出错误:
Spatie\StripeWebhooks\Exceptions\WebhookFailed: Could not process webhook id '5' of type ' because the configured jobclass 'App\Jobs\StripeWebhooks\HandleChargeableSource' does not exist. in /Users...
但这个类实际是存在的,相关代码与配置如下:
类文件(当前路径:app/Jobs/StripeWebhooks.php)
<?php namespace App\Jobs\StripeWebhooks; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Spatie\WebhookClient\Models\WebhookCall; class HandleChargeableSource implements ShouldQueue { use InteractsWithQueue, Queueable, SerializesModels; /** @var \Spatie\WebhookClient\Models\WebhookCall */ public $webhookCall; public function __construct(WebhookCall $webhookCall) { $this->webhookCall = $webhookCall; } public function handle() { // 在此处处理业务逻辑 // 可通过`$this->webhookCall->payload`访问Webhook的负载数据 } }
配置文件(路径:config/stripe-webhooks.php)
<?php return [ /* * Stripe会使用一个密钥对每个Webhook请求进行签名。你可以在Webhook配置设置页面找到该密钥。 */ 'signing_secret' => env('STRIPE_WEBHOOK_SECRET'), /* * 你可以在此定义当特定Webhook触发应用时应运行的任务。键名是Stripe事件类型的名称,将其中的`.`替换为`_`。 */ 'jobs' => [ 'invoice_payment_succeeded' => \App\Jobs\StripeWebhooks\HandleChargeableSource::class, ], /* * 要使用的模型类名。该类应等于或继承自Spatie\StripeWebhooks\ProcessStripeWebhookJob。 */ 'model' => \Spatie\StripeWebhooks\ProcessStripeWebhookJob::class, /* * 禁用后,该包将不会验证签名是否有效。这在本地环境中会很有用。 */ 'verify_signature' => env('STRIPE_SIGNATURE_VERIFY', true), ];
补充说明:我已执行composer dump-autoload,得到如下提示:
Class App\Jobs\HandleChargeableSource located in ./app/Jobs/StripeWebhooks.php does not comply with psr-4 autoloading standard. Skipping.
兄弟,你看composer输出的提示其实已经把问题根源点透了——这完全是PSR-4自动加载规范不匹配搞的鬼,咱们一步一步来修复:
第一步:修正文件结构与命名空间的对应关系
PSR-4的规则很明确:命名空间的每个层级,必须对应实际的目录结构。你现在的命名空间是App\Jobs\StripeWebhooks,但类文件却直接放在了app/Jobs/StripeWebhooks.php里,这不符合规范。正确的结构应该是:app/ Jobs/ StripeWebhooks/ # 新建这个目录 HandleChargeableSource.php # 把原代码迁移到这个文件中简单来说:把
StripeWebhooks.php改名为HandleChargeableSource.php,然后新建一个StripeWebhooks目录,把这个文件放进去,让目录层级和命名空间完全对应。第二步:重新生成自动加载文件
虽然你已经跑过composer dump-autoload,但现在文件结构改了,得再执行一次,最好加上优化参数确保生效:composer dump-autoload -o第三步:重启队列进程
别忘了Laravel的队列进程会缓存类的加载信息,修改完文件结构后,必须重启队列才能让新的类路径生效:php artisan queue:restart
做完这三步,自动加载就能正确找到你的HandleChargeableSource类了,队列任务也能正常处理Webhook请求啦。
内容的提问来源于stack exchange,提问作者WillMaddicott

