excel - Localbitcoins 认证的 HTTP POST 请求错误
问题描述
我正在尝试将 POST 请求发送到 LocalBitcoins API 服务器,但我只收到错误(41 和 43),尽管 GET 请求即使使用参数(参数)也能正常工作。
Sub initrequest()
'this is a POST request with no arguments that results in error
JsonResponse = PrivateLocalBTC("POST", "/api/notifications/mark_as_read/9b9c2b5a16a3/")
'this is a GET request, with "ads=.." parameter, that works
'JsonResponse = PrivateLocalBTC("GET", "/api/ad-get/", "ads=771318")
Debug.Print JsonResponse
End Sub
并且有 HTTP 请求子:
Function PrivateLocalBTC(Method As String, endpoint As String, Optional params As String) As String
Dim NonceUnique As String
NonceUnique = CreateNonce(13)
TradeApiSite = "https://localbitcoins.com"
apikey = "..............."
secretkey = "............"
Message = NonceUnique & apikey & endpoint & params
apisign = ComputeHash_C("SHA256", Message, secretkey, "STRHEX")
If params <> "" Then urlparams = "?" & params
Url = TradeApiSite & endpoint & urlparams
Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
objHTTP.Open Method, Url, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
objHTTP.setRequestHeader "Apiauth-Key", apikey
objHTTP.setRequestHeader "Apiauth-Nonce", NonceUnique
objHTTP.setRequestHeader "Apiauth-Signature", apisign
objHTTP.Send ("")
objHTTP.waitForResponse
PrivateLocalBTC = objHTTP.ResponseText
Set objHTTP = Nothing
End Function
我尝试了许多变体,将端点、nonce、apikey 放在 .Send command 、urlencoding 的请求正文中,但没有得到肯定的结果。
ComputeHash_C、CreateNonce 是独立的函数。该代码的灵感来自于https://github.com/krijnsent/crypto_vba的伟大共享工作!
LocalBitcoins API 文档在这里:https ://localbitcoins.com/api-docs/
解决方案
我修复了错误号。41. 我修改了这个例子,在此处输入链接描述 以显示它有效,(阅读我的注:评论以更好地理解问题出在哪里)阅读我的注:评论。
<?php
function localbitcoins_query($path, array $req = Array()) {
$key='yourkey';
$secret='yoursecret';
$array_mt = explode(' ', microtime());
$nonce = $array_mt[1].substr($array_mt[0], 2, 6);
$get = "";
if ($req) {
$get=http_build_query($req);
}
$postdata=$nonce.$key.$path.$get; // NOTE: here $postdata goes without '?' char before the parameters!
$sign = strtoupper(hash_hmac('sha256', $postdata, $secret));
$headers = array(
'Apiauth-Signature:'.$sign,
'Apiauth-Key:'.$key,
'Apiauth-Nonce:'.$nonce
);
$ch = null;
$ch = curl_init('https://localbitcoins.com'.$path.( $get=="" ? "" : "?".$get)); // NOTE: here it's necesary '?' char before the parameters!
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
$res = curl_exec($ch);
if ($res === false) throw new Exception('Curl error: '.curlerror($ch));
$dec = json_decode($res, true);
if (!$dec) throw new Exception('Invalid data: '.$res);
curl_close($ch);
return $dec;
}
$getinfo = array();
$api_endpoint = '/api/dashboard/closed/';
$array_params = array( "order_by" => "-closed_at"
, "start_at" => "2019-08-14 18:00:26+00:00"
);
$getinfo = localbitcoins_query($api_endpoint,$array_params);
echo "<pre>"; print_r($getinfo); echo "</pre>";
?>
推荐阅读
- c# - 结构不是 protobuf-net 中有效的接口子类型
- c++ - 覆盖向量中的元素而不指定特定元素
- python - Selenium Python 错误“对象没有属性驱动程序”
- javascript - 有没有办法将谷歌业务评论添加到 AMP 网站
- google-cloud-platform - GKE 将标准地区集群迁移到自动驾驶模式集群
- java - Firebase 实时数据库获取活动中的 java.lang.NullPointerException
- png - 如何让我的代码删除图像源中 .png 之后的内容?
- node.js - 使用 Graphql 上传文件时遇到问题
- scikit-learn - 用随机森林计算 ROC AUC
- python - 为什么我可以访问阅读器对象,即使它在范围之外