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

Laravel调用StripeClient时CardException异常捕获失效问题

问题原因及解决方案

你遇到的问题核心在于:Stripe的paymentMethods->create接口不会因为卡片过期抛出CardException。这个接口仅验证卡片的格式、CVC有效性和卡号校验位,不会检查卡片是否过期、余额不足这类支付级别的错误——这些错误只会在你尝试用该Payment Method发起支付(比如创建并确认Payment Intent)时才会触发异常。

比如你用的测试卡号4000000000000002,就是专门用于在支付环节触发card_declined错误的,而非创建Payment Method环节。

正确的处理流程代码示例

要捕获卡片过期这类支付错误,你需要在创建Payment Method后,发起支付操作并捕获异常:

try{
    $stripe = new \Stripe\StripeClient(config('app.stripe_secret'));

    // 1. 创建Payment Method
    $paymentMethod = $stripe->paymentMethods->create([
        'type' => 'card',
        'billing_details' => [
            'name' => '123',
            'email' => '123@gmail.com',
        ],
        'card' => [
            'number' => '4000000000000002',
            'exp_month' => 11,
            'exp_year' => 2023,
            'cvc' => '314',
        ],
    ]);

    // 2. 创建Payment Intent并确认支付(触发卡片校验)
    $paymentIntent = $stripe->paymentIntents->create([
        'amount' => 1000, // 金额,单位为分(此处示例为10美元)
        'currency' => 'usd',
        'payment_method' => $paymentMethod->id,
        'confirm' => true, // 立即确认支付
        'return_url' => 'https://your-domain.com/return', // 需配置你的业务回调地址
    ]);

    echo '支付成功:' . json_encode($paymentIntent);
} catch(\Stripe\Exception\CardException $e){
    echo 'Status is:' . $e->getHttpStatus() . '\n';
    echo 'Type is:' . $e->getError()->type . '\n';
    echo 'Code is:' . $e->getError()->code . '\n';
    echo 'Param is:' . $e->getError()->param . '\n';
    echo 'Message is:' . $e->getError()->message . '\n';
} catch(\Exception $e){
    // 捕获其他类型的异常
    echo '其他错误:' . $e->getMessage();
}

补充说明

如果需要在创建Payment Method阶段就触发卡片错误测试,可以使用Stripe专门的测试卡号,比如4000000000000127(创建时会触发invalid_cvc错误),但卡片过期的错误始终只会在支付环节触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:01:02