Laravel Cashier集成Paddle后数据未写入数据库问题排查
Laravel Cashier Paddle Webhook 未写入数据库问题排查
是的,Laravel Cashier(Paddle版本)应该自动处理Paddle发送的Webhook事件,并将客户、订阅、交易等数据写入对应数据库表——前提是Webhook配置正确,事件能被Cashier正确接收和处理。结合你的情况,Paddle沙箱后台显示交易完成但本地无数据,大概率是Webhook链路或配置存在隐性问题,可按以下步骤排查:
1. 验证Webhook路由与CSRF排除
- 执行
php artisan route:list,确认是否存在POST /paddle/webhook路由,且中间件包含web和paddle-webhook。 - 检查
App\Http\Middleware\VerifyCsrfToken类的$except数组,确认/paddle/webhook已被排除——Cashier通常会自动注册,但手动配置时可能遗漏,导致Webhook请求被CSRF拦截。
2. 确认Webhook签名验证通过
- 确保
.env中的PADDLE_PUBLIC_KEY是Paddle沙箱环境的公钥(生产和沙箱公钥不同),且无多余空格、换行或格式错误。签名验证失败时,Cashier会直接返回403,不会处理事件。 - 可临时在
vendor/laravel/cashier-paddle/src/Http/Controllers/WebhookController.php的handleWebhook方法开头添加日志:
查看Log::info('Paddle Webhook Received', $request->all());storage/logs/laravel.log,确认请求是否到达处理逻辑。
3. 检查事件类型与Cashier支持范围
- 登录Paddle沙箱后台,查看Webhook历史记录,确认发送的事件类型是否在Cashier的处理范围内:
- 客户创建:
customer.created - 订阅创建:
subscription.created - 交易完成:
transaction.completed
Cashier仅处理这些核心事件,若Paddle发送的是其他未被支持的事件类型,不会写入数据。
- 客户创建:
4. 确认用户模型关联正确
- 确保User模型已正确引入
Laravel\Paddle\Billabletrait,且数据库表存在paddle_id字段(字符串类型,允许为空)。 - 前端调用Paddle结账浮层时,必须传递与本地用户绑定的标识:
- 若通过后端生成结账链接,需使用
$user->newSubscription(...)或$user->charge(...)方法,Cashier会自动关联用户ID到Paddle事件; - 若前端直接调用Paddle SDK,需在配置中传入
customer_id(对应本地用户ID),否则Cashier无法将Paddle的客户/交易与本地用户关联,不会写入数据。
- 若通过后端生成结账链接,需使用
5. 排查Laravel日志
- 查看
storage/logs/laravel.log,寻找Webhook处理过程中的异常信息:比如数据库字段缺失、权限不足、模型关联错误等,这些隐性错误可能导致数据未写入但无外部报错。 - 可在
App\Providers\EventServiceProvider中监听Cashier的Webhook事件,进一步确认处理流程:protected $listen = [ \Laravel\Paddle\Events\WebhookReceived::class => [ function ($event) { Log::info('Webhook Received Event', $event->payload); }, ], \Laravel\Paddle\Events\WebhookHandled::class => [ function ($event) { Log::info('Webhook Handled Event', ['event' => $event->payload['event_type']]); }, ], ];
6. 确认沙箱环境配置
- 检查
.env中的PADDLE_ENV是否设置为sandbox,若误设为production,Cashier会使用生产环境API验证沙箱事件,导致签名验证失败或事件不兼容。
内容的提问来源于stack exchange,提问作者basagabi
相关产品推荐
相关产品推荐

