如何在Laravel PHP中通过Stripe使用已保存银行卡完成后续支付
Laravel 框架使用 Stripe 已保存银行卡完成后续支付的实现方案
前置准备
- 确保你已经将用户的银行卡绑定到对应的 Stripe 客户(Customer)对象中,本地用户表已存储
stripe_customer_id和对应支付方式的payment_method_id - 项目已安装 Stripe PHP SDK,执行命令安装:
composer require stripe/stripe-php - 已在
.env配置文件中配置好 Stripe 密钥:
STRIPE_KEY=pk_test_xxxxxx STRIPE_SECRET=sk_test_xxxxxx
核心实现流程
- 服务端初始化 Stripe 配置
\Stripe\Stripe::setApiKey(env('STRIPE_SECRET'));
- 读取当前用户关联的 Stripe 客户ID和待使用的已保存支付方式ID
$user = auth()->user(); $stripeCustomerId = $user->stripe_customer_id; // 如果有多个保存的卡,让用户选择后读取对应payment_method_id即可 $paymentMethodId = $user->default_payment_method_id;
- 创建并确认 PaymentIntent 完成支付
try { $paymentIntent = \Stripe\PaymentIntent::create([ 'amount' => 9900, // 金额单位为货币最小单位,人民币为分、美元为美分 'currency' => 'cny', // 按实际业务需求修改货币类型 'customer' => $stripeCustomerId, 'payment_method' => $paymentMethodId, 'confirm' => true, // 自动确认支付 // 非用户主动在场的自动扣费场景开启,用户主动发起支付可设为false 'off_session' => false, // 触发3DS验证时的跳转回调地址 'return_url' => route('payment.callback'), ]); // 支付成功逻辑 if ($paymentIntent->status === 'succeeded') { // 处理你的业务订单逻辑 return response()->json(['code' => 200, 'msg' => '支付成功']); } // 需要进行3DS验证的场景,返回client_secret给前端处理 if ($paymentIntent->status === 'requires_action') { return response()->json([ 'code' => 300, 'client_secret' => $paymentIntent->client_secret, 'msg' => '需要进行身份验证' ]); } } catch (\Stripe\Exception\CardException $e) { // 卡支付失败,比如余额不足、卡过期等 return response()->json(['code' => 400, 'msg' => '支付失败:' . $e->getMessage()]); } catch (\Exception $e) { // 其他系统错误处理 return response()->json(['code' => 500, 'msg' => '系统错误']); }
注意事项
- 调用支付的支付方式必须已经关联到对应 Stripe 客户ID,不允许跨客户调用支付方式
- 欧盟等要求强客户认证的地区,哪怕是已保存的银行卡也可能触发3DS验证,必须配套前端验证逻辑,调用Stripe.js根据返回的client_secret完成验证即可
- 定期清理已过期的支付方式,避免调用无效卡发起支付
内容的提问来源于stack exchange,提问作者daxter
相关产品推荐
相关产品推荐

