Laravel 8集成Stripe支付网关报错Must provide source or customer如何解决?
错误根因
Stripe触发「Must provide source or customer」报错的核心是调用Stripe\Charge::create方法时,传入的source参数值为空,结合你提供的控制器代码,具体可能的触发场景如下:
- 前端
stripe支付页面未正确生成stripeToken参数,没有将该参数随表单提交到stripePost接口,导致$request->stripeToken返回空值 - 前端提交的请求参数中
stripeToken字段名拼写错误,后端无法读取到对应值 - 你使用的Stripe前端JS SDK版本和后端Stripe SDK版本不匹配,导致生成的token格式异常无法被后端识别
修复方案
1. 新增请求参数校验
在调用Stripe接口之前先校验stripeToken是否存在,拦截无效请求直接返回报错,同时添加异常捕获逻辑避免系统直接抛出错误:
public function stripePost(Request $request) { // 新增参数校验 $validated = $request->validate([ 'stripeToken' => 'required|string' ]); Stripe\Stripe::setApiKey(env('STRIPE_SECRET')); try { Stripe\Charge::create ([ "amount" => 100*100, "currency" => "INR", "source" => $validated['stripeToken'], "description" => "This payment is testing purpose of websolutionstuff.com", ]); Session::flash('success', 'Payment Successful !'); } catch (\Exception $e) { Session::flash('error', $e->getMessage()); } return back(); }
2. 检查前端stripe页面配置
确保前端页面引入了正确的Stripe JS,并且表单提交时会自动生成stripeToken参数随请求提交。如果使用Stripe Elements组件的场景下,要确保JS初始化逻辑执行正常,token生成后会自动插入到表单提交参数中,不会出现空值情况。
3. 兼容性优化建议
如果使用较新版本的Stripe API时,官方已经不再推荐使用Charge接口,建议替换为PaymentIntent接口进行支付流程处理,兼容性和安全性更高。
内容的提问来源于stack exchange,提问作者Abd Hakeem
相关产品推荐
相关产品推荐

