【问题标题】:Localbitcoins authenticated HTTP POST request errorLocalbitcoins 认证的 HTTP POST 请求错误
【发布时间】:2019-01-09 19:36:14
【问题描述】:

我正在尝试向 LocalBitcoins API 服务器发送 POST 请求,但我只收到错误(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/

【问题讨论】:

    标签: excel vba api authentication winhttprequest


    【解决方案1】:

    看来,在解决问题后,必须在 stackoverflow 上发布问题才能获得答案的启示......我意识到我使用的 apikey 只能从服务器读取,所以,自然,不能通过 POST 请求修改服务器数据。创建和使用正确的密钥,具有写入权限,解决了这个问题! 工作代码是:

    Function PrivateLocalBTC(Method As String, endpoint As String, Optional params As String) As String
    'Method "GET', "POST"
    'params format: "argument1=value&argument2=value&...."
    
    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 params
    
    objHTTP.waitForResponse
    PrivateLocalBTC = objHTTP.ResponseText
    Set objHTTP = Nothing
    End Function
    

    唯一的修改是“objHTTP.Send params”。请务必使用正确的 api 密钥!

    【讨论】:

      【解决方案2】:

      我修复了错误号。 41.我修改了这个例子enter link description here 证明有效,(阅读我的注意:cmets 以更好地了解问题出在哪里) 阅读我的注释:cmets。

      <?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>"; 
      ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-19
        • 2017-06-29
        • 1970-01-01
        相关资源
        最近更新 更多