Laravel集成Braintree提交支付报错:金额格式无效/无法识别支付方式
Laravel集成Braintree赞助支付报错修复方案
报错根因分析
你收到的报错包含两个问题触发点:
- 金额字段为空/格式不符合Braintree要求
- 支付凭证nonce未正常传递或者金额无效时触发支付方式识别失败
具体修复步骤
1. 修复前后端字段不匹配问题
你视图中的单选框name属性为sponsorships[],但后端checkout逻辑中直接取$request->amount,导致金额变量为空,这是最核心的问题。
直接修改视图文件中单选框的定义即可,同时增加必填校验防止未选套餐提交:
<!-- 原代码 --> <input type="radio" name="sponsorships[]" id="sponsorships-{{ $sponsorship->id }}" value="{{ $sponsorship->price }}"> <!-- 修改后代码 --> <input type="radio" name="amount" id="sponsorships-{{ $sponsorship->id }}" value="{{ $sponsorship->price }}" required>
如果你需要保留原数组命名,也可以修改后端取值逻辑:
// 原代码 $amount = $request->amount; // 修改后代码 $amount = $request->sponsorships[0];
2. 增加金额格式校验与格式化
Braintree要求金额为保留两位小数的数字字符串,你可以在后端获取金额后增加如下处理:
$amount = $request->amount; // 新增校验与格式化 if (!is_numeric($amount) || (float)$amount <= 0) { return back()->withErrors('请选择有效的赞助套餐'); } $amount = number_format((float)$amount, 2, '.', '');
3. 优化Braintree初始化逻辑(可选)
你当前在三个位置重复写了Braintree网关初始化代码,且混用了config和env读取配置,env缓存后直接读取env会返回空值,建议统一用config读取:
// 统一初始化方式 $gateway = new Braintree\Gateway(config('services.braintree'));
4. 排查支付凭证是否正常生成(可选)
如果修复以上问题后仍提示无法识别支付方式,可以在前端JS的requestPaymentMethod回调中增加日志,确认nonce正常生成:
instance.requestPaymentMethod(function (err, payload) { if (err) { console.log('Request Payment Method Error', err); return; } // 新增打印确认nonce存在 console.log('Payment nonce:', payload.nonce); document.querySelector('#nonce').value = payload.nonce; form.submit(); });
内容的提问来源于stack exchange,提问作者D.D.
相关产品推荐
相关产品推荐

