PHP實現BitMEX API POST方式委託掛單
這個功能的實現再一次說明,功夫不負有心人。同時,也讓我對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 標頭完成:
API-expires :這個UNIX時間戳以後請求不再有效。 這是為了防止重放攻擊。
UNIX時間戳以秒為單位。 例如, 2018-02-08T04:30:37Z 為 1518064237。
API-鍵 :您的API公鑰。 當你透過 API 建立一個 API 金鑰時,一個 id 引數會被返回。
api-signature: 你的當前請求的簽名。 它的計算方法為 hex(HMAC_SHA256(apiSecret, verb + path + nonce + data))。 請參閱下面的計算示例。
‘data’ 引數
HMAC 中的 data 部分應該完全與你傳送到伺服器的原始資料一致。 你可以傳送 JSON 或形式編碼,只需確保你在 HMAC 中使用同樣的字串。通常你可以用自己喜歡的程式語言建立你的請求,然後在 HMAC 中使用與請求中一樣的字串。
是的,有的時候,閱讀理解能力非常的關鍵。像這種情況下就體現出來了。我是反覆讀了好多次,才真正明白裡面的涵義;再加上反覆除錯;最後終於成功。現在看來,這段程式碼看似簡單,實則不易呀。
從現在起,養成一個好習慣——把難得的好東西分享出來。
作者:崔大辰兒
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3244/viewspace-2819761/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- winform實現委託ORM
- C#委託的幾種表現方式C#
- dotnet 委託的實現解析
- dotnet 委託的實現解析(2)開放委託和封閉委託 (Open Delegates vs. Closed Delegates)
- PHP與Curl採用的GET,POST,JSON方式請求APIPHPJSONAPI
- 簡單多播委託Demo
- # 委託
- 委託
- 委託與事件-委託詳解(一)事件
- 用委託者模式實現的多型別Adapter模式多型型別APT
- .NET Core 利用委託實現動態流程組裝
- 事件委託事件
- 通過釋出訂閱模式實現的事件委託模式事件
- kotlin代理模式就是這麼簡單(委託)Kotlin模式
- 行為委託
- C#委託C#
- Java-委託Java
- cURL實現傳送Get和Post請求(PHP)PHP
- iOS:利用訊息轉發機制實現多播委託iOS
- C# 委託(delegate)、泛型委託和Lambda表示式C#泛型
- 來個簡單的事件委託 冒個泡事件
- Javascript 實現一個post方式的檔案下載JavaScript
- GET和POST方式請求API介面資料返回API
- C#使用委託實現函式回撥,方法呼叫攔截C#函式
- C#-委託delegateC#
- 委託的好處
- Kotlin基礎 — 委託Kotlin
- wpf移除事件委託事件
- 04.委託Delegation
- UE4委託
- PHP實現單例模式PHP單例模式
- PHP外掛系統的實現(七):外掛案例PHP
- PHP外掛系統的實現(一)PHP
- JQuery7:事件委託jQuery事件
- C# - 委託與事件C#事件
- C#委託與事件C#事件
- 事件模型和事件委託事件模型
- 優化委託的 `DynamicInvoke`優化