Проблема с аутентификацией в Coinbase с помощью PHP с использованием PHP CURL

#php #coinbase-api #coinbase-php

#php #coinbase-api #coinbase-php

Вопрос:

Я пытаюсь пройти аутентификацию в Coinbase, используя следующий PHP-код, и я продолжаю получать сообщение об ошибке с недопустимой подписью.

Учитывая, что info() является функцией (в конечном итоге превратит ее в объект), которая получает API_KEY, API_SECRET, USERAGENT и базовый URL-адрес Coinbase (каждый протестирован), и что get_coinbase_time(), который был протестирован для получения времени эпохи из Coinbase, я не испытываю радости. Я предполагаю, что ошибка находится в строке, где определен знак $. В документах не очень ясно, как решить эту проблему. Может кто-нибудь оценить мой код и порекомендовать изменения или предложить код, который может сработать, из которого я могу извлечь уроки.

Спасибо!

 <?php

var_dump(get_coinbase_access('/v2/accounts'));

function get_coinbase_access($path){   
    $data = get_coinbase_time() . 'GET' . $path;
    $sign = hash_hmac("sha256", $data, info('secret'));
    $headers = array();
    $headers[] = 'CB-ACCESS-KEY: ' . info('key');
    $headers[] = 'CB-ACCESS-SIGN: ' . $sign;
    $headers[] = 'CB-ACCESS-TIMESTAMP: ' . get_coinbase_time();
    $headers[] = 'CB-VERSION: 2016-03-08';
    $headers[] = 'Content-Type: application/json';


        $ch= curl_init(info('url') . $path);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_HTTPGET, TRUE);
        curl_setopt($ch, CURLOPT_USERAGENT, info('useragent'));
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        $response = curl_exec($ch);
        $res = json_decode($response, TRUE);
        return $res;
}
?>
 

Ответ №1:

Я не эксперт (просто работаю над этим …)

Если вас интересует Coinbase, а не CoinbasePro, то я думаю, что в разделе [документы, которые вам нужны] [1] говорится:

Заголовок CB-ACCESS-SIGN генерируется путем создания HMAC sha256 с использованием секретного ключа в строке предварительного хэша timestamp method requestPath body (где представляет конкатенацию строк). Значение метки времени совпадает с заголовком CB-ACCESS-TIMESTAMP .

Итак, у вас все в неправильном порядке.

Я думаю, вы могли бы использовать что-то вроде этого:

 function signature($request_path='', $body='', $timestamp, $method='GET') {
  $w= $timestamp.$method.$request_path.$body;
  return hash_hmac("sha256", $w, API_SECRET, false);}
 

Ответ №2:

Попробуйте это:

   $timestamp = time();
  $body = '';
  $message = $timestamp . 'GET' . $path . $body;
  $sign = hash("sha256", COINBASE_SECRET_KEY . $message);