Estou trabalhando em uma API Webhook no Postman.
No Postman, eu inseri o nome de usuário, senha e código de conta nos Headers. Estou então enviando o payload abaixo diretamente para o endpoint do site:
{
"email": "[email protected]",
"overwrite": true,
"fields": {
"first_name": "John",
"last_name": "Doe",
"country": "Chile",
"mrc_c3": "300.00",
"mrc_date_c3": "10/16/24"
}
}
Usando o acima, estou obtendo uma resposta de 200 OK.
Posso entrar no site e ver as atualizações.
Meu problema ocorre quando tento enviar a mesma carga para um endpoint de script PHP.
Dentro do endpoint PHP, consigo extrair a mesma carga útil acima e definir cada parâmetro para sua própria variável PHP.
No endpoint do script PHP, estou definindo manualmente o nome de usuário, a senha e o código da conta.
De volta ao Postman, envio apenas a carga útil para o ponto de extremidade do script PHP.
Estou recebendo uma resposta 200 OK no Postman, mas no corpo da resposta, estou ecoando o status e estou recebendo um status 401, que me diz que as credenciais de login estão incorretas.
Aqui está o script 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 );
?>
Deixe-me reiterar que estou recebendo uma resposta 200 OK do próprio Postman, mas quando imprimo o status dentro do script PHP, estou recebendo a resposta 401.
Captura de tela para referência:
As credenciais dentro do script PHP estão de fato corretas. Então não tenho certeza do porquê estou recebendo a resposta 401.
Por favor ajude.
Quando altero json_decode para json_encode, posso imprimir o payload assim:
print_r($payload);
E é exibido no Postman assim:
"{\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}"
Ok, o problema que você está enfrentando pode estar relacionado a como as credenciais estão sendo passadas na função curl_setopt(). Aqui está o problema principal:
Na seção curl_setopt( $curl, CURLOPT_HTTPHEADER, array(...) ), você está passando $xun, $xpw e $xac diretamente, mas isso não vai funcionar. Você precisa incluí-los como parte dos cabeçalhos reais.
Normalmente, credenciais como nome de usuário, senha e código de conta são enviadas nos cabeçalhos em um formato específico (como cabeçalho Authorization para autenticação básica) ou como parte do corpo da solicitação. Supondo que você queira passá-los como cabeçalhos, você deve definir os cabeçalhos explicitamente. Veja como modificar seu script para adicionar as credenciais corretamente: