Postman直连接口正常,PHP转发接口返回401凭证错误排查
我在Postman中开发Webhook API时,直接将username、password、account code填入请求头,发送以下Payload到网站端点,能收到200 OK响应,网站也能正常更新数据:
{ "email": "myemail@yahoo.com", "overwrite": true, "fields": { "first_name": "John", "last_name": "Doe", "country": "Chile", "mrc_c3": "300.00", "mrc_date_c3": "10/16/24" } }
但将相同Payload发送到PHP脚本端点时出现异常:PHP可正常提取Payload并赋值变量,脚本内已手动设置正确的凭证,Postman发送请求到PHP端点后收到200响应,但脚本转发请求到原网站端点时返回401(凭证错误)。
附上PHP脚本:
<?php $payload = json_decode(file_get_contents("php://input"), true); $email = $payload["email"]; $firstName = $payload['fields']['first_name']; $lastName = $payload['fields']['last_name']; $country = $payload['fields']['country']; $mrc_c3 = $payload['fields']['mrc_c3']; $mrc_date_c3 = $payload['fields']['mrc_date_c3']; $url = "https://original.endpoint.com/"; $xun = "USERNAME"; $xpw = "PASSWORD"; $xac = "ACCOUNT CODE"; $content = '{ "email": "' . $email . '", "overwrite": true, "fields": { "first_name": "' . $firstName . '", "last_name": "'.$lastName.'", "country": "' . $country . '", "mrc_c3": "' . $mrc_c3 . '", "mrc_date_c3": "' . $mrc_date_c3 . '" } }'; }'; // 此处存在多余的语法错误代码 $curl = curl_init( $url ); curl_setopt( $curl, CURLOPT_HEADER, false ); curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $curl, CURLOPT_HTTPHEADER, array( "Content-type: application/json", "USERNAME: $xun", "PASSWORD: $xpw", "ACCOUNT_CODE: $xac" ) ); curl_setopt( $curl, CURLOPT_POST, true ); curl_setopt( $curl, CURLOPT_POSTFIELDS, $content ); $json_response = curl_exec( $curl ); $status = curl_getinfo( $curl, CURLINFO_HTTP_CODE ); if ( $status != 200 && $status != 201 ) { error_log( "Error: call to URL $url failed with status $status, response $json_response, curl_error " . curl_error( $curl ) . ", curl_errno " . curl_errno( $curl ) ); } echo "status: " . $status; // 在Postman中打印状态 curl_close( $curl ); $response = json_decode( $json_response, true ); ?>
补充信息:我曾将json_decode改为json_encode后执行print_r($payload),Postman显示内容如下:
"{\n \"email\": \"myemail@yahoo.com\",\n \"overwrite\": true,\n \"fields\": {\n \"first_name\": \"John\",\n \"last_name\": \"Doe\",\n \"country\": \"Chile\",\n \"mrc_c3\": \"300.00\",\n \"mrc_date_c3\": \"10\/16\/24\"\n }\n}"
排查与解决方向
修复脚本语法错误
脚本中构造$content的代码末尾多了一行多余的}';,这会直接导致PHP语法解析错误,可能使后续CURL请求的配置逻辑未正常执行。需立即删除该行代码。匹配请求头字段大小写
部分API对请求头字段名的大小写敏感,请对比Postman直接请求时的请求头(可通过Postman Console查看详情),确保PHP脚本中设置的USERNAME、PASSWORD、ACCOUNT_CODE字段名与Postman中的完全一致(比如是否是首字母大写的Username而非全大写)。改用
json_encode构造Payload
手动拼接JSON字符串容易因变量含特殊字符(如引号、反斜杠)导致格式错误,部分API会因此返回401。建议替换为json_encode生成标准JSON:$content = json_encode([ "email" => $email, "overwrite" => true, "fields" => [ "first_name" => $firstName, "last_name" => $lastName, "country" => $country, "mrc_c3" => $mrc_c3, "mrc_date_c3" => $mrc_date_c3 ] ]);补充遗漏的请求头
检查Postman直接请求时的完整请求头,若存在Accept、User-Agent等字段,需在PHP的CURL请求中添加对应头信息,部分API会验证这些字段,缺少则返回认证失败:curl_setopt( $curl, CURLOPT_HTTPHEADER, array( "Content-type: application/json", "Accept: application/json", "USERNAME: $xun", "PASSWORD: $xpw", "ACCOUNT_CODE: $xac" ) );统一URL格式
确认Postman直接请求的URL是否与脚本中的$url一致(比如是否包含末尾斜杠),部分API会将带斜杠和不带斜杠的URL视为不同端点,导致认证失败。
内容的提问来源于stack exchange,提问作者John Beasley

