2013-10-19 33 views
1

我试图通过将PHP代码放置在crontab中来实现一个PHP API来实现重新发生的事务。Bitstamp API的PHP实现

我试图让API与bitstamp进行通信,以便每次执行购买X数量的BTC(然后控制来自crontab的频率),这应该是基本实现的定义。

这里是快乐,我绝对不是一个PHP编码器。 BX Media公司的员工很友善地将他们的PHP框架发布到github上:(https://github.com/willmoss/bitstamp-php-api)。

不过,我知道他们做了什么的方式是,我必须创建“父”的PHP然后包括他们的API代码,也包括我的凭据

所以我放在一起最基本的PHP代码

<?php 
require('bitstamp.php'); 
$KEY = 'XXXXXXXXXXXXXXXX'; 
$SECRET = 'XXXXXXXXXXXXXXXX'; 
$CLIENT_ID = 'XXXXX'; 

$bs = new Bitstamp("KEY","SECRET","CLIENT_ID"); 

// print_r($bs->ticker()); 

$bs->buyBTC(0.01); // buy 0.01 bitcoins at ask price 
//$bs->bitstamp_query("buy", array('amount'=>'0.05','price'=>'50')); 


?> 

注意:“bitstamp.php”位于同一个目录中,并且是目前在Github上的内容。

<?php 

/** 
* @package Bitstamp API 
* @author https://bxmediaus.com - BX MEDIA - PHP + Bitcoin. We are ready to work on your next bitcoin project. Only high quality coding. https://bxmediaus.com 
* @version 0.1 
* @access public 
* @license http://www.opensource.org/licenses/LGPL-3.0 
*/ 

class Bitstamp 
{ 
    private $key; 
    private $secret; 
    private $client_id; 
    public $redeemd; // Redeemed code information 
    public $withdrew; // Withdrawal information 
    public $info;  // Result from getInfo() 
    public $ticker; // Current ticker (getTicker()) 
    public $eurusd; // Current eur/usd 
    /** 
    * Bitstamp::__construct() 
    * Sets required key and secret to allow the script to function 
    * @param Bitstamp API Key $key 
    * @param Bitstamp Secret $secret 
    * @return 
    */ 
    public function __construct($key, $secret, $client_id) 
    { 
     if (isset($secret) && isset($key) && isset($client_id)) 
     { 
      $this->key = $key; 
      $this->secret = $secret; 
      $this->client_id = $client_id; 
     } else 
      die("NO KEY/SECRET/CLIENT ID"); 
    } 
    /** 
    * Bitstamp::bitstamp_query() 
    * 
    * @param API Path $path 
    * @param POST Data $req 
    * @return Array containing data returned from the API path 
    */ 
    public function bitstamp_query($path, array $req = array()) 
    { 
     // API settings 
     $key = $this->key; 

     // generate a nonce as microtime, with as-string handling to avoid problems with 32bits systems 
     $mt = explode(' ', microtime()); 
     $req['nonce'] = $mt[1] . substr($mt[0], 2, 6); 
     $req['key'] = $key; 
     $req['signature'] = $this->get_signature($req['nonce']); 


     // generate the POST data string 
     $post_data = http_build_query($req, '', '&'); 

     // any extra headers 
     $headers = array(); 

     // our curl handle (initialize if required) 
     static $ch = null; 
     if (is_null($ch)) 
     { 
      $ch = curl_init(); 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
      curl_setopt($ch, CURLOPT_USERAGENT, 
       'Mozilla/4.0 (compatible; MtGox PHP client; ' . php_uname('s') . '; PHP/' . 
       phpversion() . ')'); 
     } 
     curl_setopt($ch, CURLOPT_URL, 'https://www.bitstamp.net/api/' . $path .'/'); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); 
     curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

     // run the query 
     $res = curl_exec($ch); 
     if ($res === false) 
      throw new \Exception('Could not get reply: ' . curl_error($ch)); 
     $dec = json_decode($res, true); 
     if (!$dec) 
      throw new \Exception('Invalid data received, please make sure connection is working and requested API exists'); 
     return $dec; 
    } 

    /** 
    * Bitstamp::ticker() 
    * Returns current ticker from Bitstamp 
    * @return $ticker 
    */ 
    function ticker() { 
     $ticker = $this->bitstamp_query('ticker'); 
     $this->ticker = $ticker; // Another variable to contain it. 
     return $ticker; 
    } 

    /** 
    * Bitstamp::eurusd() 
    * Returns current EUR/USD rate from Bitstamp 
    * @return $ticker 
    */ 
    function eurusd() { 
     $eurusd = $this->bitstamp_query('eur_usd'); 
     $this->eurusd = $eurusd; // Another variable to contain it. 
     return $eurusd; 
    } 

    /** 
    * Bitstamp::buyBTC() 
    * 
    * @param float $amount 
    */ 
    function buyBTC($amount){ 

     if (!isset($ticker)) 
     $this->ticker(); 

     $ticker = $this->ticker; 

     return $this->bitstamp_query('buy', array('amount' => $amount, 'price' => $ticker['ask'])); 

    } 

    /** 
    * Bitstamp::sellBTC() 
    * 
    * @param float $amount 
    * @param float $price 
    * @param string $currency 
    */ 
    function sellBTC($amount){ 

     if (!isset($ticker)) 
     $this->ticker(); 

     $ticker = $this->ticker; 

     return $this->bitstamp_query('sell', array('amount' => $amount, 'price' => $ticker['bid'])); 

    } 


    /** 
    * Bitstamp::get_signature() 
    * Compute bitstamp signature 
    * @param float $nonce 
    */ 
    private function get_signature($nonce) 
    { 

     $message = $nonce.$this->client_id.$this->key; 

     return strtoupper(hash_hmac('sha256', $message, $this->secret)); 

    } 
} 

我在执行失败。由于Bitstamp API的作者显然与他的客户合作,我认为错误出现在我的“父母”PHP代码上。 (注意:我在本地版本上使用真正的密钥和秘密)。

任何人都有这个API或一般的经验或建议?

+0

什么是错误? – xbonez

+0

它不会抛出错误..它只是没有完成请求的事务。我假设我没有正确编写“parent”php来将变量(例如登录凭证)传递给bitstamp.php代码。 – Matt

回答

1

由于这个API的作者(我Bx的媒体部门的首席执行官):

您需要重拍构造如下:

$bs = new Bitstamp("put your key here","put your secret here","put your client ID here"); 

即,你实际上把你的密钥/秘密/ ID置于语音标记之间。

在PHP中,当你放一个$符号时,它将某些东西设置为一个变量。

在这里看到的更多信息:http://www.w3schools.com/php/php_variables.asp

如果你想使用的变量,你也可以使用IMSOP的解决方案。

请注意,我们今晚还更新了一些图书馆的新功能。所以请更新您的回购到最新的提交以获得新的代码。

干杯!

+0

是...这是问题...一旦更新,脚本现在工作正常.. thx .. – Matt

2

我不知道这是否只是匿名或实际的代码,所以让我知道,如果我有这个毛病,但你有这样一行:

$bs = new Bitstamp("KEY","SECRET","CLIENT_ID"); 

这传递的实际字符串“KEY” ,“SECRET”和“CLIENT_ID”;你想要做的是通过你的线上面定义的变量,就像这样:

$bs = new Bitstamp($KEY,$SECRET,$CLIENT_ID); 
+0

我认为可能已经完成了...更多... – Matt

+0

是的..这是问题...一旦更新,脚本现在工作正常.. thx .. – Matt