美文网首页PHP经验分享Bitmex
PHP实现BitMEX API POST方式委托挂单

PHP实现BitMEX API POST方式委托挂单

作者: 付山 | 来源:发表于2018-09-26 14:06 被阅读5次

前前后后在3,5天里,花了大概10个小时的时间,研究BitMEX官方API接口开源的交易所的API接口集合。最后也没有一个好的方法能够让我的程序挂单到BitMEX交易所。最后没有办法了,索性自己写吧。经过一番周折,最终不负所望。成功的用PHP实现了接入BitMEX API,并且挂单成功。

这个功能的实现再一次说明,功夫不负有心人。同时,也让我对HTTP方式的POST,GET,DELETE;对指定内容签名;HTTP数据域的组织;HTTP标准头的使用等等有了更近一步的了解。

先上源码:

<?php

date_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 = 'https://www.bitmex.com/api/v1/order';

curl_setopt($ch, CURLOPT_URL, $uri);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");    // 这里可以作POST,GET,DELETE等等操作
curl_setopt($ch, CURLOPT_HEADER, TRUE); //FALSE
curl_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 中使用与请求中一样的字符串。

是的,有的时候,阅读理解能力非常的关键。像这种情况下就体现出来了。我是反复读了好多次,才真正明白里面的涵义;再加上反复调试;最后终于成功。现在看来,这段代码看似简单,实则不易呀。

从现在起,养成一个好习惯——把难得的好东西分享出来。

日本奈良

相关文章

  • PHP实现BitMEX API POST方式委托挂单

    前前后后在3,5天里,花了大概10个小时的时间,研究BitMEX官方API接口,开源的交易所的API接口集合。最后...

  • BitMEX挂单策略详解

    BitMEX已经成为了虚拟货币杠杆交易的首选平台,但其API交易限制严格,让人十分困扰。本文主要分享在FMZ量化交...

  • API的设计(3) - 实现方式

    protoapi实现的方式 接上文,我们选择了protobuf作为IDL,而在代码生成的工具上,我是选择了使用go...

  • PHP $_POST 变量和PHP $_GET 变量

    GET 与 POST 的区别: get是从服务器上获取数据,post是向服务器传送数据。 get是把参数数据队列加...

  • PHP 反射API

    PHP的反射API,即在PHP运行状态下,通过分析PHP程序,可以导出对象所属的类,方法,属性,参数等信息。 如何...

  • 实现Swift的委托(Delegate)的三种方式

    在多线程编程中,常常会遇到这样一种场景:主界面开启一个新线程,在新线程执行过程中,需要调用主界面的某个方法(比如更...

  • PHP 操作Cron Api

    1.简介 手动去系统中去改相应Cron显得很不方便,所以封装了简单的操作Cron的Api,利用这些Api可以实现添...

  • php实现base64图片上传方式

    php实现base64图片上传方式 本例子中没有采用File Post上传文件方式!原理一样,为了更加的理解bas...

  • PHP常用的API

    php中这些都非常的常用。 1. 分割字符串 explode (返回的是数组) 例如: 2. 将数组中的数据连接成...

  • Django ajax post方式处理

    post方式不同于get方式可以被django直接得到,因为django为post加入了csrf保护,提交的时候会...

网友评论

    本文标题:PHP实现BitMEX API POST方式委托挂单

    本文链接:https://www.meiwen.com.cn/subject/zbbdoftx.html