Laravel(Wave框架):将Paddle Webhook取消生效日期存入数据库
问题:Wave集成Paddle后,订阅取消后需保留权限至付费周期结束
背景
我用Wave(快速搭建SaaS的工具包)开发项目,已配置Paddle,但默认用户取消订阅后会立即失去权限,无法保留至付费周期结束。计划添加该功能,从Paddle文档得知Webhook payload对应字段为cancellation_effective_date。现有cancelSubscription函数,尝试两种方式为该字段赋值均报错“变量未定义”,寻求解决办法。
现有cancelSubscription函数代码
private function cancelSubscription($subscription_id){ $subscription = PaddleSubscription::where('subscription_id', $subscription_id)->first(); $subscription->cancelled_at = Carbon::now(); $subscription->status = 'cancelled'; $subscription->save(); }
尝试过的赋值代码(均报错“变量未定义”)
$subscription->cancellation_effective_date = $request->cancellation_effective_date; $subscription->cancellation_effective_date = $cancellation_effective_date;
Paddle示例Webhook Payload
Array ( [alert_id] => 1282370466 [alert_name] => subscription_cancelled [cancellation_effective_date] => 2023-04-10 [checkout_id] => 9-d11a2ef3289d6c8-ccdeb4a3ad [currency] => EUR [custom_data] => custom_data [email] => irunolfsdottir@example.net [event_time] => 2023-04-05 20:13:54 [linked_subscriptions] => 7, 2, 7 [marketing_consent] => 1 [passthrough] => Example String [quantity] => 18 [status] => deleted [subscription_id] => 6 [subscription_plan_id] => 8 [unit_price] => unit_price [user_id] => 1 )
解决方案
1. 传递Webhook Payload到函数
当前函数仅接收$subscription_id,无法获取Paddle Webhook的完整数据。修改函数定义,添加$payload参数,从payload中提取字段值:
private function cancelSubscription($subscription_id, $payload){ $subscription = PaddleSubscription::where('subscription_id', $subscription_id)->first(); $subscription->cancelled_at = Carbon::now(); $subscription->status = 'cancelled'; // 从payload中获取生效日期并赋值 $subscription->cancellation_effective_date = $payload['cancellation_effective_date']; $subscription->save(); }
同时,在调用该函数的Webhook处理代码中,把Paddle发送的完整payload传进来。
2. 新增数据库字段
确认paddle_subscriptions表存在cancellation_effective_date字段,若不存在,生成迁移文件添加:
public function up() { Schema::table('paddle_subscriptions', function (Blueprint $table) { $table->date('cancellation_effective_date')->nullable(); }); }
执行迁移:php artisan migrate
3. 修改权限验证逻辑
调整权限判断逻辑,不再仅通过status判定权限,而是结合cancellation_effective_date:
// 示例:在权限检查处添加判断 if ($subscription->status === 'cancelled' && Carbon::now()->greaterThan($subscription->cancellation_effective_date)) { // 权限已过期,拒绝访问 abort(403); } // 否则允许访问
内容的提问来源于stack exchange,提问作者neonfontana
相关产品推荐
相关产品推荐

