0

我正在尝试使用以下 PHP 代码对 Coinbase 进行身份验证,但我不断收到无效签名错误消息。

鉴于 info() 是一个函数(最终会将其变成一个对象),它获取 API_KEY、API_SECRET、USERAGENT 和 Coinbase 基本 URL(每个都经过测试),并且 get_coinbase_time() 已经过测试以从中获取纪元时间Coinbase,我没有快乐。我的猜测是错误在 $sign 定义的那一行。文档对于如何解决这个问题不是很清楚。有人可以评估我的代码并推荐更改或提供可能有用的代码,我可以从中学习。

谢谢!

<?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;
}
?>
4

2 回答 2

0

我不是专家(只是在努力解决这个问题......)

如果您关心 Coinbase 而不是 CoinbasePro,那么我认为 [the docs that you need][1] 部分说:

CB-ACCESS-SIGN 标头是通过使用 prehash 字符串时间戳 + 方法 + requestPath + 正文(其中 + 表示字符串连接)上的密钥创建 sha256 HMAC 来生成的。时间戳值与 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);}
于 2021-04-16T10:36:31.793 回答
-1

尝试这个:

  $timestamp = time();
  $body = '';
  $message = $timestamp . 'GET' . $path . $body;
  $sign = hash("sha256", COINBASE_SECRET_KEY . $message);
 
于 2021-01-19T02:16:07.100 回答