<?php
/**
* Example usage of the KrakenAPIClient library.
*
* See https://www.kraken.com/help/api for more info.
*
*/
namespace Payward;
/**
* Reference implementation for Kraken's REST API.
*
* See https://www.kraken.com/help/api for more info.
*
*
* The MIT License (MIT)
*
* Copyright (c) 2013 Payward, Inc
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
class KrakenAPIException extends \ErrorException {};
class KrakenAPI
{
protected $key; // API key
protected $secret; // API secret
protected $url; // API base URL
protected $version; // API version
protected $curl; // curl handle
/**
* Constructor for KrakenAPI
*
* @param string $key API key
* @param string $secret API secret
* @param string $url base URL for Kraken API
* @param string $version API version
* @param bool $sslverify enable/disable SSL peer verification. disable if using beta.api.kraken.com
*/
function __construct($key, $secret, $url='https://api.kraken.com', $version='0', $sslverify=true)
{
$this->key = $key;
$this->secret = $secret;
$this->url = $url;
$this->version = $version;
$this->curl = curl_init();
curl_setopt_array($this->curl, array(
CURLOPT_SSL_VERIFYPEER => $sslverify,
CURLOPT_SSL_VERIFYHOST => 2,
CURLOPT_USERAGENT => 'Kraken PHP API Agent',
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true)
);
}
function __destruct()
{
curl_close($this->curl);
}
/**
* Query public methods
*
* @param string $method method name
* @param array $request request parameters
* @return array request result on success
* @throws KrakenAPIException
*/
function QueryPublic($method, array $request = array())
{
// build the POST data string
$postdata = http_build_query($request, '', '&');
// make request
curl_setopt($this->curl, CURLOPT_URL, $this->url . '/' . $this->version . '/public/' . $method);
curl_setopt($this->curl, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($this->curl, CURLOPT_HTTPHEADER, array());
$result = curl_exec($this->curl);
if($result===false)
throw new KrakenAPIException('CURL error: ' . curl_error($this->curl));
// decode results
$result = json_decode($result, true);
if(!is_array($result))
throw new KrakenAPIException('JSON decode error');
return $result;
}
/**
* Query private methods
*
* @param string $method method path
* @param array $request request parameters
* @return array request result on success
* @throws KrakenAPIException
*/
function QueryPrivate($method, array $request = array())
{
if(!isset($request['nonce'])) {
// generate a 64 bit nonce using a timestamp at microsecond resolution
// string functions are used to avoid problems on 32 bit systems
$nonce = explode(' ', microtime());
$request['nonce'] = $nonce[1] . str_pad(substr($nonce[0], 2, 6), 6, '0');
}
// build the POST data string
$postdata = http_build_query($request, '', '&');
// set API key and sign the message
$path = '/' . $this->version . '/private/' . $method;
$sign = hash_hmac('sha512', $path . hash('sha256', $request['nonce'] . $postdata, true), base64_decode($this->secret), true);
$headers = array(
'API-Key: ' . $this->key,
'API-Sign: ' . base64_encode($sign)
);
// make request
curl_setopt($this->curl, CURLOPT_URL, $this->url . $path);
curl_setopt($this->curl, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($this->curl, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($this->curl);
if($result===false)
throw new KrakenAPIException('CURL error: ' . curl_error($this->curl));
// decode results
$result = json_decode($result, true);
if(!is_array($result))
throw new KrakenAPIException('JSON decode error');
return $result;
}
}
// your api credentials
$key = 'cYrXn9E+6xe7pGfrc1i/mrpnNAac7G7Z2fQ3UvNXq9BXHkTTyWZiRyCK';
$secret = 'zslMp0lAhGiEYMH7onNeiCd5NAlibEdk09Z4LL/xkn9EXPjIQumSKaUCTg5WmE4ZHFzgy+2fbRAA5lbGqvGI4Q==';
// set which platform to use (currently only beta is operational, live available soon)
$beta = false;
$url = $beta ? 'https://api.beta.kraken.com' : 'https://api.kraken.com';
$sslverify = $beta ? false : true;
$version = 0;
$kraken = new KrakenAPI($key, $secret, $url, $version, $sslverify);
// Query private asset balances
$res = $kraken->QueryPrivate('Balance');
print_r($res);
/**
* Example output:
*
* Array
* (
* [error] => Array
* (
* )
*
* [result] => Array
* (
* [ZUSD] => 3415.8014
* [ZEUR] => 155.5649
* [XBTC] => 149.9688412800
* [XXRP] => 499889.51600000
* )
*
* )
*/