Postman可运行的PayPal v2订单捕获Curl,PHP调用报400无效请求
问题排查与修复方案
你的PHP代码和Postman的curl请求核心差异在于POST请求体缺失及部分curl选项设置问题,导致PayPal服务器返回broken content-length header错误。以下是具体排查点和修复步骤:
1. 必须提交空JSON请求体
PayPal v2订单捕获接口要求Content-Type: application/json,即便无需业务参数,也必须发送空JSON对象{}。你的curl命令中,curl会自动处理空POST请求的Content-Length,但PHP的curl在设置CURLOPT_POST => true却未指定CURLOPT_POSTFIELDS时,会导致Content-Length头异常,触发服务器的格式错误。
2. 调整CURLOPT_ENCODING设置
CURLOPT_ENCODING => ""会让curl自动添加Accept-Encoding头,但部分服务器对这种自动处理的兼容性不佳。建议显式设置为gzip,deflate,和Postman的默认行为保持一致。
修复后的PHP代码片段
修改curl选项部分,添加空JSON请求体并调整编码设置:
$curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "gzip,deflate", // 显式设置编码格式 CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_POST => true, CURLOPT_POSTFIELDS => "{}", // 添加空JSON请求体 CURLOPT_HTTPHEADER => array( "Authorization: Bearer " . $accessToken, "Content-Type: application/json", "PayPal-Request-Id: " . uniqid(), "Prefer: return=representation", "PayPal-Client-Metadata-Id: " . time() . "-" . $orderID ), ));
额外验证点
- 确认
generateAccessToken.php返回的token有效,且与Postman使用的环境(沙箱/生产)一致。 - 检查
$orderID是否正确传递,无特殊字符或URL编码问题(可使用urlencode($orderID)确保URL格式合规)。
内容的提问来源于stack exchange,提问作者DavMar
相关产品推荐
相关产品推荐

