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

Laravel平台接入Stripe实现多商家直接收款的代码验证

代码问题与修正建议

你的代码能实现基础的代收款逻辑,但存在几个关键问题和需要补充的地方,具体如下:

核心问题点

  • 使用旧版Charge API:Stripe目前推荐使用PaymentIntent API替代Charge,后者不支持3D Secure等强身份验证机制,在生产环境可能触发支付失败(尤其是符合SCA监管要求的地区)。
  • 硬编码连接账户ID:你平台有多家企业,硬写acct_1.......无法适配不同企业的收款需求,需要动态传入对应企业的账户ID(比如从请求参数、关联的企业模型中获取)。
  • 无错误处理机制:当前代码如果支付失败(比如卡片被拒、网络问题)会直接抛出异常,用户看不到任何错误提示,体验极差。
  • 依赖旧版stripeToken:source字段使用stripeToken是旧版集成方式,现在Stripe官方推荐使用PaymentMethod配合Elements组件,安全性和兼容性更好。

修正后的代码示例

public function stripePost(Request $request)
{
    // 建议从配置文件读取密钥,而非直接调用env()
    Stripe\Stripe::setApiKey(config('services.stripe.secret'));

    // 动态获取当前收款企业的Stripe账户ID(示例从请求参数获取,实际可从企业模型关联)
    $connectedAccountId = $request->input('connected_account_id');

    try {
        // 使用PaymentIntent创建支付(替代Charge)
        $paymentIntent = Stripe\PaymentIntent::create(
            [
                'amount' => 100 * 100, // 金额单位为分
                'currency' => 'AUD',
                'payment_method' => $request->input('payment_method'), // 前端Elements生成的payment_method ID
                'confirm' => true, // 自动确认支付
                'description' => '服务款项支付',
                'application_fee_amount' => 100, // 如果平台要收手续费,可设置此项(单位分)
            ],
            ['stripe_account' => $connectedAccountId]
        );

        // 支付成功后的逻辑,比如记录订单状态、通知企业等
        Session::flash('success', '支付成功!');
    } catch (\Stripe\Exception\CardException $e) {
        // 卡片相关错误
        Session::flash('error', '支付失败:'.$e->getError()->message);
    } catch (\Stripe\Exception\ApiErrorException $e) {
        // 其他Stripe API错误
        Session::flash('error', '支付处理出错,请稍后重试');
        // 可在此记录日志,方便排查问题
        \Log::error('Stripe支付错误:'.$e->getMessage());
    } catch (\Exception $e) {
        // 其他系统错误
        Session::flash('error', '系统异常,请联系管理员');
        \Log::error('支付系统错误:'.$e->getMessage());
    }

    return back();
}

需要补充的配套内容

  1. 前端适配:

    • 替换旧的stripeToken生成方式,改用Stripe Elements组件创建支付表单,获取payment_method ID传给后端。
    • 处理3D Secure验证:如果PaymentIntent需要额外验证,前端要调用stripe.confirmCardPayment完成验证流程。
  2. 配置优化:

    • 在config/services.php中添加Stripe配置:
      'stripe' => [
          'secret' => env('STRIPE_SECRET'),
          'key' => env('STRIPE_KEY'),
      ]
      
    • 避免在代码中直接使用env()函数,生产环境配置缓存后env()会失效。
  3. 业务逻辑完善:

    • 确保每个企业的Stripe账户ID已正确关联到平台的企业模型中,支付时动态取出。
    • 如果平台需要收取服务费,可通过application_fee_amount参数设置(需确保连接账户已开启相关权限)。
    • 支付成功后,添加订单状态更新、支付记录保存等业务逻辑。
  4. 测试与合规:

    • 在Stripe测试环境用测试卡片验证不同场景(比如支付成功、卡片被拒、3D Secure验证)。
    • 确保连接账户已完成Stripe的身份验证要求,否则可能无法接收款项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 08:13:12