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

Laravel中取消订阅路由return back()失效问题咨询

排查Laravel中Cancel路由return back()失效的问题

从代码逻辑来看,两个路由结构高度一致,但Cancel路由执行后出现空白页无法自动返回,核心问题大概率是Cancel方法执行过程中抛出了未捕获的异常,导致代码没走到return back()这一步。下面是具体排查和解决步骤:

1. 先查看Laravel日志定位线索

直接打开storage/logs/laravel.log,搜索最近的错误记录——这是最快找到问题根源的方式。如果Cancel请求触发了错误(比如数组键不存在、API请求失败),日志里会明确显示错误详情。

2. 给Cancel路由添加异常捕获

临时修改Cancel路由的闭包,加上try-catch块直接输出错误信息:

Route::get('/cancel', function (Request $request) {
    try {
        $user = Auth::user();
        $response = $user->subscription()->cancel();
        toastr()->success('Your subscription has been successfully cancelled.', 'Success' , ['closeButton' => 'true','positionClass' => 'toast-top-center']);
        return back();
    } catch (\Exception $e) {
        // 临时输出错误,上线后替换为日志记录
        dd($e->getMessage(), $e->getTraceAsString());
        // 或者返回前端错误提示
        toastr()->error('取消订阅失败:' . $e->getMessage());
        return back();
    }
});

访问Cancel路由后,就能直接看到具体的错误原因。

3. 核心问题:Cancel方法的API响应处理错误

对比Resume和Cancel的控制器方法:

  • Resume使用PATCH请求,LemonSqueezy会返回更新后的订阅完整数据(包含data.attributes结构)
  • Cancel使用DELETE请求,LemonSqueezy的订阅删除接口通常返回204 No Content(无响应体),或响应结构与PATCH请求完全不同

但你的Cancel方法里直接调用了$this->sync($response['data']['attributes']),如果$response中没有data或attributes字段,就会抛出「Undefined array key」的致命错误,导致代码直接终止,自然走不到return back()。

解决方法:修改Cancel方法适配DELETE响应

根据LemonSqueezy的API规则,删除订阅后无需依赖返回数据,直接更新本地订阅状态即可:

public function cancel(): self
{
    $response = LemonSqueezy::api('DELETE', "subscriptions/{$this->lemon_squeezy_id}");

    // 手动更新本地订阅状态,替代sync方法
    $this->update([
        'status' => 'cancelled',
        'cancelled_at' => now(),
        // 按需添加其他需要同步的字段,比如ends_at等
    ]);

    return $this;
}

或者先判断响应结构再做处理:

public function cancel(): self
{
    $response = LemonSqueezy::api('DELETE', "subscriptions/{$this->lemon_squeezy_id}");

    if (isset($response['data']['attributes'])) {
        $this->sync($response['data']['attributes']);
    } else {
        $this->status = 'cancelled';
        $this->cancelled_at = now();
        $this->save();
    }

    return $this;
}

4. 额外检查:重复取消的场景

如果用户已经取消过订阅,再次调用Cancel时,LemonSqueezy会返回404或400错误,也会触发异常。可以在Cancel方法里先判断订阅状态:

public function cancel(): self
{
    if ($this->status === 'cancelled') {
        throw new LogicException('订阅已取消,无需重复操作');
    }

    $response = LemonSqueezy::api('DELETE', "subscriptions/{$this->lemon_squeezy_id}");

    $this->update([
        'status' => 'cancelled',
        'cancelled_at' => now(),
    ]);

    return $this;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:06:14