PHP-код не проходит аутентификацию с 23andme API

<?php

$client_id = "XXXXXXXXX1";
$client_secret = "XXXXXXXXXX2";
$redirect_URI = "XXXXXXXXX3";
$auth_code = htmlspecialchars($_GET["code"]);

$post_field_array = array(
'client_id'     => $client_id,
'client_secret' => $client_secret,
'grant_type'    => 'authorization_code',
'code'          => $auth_code,
'redirect_uri'  => $redirect_uri,
'scope'         => 'basic genomes');

$post_fields = '';
foreach ($post_field_array as $key => $value)
$post_fields .= "$key=" . urlencode($value) . '&';
$post_fields = rtrim($post_fields, '&');

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.23andme.com/token/');
curl_setopt($ch, CURLOPT_POST, count($post_field_array));
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$encoded_json = curl_exec($ch);

$response = json_decode($encoded_json, true);
$access_token = $response['access_token'];

print $access_token;
?>

Этот скрипт запускается с того же URL, что и $ redirect_URI, в соответствии со спецификациями API 23andMe (https://api.23andme.com/docs/authentication/). Однако, что бы я ни пытался, скрипт просто ничего не выводит. Что я здесь не так делаю?

0

Решение

Я не знаю, почему это не работает, но я бы посоветовал вам сделать некоторую отладку. Начать с

print_r($encoded_json)

(или используйте var_dump) и посмотрите, что может быть на выходе. Сбой curl_exec?

Попробуйте установить флаг verbose для curl и посмотрите, не вызовет ли это какие-либо ошибки (предупреждения), которые могут подтолкнуть вас к проблеме

curl_setopt($ch, CURLOPT_VERBOSE, true);
0

Другие решения

Во-первых, я получаю эти 3 уведомления,
код не существует, если я не передам его в строку запроса, redirect_uri имеет разные регистры в обоих случаях, вероятно, access_token не существует, потому что произошла ошибка аутентификации

Примечание: неопределенный индекс: код в test.php в строке 6

Примечание: неопределенная переменная: redirect_uri в test.php в строке 13

Примечание: неопределенный индекс: access_token в test.php в строке 29

<?php

$client_id = "XXXXXXXXX1";
$client_secret = "XXXXXXXXXX2";
$redirect_uri = "XXXXXXXXX3";  // FIXED VARIABLE NAMING HERE
$auth_code = htmlspecialchars($_GET["code"]);

$post_field_array = array(
'client_id'     => $client_id,
'client_secret' => $client_secret,
'grant_type'    => 'authorization_code',
'code'          => $auth_code,
'redirect_uri'  => $redirect_uri,
'scope'         => 'basic genomes');

$post_fields = '';
foreach ($post_field_array as $key => $value)
$post_fields .= "$key=" . urlencode($value) . '&';
$post_fields = rtrim($post_fields, '&');

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.23andme.com/token/');
curl_setopt($ch, CURLOPT_POST, count($post_field_array));
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$encoded_json = curl_exec($ch);

$response = json_decode($encoded_json, true);

// DUMP RESPONSE IF ERROR OCCURS, ACCESS WON'T EXIST
var_dump($response);

$access_token = $response['access_token'];

print $access_token;
0