PHP實現BitMEX API POST方式委託掛單

wangsys發表於2021-09-09

這個功能的實現再一次說明,功夫不負有心人。同時,也讓我對HTTP方式的POST,GET,DELETE;對指定內容簽名;HTTP資料域的組織;HTTP標準頭的使用等等有了更近一步的瞭解。

先上原始碼:

<?phpdate_default_timezone_set("UTC");   // 把系統時間設定為UTC時候,因為在與BitMEX互動的時候,對方需要的是UTC時間戳$verb = 'POST';
$path = '/api/v1/order';
$apiNonce = (string)(time()+100);   // 時間戳,加了100,因為延時的原因,不加的話,伺服器會返回這個時候比較舊的錯誤。$data = 'symbol=XBTUSD&price=6300&orderQty=1';  // 這裡的資料組織形式和API文件中的例子不一樣。文件中說了,可以使用不同形式的組織方式來組織data;只要簽名的字串和傳到伺服器的字串一致就行;這句話非常關鍵。$apiKey = '';   // 填上自己的api KEY$apiSecret = '';    // 填上自己的api Secret$stringToHash = (string)($verb.$path.$apiNonce.$data);  // 按BitMEX官方API文件指示,拼接指定字串,以備簽名之用。$signature = hash_hmac('sha256', $stringToHash, $apiSecret);    // 簽名$postJsonString = $data;    // 傳送給伺服器的字串,和簽名所用的字串必須一致。不然會報("Signature Not Valid")簽名無效的錯誤$contentLength = strlen($postJsonString);// 合成頭部所需$headers = array( 
        "Content-type: application/x-www-form-urlencoded",  // 這裡的內容型別與data字串的組合形式也是相對應的,不然也會報"Signature Not Valid"的錯誤。
        "Accept: application/json",        "Content-length: ".$contentLength,        "X-Requested-With: XMLHttpRequest",        "api-expires:".$apiNonce,   // 時間戳
        "api-signature:".$signature,// 簽名後的字串
        "api-key:".$apiKey
    ); 

$ch = curl_init();

$uri = '';

curl_setopt($ch, CURLOPT_URL, $uri);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");    // 這裡可以作POST,GET,DELETE等等操作curl_setopt($ch, CURLOPT_HEADER, TRUE); //FALSEcurl_setopt($ch, CURLOPT_RETURNTRANSFER , TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postJsonString);
curl_setopt($ch, CURLOPT_HTTPHEADER , $headers);// 執行並獲取HTML文件內容$output = curl_exec($ch);if($output === FALSE ){    echo "n";    echo "CURL Error:".curl_error($ch);
}

$info = curl_getinfo($ch);

print_r($info);// 釋放curl控制程式碼curl_close($ch);echo "n";echo "output is ".$output;

難點主要在於簽名,http頭部內容的組織。我看了官方介面,ccxt在github上關於PHP的原始碼,也沒有找到合適的方法來解決這兩個問題。這個時候就犯難了,怎麼辦?

後來,還是在官方API文件中找到了蛛絲馬跡。

身份驗證可透過傳送以下 HTTP 標頭完成:

  1. API-expires :這個UNIX時間戳以後請求不再有效。 這是為了防止重放攻擊。

UNIX時間戳以秒為單位。 例如, 2018-02-08T04:30:37Z 為 1518064237。

  1. API-鍵 :您的API公鑰。 當你透過 API 建立一個 API 金鑰時,一個 id 引數會被返回。

  2. api-signature: 你的當前請求的簽名。 它的計算方法為 hex(HMAC_SHA256(apiSecret, verb + path + nonce + data))。 請參閱下面的計算示例。
    ‘data’ 引數
    HMAC 中的 data 部分應該完全與你傳送到伺服器的原始資料一致。 你可以傳送 JSON 或形式編碼,只需確保你在 HMAC 中使用同樣的字串。通常你可以用自己喜歡的程式語言建立你的請求,然後在 HMAC 中使用與請求中一樣的字串。

是的,有的時候,閱讀理解能力非常的關鍵。像這種情況下就體現出來了。我是反覆讀了好多次,才真正明白裡面的涵義;再加上反覆除錯;最後終於成功。現在看來,這段程式碼看似簡單,實則不易呀。

從現在起,養成一個好習慣——把難得的好東西分享出來。

圖片描述



作者:崔大辰兒
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3244/viewspace-2819761/,如需轉載,請註明出處,否則將追究法律責任。

相關文章