php – 我如何与Coinbase的API进行交互?为什么总是失败?

访问Coinbase API过去非常简单:您只需要一个API密钥即可.现在你需要一种叫做“nonce”和“signature”的东西.我在我的请求中传递了新的API“Secret”,nonce和Key,但它返回了“invalid_key”错误.是什么赋予了?

编辑3月12日:Added a tutorial on interacting with the API via OAuth.

解决方法:

事实上,API曾经如此简单 – 只需要一个密钥 – 意味着它非常不安全.所以他们在一周前加强了安全性.这是博客文章:

http://blog.coinbase.com/post/75936737678/more-security-and-granular-control-with-the-new-api

除了API密钥之外,每个人现在都获得API“秘密”.每当您向API发出请求时,都必须包含三个参数:

>您的API密钥.
>“nonce”,这是一个用于识别内容的唯一编号.在这种情况下,您所做的每个请求都需要一个新的数字,并且每个请求的nonce必须大于之前的那个.
>您的API“签名”.这不是你的API“秘密”.

签名是您的随机数,紧接着是您发布请求,参数和所有内容的完整URL.这个URL也包含nonce,所以整个过程看起来像这样:

?12345https://coinbase.com/api/v1/buttons随机数= 12345&放大器;名称=袜子和放大器;价格= 9.95

然后你把整个事情编码为“SHA256”哈希.如果您不知道这意味着什么,请不要惊慌 – 您可以使用PHP已经内置的函数在一行中完成.

无论如何,我在解决所有这些问题时遇到了一些麻烦,所以我花了一些时间来整理这个脚本,这使得对API的GETing和POSTing非常容易.我很想听听别人的想法!

<?php

function coinbaseRequest($what,$getOrPost,$parameters){

//Obviously, your API Key and Secret go here.
$apikey = "blahblahblah";
$apisecret = "blahblahblahblah";    
$nonce = file_get_contents("nonce.txt") + 1;
file_put_contents("nonce.txt", $nonce, LOCK_EX);

$url = "https://coinbase.com/api/v1/" . $what . "?nonce=" . $nonce;

if($parameters != ""){
$parameters = http_build_query(json_decode($parameters), true);
}

//Here I go, hashing the Signature! Thanks, PHP, for making this easy!

$signature = hash_hmac("sha256", $nonce . $url . $parameters, $apisecret);

$ch = curl_init();

curl_setopt_array($ch, array(
    CURLOPT_URL => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => array(
        "ACCESS_KEY: " . $apikey,
        "ACCESS_NONCE: " . $nonce,
        "ACCESS_SIGNATURE: " . $signature
    )));

if($getOrPost == "post"){
curl_setopt_array($ch, array(
    CURLOPT_POSTFIELDS => $parameters,
    CURLOPT_POST => true,
));
}

$results = curl_exec($ch);
curl_close($ch);

echo $results;
}

//This is a POST example.
coinbaseRequest("buttons", "post", '{
    "button": {
    "name": "test",
    "price_string": "1.23",
    "price_currency_iso": "USD",
    "variable_price": true
    }
}');


//This is a GET example.
coinbaseRequest("account/balance", "get", false);

?>

笔记:

>我尝试使用(microtime(true)* 100)为我的nonces.问题是它产生一个十进制数字,最后几位数字一直被删除或舍入,所以它不起作用.然后我想,“拧这个”,制作一个空白的nonce.txt文件,并在其中写入1,并获得nonce我刚刚获得该文件的内容,添加1,并用新数字替换该文件.它作为一个计数器提供了第二个目的,显示了我提出的总请求数量.

但后来有人向我指出了PHP的“uniqid”函数,该函数根据当前的microtime生成一个ID.所以你也可以尝试这个:

$nonce = hexdec(uniqid());

这具有不访问外部文件的优点.我实际上真的很想看到我做了多少请求,因此可能会坚持使用(坏)nonce.txt方法.
> coinbaseRequest()函数有三个参数.第一个是您提出请求的目录 – 也就是说,“https://coinbase.com/api/v1/”之后的任何内容.第二个参数是“get”或“post”,具体取决于它是GET还是POST请求. (合理?)

第三个参数是您在请求中传递的所有查询.这应格式化为JSON,除非它是一个不带任何参数的GET请求(除了函数包含的Key,Nonce和Signature),在这种情况下你应该将其保留为false.

编辑,3月3日:

我做了一个小函数,用于获取coinbaseRequest返回的任何内容并将其转换为按钮:

function makebutt($data){

$data = json_decode($data,true);
$buttoncode = $data["button"]["code"];

return ("<a class=\"coinbase-button\" data-code=\"" . $buttoncode . "\" href=\"https://coinbase.com/checkouts/" . $buttoncode . "\">Pay With Bitcoin</a><script src=\"https://coinbase.com/assets/button.js\" type=\"text/javascript\"></script>");
}
上一篇:php – 比特币钱包交易回调


下一篇:php – 为什么walletnotify发生三次?