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

Laravel集成Stripe支付失败无法跳转至Cancel页面问题求助

问题排查与修复方案

核心问题分析

你的代码存在三个关键漏洞,导致支付失败时无法跳转至cancel页面:

  1. 异常捕获范围过窄:仅捕获了CardException,但Stripe支付流程中还会抛出其他类型的异常(如参数错误、认证失败等),未被捕获的异常会直接触发Laravel默认错误页面,无法进入cancel视图。
  2. Customer创建未纳入异常处理:\Stripe\Customer::create()的代码在try块之外,若创建客户失败(如token无效),会直接抛出异常,无法进入后续错误处理逻辑。
  3. 支付成功分支外无兜底处理:当chargeResponse['paid']或captured不为1时,没有对应的跳转逻辑,请求会无响应或返回空白。

修复后的完整代码

/* stripe code */ else if ($payment_method == 'stripe') {
    $stripe = array(
        "secret_key"      => $stripe_secret_key,
        "publishable_key" => $stripe_publish_key
    );

    \Stripe\Stripe::setApiKey($stripe['secret_key']);

    $item_name = $item_names_data;
    $item_price = $amount * 100;
    $currency = $site_currency;
    $order_id = $purchase_token;

    try {
        // 将Customer创建移入try块,统一捕获异常
        $customer = \Stripe\Customer::create(array(
            'email' => $order_email,
            'source'  => $token
        ));

        $charge = \Stripe\Charge::create(array(
            'customer' => $customer->id,
            'amount'   => $item_price,
            'currency' => $currency,
            'description' => $item_name,
            'metadata' => array(
                'order_id' => $order_id
            )
        ));

        $chargeResponse = $charge->jsonSerialize();

        if ($chargeResponse['paid'] == 1 && $chargeResponse['captured'] == 1) {
            return view('success')->with($data_record);
        } else {
            // 支付已发起但未成功捕获的情况,跳转cancel页面
            return view('cancel');
        }
    } catch (\Stripe\Exception\CardException $e) {
        // 卡支付失败(如余额不足、卡被拒绝)
        return view('cancel');
    } catch (\Stripe\Exception\StripeException $e) {
        // 捕获所有Stripe相关异常,覆盖参数错误、认证失败等场景
        return view('cancel');
    } catch (\Exception $e) {
        // 兜底捕获其他非Stripe异常
        return view('cancel');
    }
}

关键修复点说明

  • 扩大异常捕获范围:先捕获特定的CardException,再用StripeException捕获所有Stripe相关异常,最后用全局Exception兜底,确保所有错误场景都能触发cancel跳转。
  • Customer创建移入try块:将客户创建逻辑放到try内部,避免因客户创建失败导致的未捕获异常。
  • 增加非成功分支的兜底:当支付状态不符合成功条件时,主动跳转cancel页面,避免无响应情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:41:39