Почему код curl не выполняется в скрипте PHP? (Сервер WAMP) - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь получить токен для использования Microsoft Graph API (https://docs.microsoft.com/en-us/graph/auth-v2-user?context=graph%2Fapi%2F1.0&view=graph-rest-1.0) через Curl. Я настроил простой файл Php с этой функцией:

function getToken() {
echo "start gettoken";
var_dump(extension_loaded('curl'));
$jsonStr = http_build_query(Array(
    "client_id" => "***",
    "scope" => "https://graph.microsoft.com/.default",
    "client_secret" => "***",
    "grant_type" => "client_credentials"
));
$headers = Array("Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($jsonStr));

$ch = curl_init("https://login.microsoftonline.com/***.onmicrosoft.com/oauth2/v2.0/token");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonStr);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$token = curl_exec($ch);
echo "test after curl";

return $token;

curl_error($ch);

 }

Однако, чтоЯ хочу знать, почему запрос curl не работает. Также эхо после кодового блока curl не выполняется, в то время как 'start gettoken' есть. PHP_curl включен в моем WAMP. Почему это?

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

вы отправляете запрос токена в формате JSON, а затем врете серверу, что он application/x-www-form-urlencoded закодирован, а фактически application/json закодирован! поскольку эти 2 формата полностью несовместимы, сервер не может их проанализировать, и ... в идеале он должен был ответить HTTP 400 bad request (поскольку ваш запрос не может быть проанализирован как x-www-form-urlencoded)

во всяком случае, чтобы на самом деле отправить его в формате application/x-www-form-urlencoded, замените json_encode () на http_build_query ()

и избавьтесь от заголовка "Content-Length:", его легко испортить (он также подвержен ошибкам)) если вы делаете это вручную (и действительно, вы все испортили! между : и числом должен быть пробел, вы не добавляли пробел, но обычная ошибка - неправильная длина), но если вы не сделаете это вручную, то curl автоматически создаст для вас заголовок, который не подвержен ошибкам.

0 голосов
/ 08 октября 2019

Вы уверены, что CURL включен, потому что тот код, который вы опубликовали, в порядке и дает эхо-ответ до и после выполнения curl.

...