我正在 Postman 中研究 Webhook API。
在 Postman 中,我在 Headers 中输入了用户名、密码和帐户代码。然后我将以下有效负载直接发送到网站的端点:
{
"email": "[email protected]",
"overwrite": true,
"fields": {
"first_name": "John",
"last_name": "Doe",
"country": "Chile",
"mrc_c3": "300.00",
"mrc_date_c3": "10/16/24"
}
}
使用上述方法,我得到了 200 OK 响应。
我可以登录网站并查看更新。
当我尝试将相同的有效负载发送到 PHP 脚本端点时出现了问题。
在 PHP 端点内,我能够提取与上述相同的有效负载,并将每个参数设置为它自己的 PHP 变量。
在 PHP 脚本端点内,我手动设置用户名、密码和帐户代码。
回到 Postman,我随后仅将有效负载发送到 PHP 脚本端点。
我在 Postman 中收到 200 OK 响应,但在响应正文中,我回显了状态,并收到了 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; // <-- print the status in Postman
curl_close( $curl );
$response = json_decode( $json_response, true );
?>
让我重申一下,我从 Postman 本身获得了 200 OK 响应,但是当我从 PHP 脚本内部打印出状态时,我获得了 401 响应。
屏幕截图供参考:
PHP 脚本中的凭据确实正确。所以我不确定为什么我会收到 401 响应。
请帮忙。
当我将 json_decode 更改为 json_encode 时,我可以像这样 print_r 有效负载:
print_r($payload);
它在 Postman 中的显示如下:
"{\n \"email\": \"[email protected]\",\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}"
好的,您遇到的问题可能与 curl_setopt() 函数中传递凭据的方式有关。以下是主要问题:
在 curl_setopt( $curl, CURLOPT_HTTPHEADER, array(...) ) 部分中,您直接传递了 $xun、$xpw 和 $xac,但这不起作用。您需要将它们作为实际标头的一部分包含在内。
通常,用户名、密码和帐户代码等凭据要么以特定格式(如基本身份验证的授权标头)在标头中发送,要么作为请求正文的一部分发送。假设您想将它们作为标头传递,则应明确设置标头。以下是如何修改脚本以正确添加凭据: