PayPal PHP SDK ^1.13版本实现报错求助(HTTP 400错误)
PayPal PHP SDK v1.13 400错误排查与修复
首先,HTTP 400错误本质是请求格式或参数不符合PayPal API要求,我看了你的代码,发现几个明显的问题,先解决最关键的:
1. 致命错误:setDetails传入了错误的参数
看你代码里的这段:
$amount->setCurrency('USD') ->setTotal($total) ->setDetails($product);
Amount::setDetails()方法要求传入的是PayPal\Api\Details类型的对象,但你传了$product(一个字符串),这直接导致PayPal服务器无法解析你的请求,返回400错误。你需要改成传入之前创建的$details对象:
$amount->setCurrency('USD') ->setTotal($total) ->setDetails($details);
2. 数值不匹配:Total金额必须等于Subtotal+Shipping+Tax的总和
你当前的代码里:
$tax = 2.00; $total = $price + $tax; $details->setShipping($tax) // 这里shipping设成了和tax一样的2.00 ->setSubtotal($price) ->setTax(2.00);
按照PayPal的规则,$amount->setTotal()的数值必须严格等于subtotal + shipping + tax的总和。你现在的$total是$price+2,但details里的总和是$price+2+2,数值不匹配,这也会触发400错误。
你需要根据实际业务调整:
- 如果没有运费,就把
setShipping(0.00),然后$total = $price + $tax - 如果确实有运费,就把
$total改成$price + $shipping + $tax
示例修正:
$tax = 2.00; $shipping = 0.00; // 假设没有运费 $total = $price + $tax + $shipping; $details->setShipping($shipping) ->setSubtotal($price) ->setTax($tax);
3. 优化错误排查:获取PayPal返回的详细错误信息
你的catch块只打印了异常对象,其实PayPalConnectionException包含了API返回的具体错误描述,修改catch代码可以帮你快速定位其他潜在问题:
catch(PayPal\Exception\PayPalConnectionException $ex){ // 打印API返回的JSON格式错误详情 echo $ex->getData(); die(); }
关于SDK版本的问题
你不需要降级SDK,v1.13版本是PayPal REST API v1 SDK的较新版本(虽然v1 SDK已经停止更新,但目前仍能正常调用API)。你的问题完全是代码参数错误导致的,和版本无关,修复上述问题后应该就能正常运行。
内容的提问来源于stack exchange,提问作者Rongiro
相关产品推荐
相关产品推荐

