PHP中的Coinkite API签名不匹配

时间:2014-12-20 18:12:16

标签: php api curl

没有关于这个或任何样本的文档可供探索,所以我卡住了我的头发。要连接到Coinkite API,我需要发送三个创建签名的标头。我可以用相同的结果重新创建他们的测试签名。所以现在当我实际发送签名以获得json时,我收到了身份验证错误。

{ "help_msg": "Bad signature for endpoint: /v1/my/self", "message": "Unauthorized", "status": 401 }

这是我的代码:

date_default_timezone_set('UTC');
function sign($endpoint, $force_ts=false) 
{
$API_KEY = 'xxxx';
$API_SECRET = 'xxx';
if($force_ts) {
    $ts = $force_ts;
} else {
    $now = new DateTime();
    $ts = $now->format(DateTime::ISO8601);
}
$data = $endpoint . '|' . $ts;
$hm = hash_hmac('sha256', $data, $API_SECRET);
return array($hm, $ts);
}
$sign = (sign('/v1/my/self'));

$ch = curl_init('https://api.coinkite.com/v1/my/self');
curl_setopt($ch,CURLOPT_HTTPHEADER,array('X-CK-Key: {$API_KEY}', 'X-CK-Sign: {$sign[0]}', 'X-CK- Timestamp: {$sign[1]}'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);

echo $result;

我唯一改变的是标题符号和时间戳变量。 $ hm和$ ts会给标题符号和时间戳值太短的错误,所以我从$ sign给它们数组以使它工作,但我现在正在创建一个“错误的签名。”

如何发送所需的项目以使签名进行身份验证?

1 个答案:

答案 0 :(得分:1)

我运行了你的程序,第一次打印出来了:

{
  "help_msg": "Header field is missing: X-CK-Timestamp",
  "message": "Unauthorized",
  "status": 401
}

所以我注意到X-CK-和Timestamp之间有一个额外的空间。纠正错字,但它仍然失败...所以我添加了一行:

curl_setopt($ch, CURLOPT_VERBOSE, 1);

..现在它打印正在发送的标头。他们有{}和$签到...而不是你想要的值。就我而言。希望它有所帮助!

PS:一旦你开始工作,你必须撤销这个密钥!现在全世界都知道你已经在这里发布了它。任何人都可以拿走您的资金或至少弄乱您的帐户。