0

我正在使用 C++ 和 libcurl 编写一个程序来与一些 API 交互,但在标题中添加身份验证信息时我被卡住了。我是 libcurl 和 API 的新手,具有 C++ 的基本知识。身份验证需要一个 API 密钥和一个使用 HMAC_SHA256 散列的随机数,然后将它们中的每一个都放在标头中。然后发送一个非常简单的 JSON 消息。我已经尝试通过这个站点进行搜索,但大多数示例似乎都在 javascript 或命令行中,我没有在其中看到任何相关的答案。

当我将 POST 消息发送到服务器时,我收到响应 402 - Invalid ApiKey。我的 API 密钥是 100% 正确的,所以我怀疑这与格式或我将其包含在标题中的方式有​​关。该网站是 BlinkTrade,他们的文档在这里,提供了一些关于标头要求的信息。

下面的代码片段:

char* message="{\"MsgType\": \"U2\",\"BalanceReqID\": 1}";
curl_easy_setopt(curl, CURLOPT_URL, "https://api.blinktrade.com/tapi/v1/message");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, pFile2);
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, message);

struct curl_slist *header = NULL;
header = curl_slist_append(header, "APIKey:0000000000000000000000000000000000000000");    
header = curl_slist_append(header, "Nonce:1");
header = curl_slist_append(header, "Signature:1");
header = curl_slist_append(header, "Content-Type:application/json");
transfer = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header);
cout << transfer << endl;

transfer = curl_easy_perform(curl);
cout << transfer << endl;

我得到 curl_easy_setopt 和 curl_easy_perform 的返回码 0。我已经将 API 密钥中的实际字符换成了 0 的负载,但除此之外,在格式等方面一切都是相同的。我实际上并没有使用散列签名,我会在整理好这个之后再做错误。我尝试在冒号后添加一个空格并将字符串和/或值括在双引号中,但我得到了相同的响应。我做错了什么,这意味着我的标头实际上没有被服务器识别?

4

1 回答 1

0

已解决:Blinktrade 服务器不是在您的 API 密钥不正确时返回“Invalid APIKey”,而是在签名不正确时返回。一个相当烦人的错误标签。

于 2017-10-06T22:09:22.337 回答