我正在 Postman 中开发 Webhook API。
在 Postman 中,我在标题中输入了用户名、密码和帐户代码。 然后,我将以下有效负载直接发送到网站的端点:
{
"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 = mysqli_real_escape_string($db, $payload["email"] ?? '');
$firstName = mysqli_real_escape_string($db, $payload['fields']['first_name'] ?? '');
$lastName = mysqli_real_escape_string($db, $payload['fields']['last_name'] ?? '');
$country = mysqli_real_escape_string($db, $payload['fields']['country'] ?? '');
$mrc_c3 = mysqli_real_escape_string($db, $payload['fields']['mrc_c3'] ?? '');
$mrc_date_c3 = mysqli_real_escape_string($db, $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",
$xun,
$xpw,
$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 回复。
请帮忙。
好的,您面临的问题可能与在curl_setopt() 函数中传递凭据的方式有关。主要问题是:
在curl_setopt( $curl, CURLOPT_HTTPHEADER, array(...) ) 部分中,您直接传递$xun、$xpw 和$xac,但这不起作用。您需要将它们作为实际标头的一部分包含在内。
通常,用户名、密码和帐户代码等凭据要么以特定格式(如基本身份验证的授权标头)在标头中发送,要么作为请求正文的一部分发送。假设您想将它们作为标头传递,则应该显式设置标头。以下是如何修改脚本以正确添加凭据:
$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 );