我的项目作为TOR的隐藏服务运行。我的大多数客户都使用TOR浏览器,它不支持开箱即用的JS。我想让我的客户能够使用比特币进行交易,但必须为每个客户生成一个唯一的地址。 CoinKite根据BIP32规范生成HD钱包地址,并允许通过其API请求它们。大多数API示例都使用JS,他们的PHP示例很乱,而且没有很好的文档记录。这是我现在拥有的:
Sign.php - 使用我的API密钥处理签名过程
<?php
date_default_timezone_set('UTC');
function sign($endpoint, $force_ts=false)
{
$API_SECRET = 'xxxxxxxxx-xxxxxxxx-xxxxxxxxxxxxxxxx';
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);
}
?>
Gen.php - 在CK的API上执行PUT并将其输出存储在变量中。
<?php
require('sign.php');
$endpoint='/v1/new/receive';
$url='http://api.gcvqzacplu4veul4.onion'.$endpoint;
$sign = sign($endpoint);
$API_KEY = 'xxxxxxxxx-xxxxxxxx-xxxxxxxxxxxxxxxx';
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HTTPHEADER,array("X-CK-Key: {$API_KEY}", "X-CK-Sign: {$sign[0]}", "X-CK-Timestamp: {$sign[1]}"));
curl_setopt($curl, CURLOPT_HTTPPROXYTUNNEL, 1);
curl_setopt($curl, CURLOPT_PROXY, "localhost:8118");
curl_setopt($curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
$data = array('account' => 'xxxxxxxxxx-xxxxxx', 'amount' => 0.1);
$data = json_encode($data);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($curl);
curl_close($curl);
echo $result;
?>
回复
{ "help_msg": "Unexpected arg(s): {\"account\":\"xxxxxxxxxx-xxxxxx\",\"amount\":0.1}", "message": "Bad Request", "status": 400 }
我已经在这个问题上摸不着头几天了。 CoinKite的调试界面除了我得到的响应之外没有显示任何信息。非常感谢任何帮助。
答案 0 :(得分:0)
现在几乎想给自己打个招呼。由于CoinKite返回一个JSON流,我错误地认为它也想要收到一个。对于遇到同样问题的其他人:省略“$ data = json_encode($ data);”行,你很高兴。