You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Postman直连接口正常,PHP转发接口返回401凭证错误排查

问题:PHP转发Webhook请求返回401凭证错误(Postman直接请求正常)

我在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}"

排查与解决方向

  1. 修复脚本语法错误
    脚本中构造$content的代码末尾多了一行多余的}';,这会直接导致PHP语法解析错误,可能使后续CURL请求的配置逻辑未正常执行。需立即删除该行代码。

  2. 匹配请求头字段大小写
    部分API对请求头字段名的大小写敏感,请对比Postman直接请求时的请求头(可通过Postman Console查看详情),确保PHP脚本中设置的USERNAME、PASSWORD、ACCOUNT_CODE字段名与Postman中的完全一致(比如是否是首字母大写的Username而非全大写)。

  3. 改用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
        ]
    ]);
    
  4. 补充遗漏的请求头
    检查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" 
    ) );
    
  5. 统一URL格式
    确认Postman直接请求的URL是否与脚本中的$url一致(比如是否包含末尾斜杠),部分API会将带斜杠和不带斜杠的URL视为不同端点,导致认证失败。


内容的提问来源于stack exchange,提问作者John Beasley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 09:37:10