Ошибка аутентификации API TDAmeritrade: не удалось разрешить переменную ключа API request.header.un - PullRequest
1 голос
/ 20 февраля 2020

Мне трудно получить токен доступа из конечной точки токена с помощью PHP (https://developer.tdameritrade.com/authentication/apis/post/token-0)

В частности, я получаю следующую ошибку:

{"error": "Не удалось разрешить переменную ключа API request.header.un"}

Мой запрос с использованием PHP:

  $url = 'https://api.tdameritrade.com/v1/oauth2/token';

  $client_id = $customer_key ;

   $redirect_uri = $redirect_URL;
  $myvars = array("grant_type" => "authorization_code"
                  , "access_type" => "offline"
                  , "client_id" => $client_id
                   , "redirect_uri" => $redirect_URL
                  , "code" => "$code");

  $ch = curl_init( $url );
  curl_setopt( $ch, CURLOPT_POST, 1);
  curl_setopt( $ch, CURLOPT_POSTFIELDS, $myvars);
  curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
  curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt( $ch, CURLOPT_VERBOSE, 1);
  curl_setopt( $ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/x-www-form-urlencoded; charset=utf-8'

          ));

  $response = curl_exec( $ch );
  echo "<br>token = '$response'\n";

}

Спасибо!

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

ОК, я наконец-то получил рабочий PHP скрипт, который аутентифицируется в TD API и получает информацию об учетной записи. Я хотел бы поделиться этим со всеми, потому что я не мог понять, как заставить это работать после почти трех месяцев. Отдельное спасибо Ninet3 за помощь. Вы можете направлять вопросы в его профиль Fiverr (https://www.fiverr.com/ninety3)

$redirect_URL = 'https://YourURL.com';
$redirect_URL = urlencode($redirect_URL);
$customer_key = 'XXXXXXXXXXXXXXXXXXXX';
$account_number = '1234567890';

$url_endpoint = 'https://auth.tdameritrade.com/auth?response_type=code&redirect_uri='.$redirect_URL. '&client_id='.$customer_key.'%40AMER.OAUTHAP';

if(NULL === @$_GET['code']) {
    header("Location: $url_endpoint");//open TD website to get tokens
}


if($_GET['code'] !== '') {
    $code = $_GET['code'];

    $code = urlencode($code);
    if($code){
        $curl = curl_init();

        curl_setopt_array($curl, array(
            CURLOPT_URL => 'https://api.tdameritrade.com/v1/oauth2/token',
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 0, CURLOPT_HEADER  => false,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_CUSTOMREQUEST => 'POST',
            CURLOPT_HTTPHEADER => array('Content-Type: application/x-www-form-urlencoded',
            ),
            CURLOPT_POSTFIELDS => 'grant_type=authorization_code&refresh_token=&access_type=offline&code='.$code.'&client_id='.$customer_key.'&redirect_uri='.$redirect_URL,
        ));

        $response = curl_exec($curl);

        curl_close($curl);
        $response = (json_decode($response, true));
                echo '<pre>';
                echo 'access_token: <br>';
                print_r($response );


 //Get account information      
        if(@$response['access_token'] !== null){
            $acc = $account_number;
            $curl = curl_init();

            curl_setopt_array($curl, array(
                CURLOPT_URL => 'https://api.tdameritrade.com/v1/accounts/'.$acc,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => "",
                CURLOPT_MAXREDIRS => 10,
                CURLOPT_TIMEOUT => 0,
                CURLOPT_FOLLOWLOCATION => true,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => 'GET',
                CURLOPT_HTTPHEADER => array(
                    'Authorization: Bearer '.$response['access_token'],
                ),
            ));

            $response = curl_exec($curl);

            curl_close($curl);
            echo '<pre>'.$response;

        }else{
            echo 'unable to get access token'; exit;
        }
    }
    else{
        echo 'No Code Found'; exit;
    }
}else{
    echo 'No Code Found'; exit;
}

. Вам нужно будет сохранить токен в базе данных и обновить sh, чтобы получить новый после время истекает.

0 голосов
/ 29 марта 2020

Я нашел эту страницу, когда получил точно такое же сообщение об ошибке. Я наконец понял это после довольно многих попыток и отступил несколько раз. Самое большое отличие от того, что вы опубликовали, заключается в том, что когда вы используете заголовок: "Content-Type: application/x-www-form-urlencoded", какой TD хочет для этого API, вам нужно превратить массив $myvars в строку, подобную следующей:

$myvars = "grant_type=authorization_code&access_type=offline&code=".$code."&client_id=".$client_id."&redirect_uri=".urlencode($redirect_uri);

Другое примечание - это функция urlencode, которая помогает url-кодированию строки. Об этом говорится в разделе «Примечания» этой страницы:

https://www.php.net/manual/en/function.curl-setopt.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...