binance-api-single.php
<?php
class Binance {
    public $btc_value = 0.00;
     protected $base = "https://api.binance.com/api/", $api_key, $api_secret;
    public function __construct($api_key, $api_secret) {
        $this->api_key = $api_key;
        $this->api_secret = $api_secret;
    }
    public function ping() {
        return $this->request("v1/ping");
    }
    public function time() {
        return $this->request("v1/time");
    }
    public function exchangeInfo() {
        return $this->request("v1/exchangeInfo");
    }
    public function buy_test($symbol, $quantity, $price, $type = "LIMIT", $flags = []) {
        return $this->order_test("BUY", $symbol, $quantity, $price, $type, $flags);
    }
    public function sell_test($symbol, $quantity, $price, $type = "LIMIT", $flags = []) {
        return $this->order_test("SELL", $symbol, $quantity, $price, $type, $flags);
    }
    public function buy($symbol, $quantity, $price, $type = "LIMIT", $flags = []) {
        return $this->order("BUY", $symbol, $quantity, $price, $type, $flags);
    }
    public function sell($symbol, $quantity, $price, $type = "LIMIT", $flags = []) {
        return $this->order("SELL", $symbol, $quantity, $price, $type, $flags);
    }
    public function cancel($symbol, $orderid) {
        return $this->signedRequest("v3/order",["symbol"=>$symbol, "orderId"=>$orderid], "DELETE");
    }
    public function orderStatus($symbol, $orderid) {
        return $this->signedRequest("v3/order",["symbol"=>$symbol, "orderId"=>$orderid]);
    }
    public function openOrders($symbol) {
        return $this->signedRequest("v3/openOrders",["symbol"=>$symbol]);
    }
    public function orders($symbol, $limit = 500) {
        return $this->signedRequest("v3/allOrders",["symbol"=>$symbol, "limit"=>$limit]);
    }
    public function trades($symbol) {
        return $this->signedRequest("v3/myTrades",["symbol"=>$symbol]);
    }
    public function prices() {
        return $this->priceData($this->request("v1/ticker/allPrices"));
    }
    public function bookPrices() {
        return $this->bookPriceData($this->request("v1/ticker/allBookTickers"));
    }
    public function account() {
        return $this->signedRequest("v3/account");
    }
    public function depth($symbol) {
        return $this->request("v1/depth",["symbol"=>$symbol]);
    }
    public function balances($priceData = false) {
        return $this->balanceData($this->signedRequest("v3/account"),$priceData);
    }
    public function prevDay($symbol) {
        return $this->request("v1/ticker/24hr", ["symbol"=>$symbol]);
    }
    private function request($url, $params = [], $method = "GET") {
        $opt = [
            "http" => [
                "method" => $method,
                "header" => "User-Agent: Mozilla/4.0 (compatible; PHP Binance API)\r\n"
            ]
        ];
        $context = stream_context_create($opt);
        $query = http_build_query($params, '', '&');
        return json_decode(file_get_contents($this->base.$url.'?'.$query, false, $context), true);
    }
    private function signedRequest($url, $params = [], $method = "GET") {
        $params['timestamp'] = number_format(microtime(true)*1000,0,'.','');
        $query = http_build_query($params, '', '&');
        $signature = hash_hmac('sha256', $query, $this->api_secret);
        $opt = [
            "http" => [
                "method" => $method,
                "ignore_errors" => true,
                "header" => "User-Agent: Mozilla/4.0 (compatible; PHP Binance API)\r\nX-MBX-APIKEY: {$this->api_key}\r\nContent-type: application/x-www-form-urlencoded\r\n"
            ]
        ];
        if ( $method == 'GET' ) {
            // parameters encoded as query string in URL
            $endpoint = "{$this->base}{$url}?{$query}&signature={$signature}";
        } else {
            // parameters encoded as POST data (in $context)
            $endpoint = "{$this->base}{$url}";
            $postdata = "{$query}&signature={$signature}";
            $opt['http']['content'] = $postdata;
        }
        $context = stream_context_create($opt);
        return json_decode(file_get_contents($endpoint, false, $context), true);
    }
    private function order_test($side, $symbol, $quantity, $price, $type = "LIMIT", $flags = []) {
        $opt = [
            "symbol" => $symbol,
            "side" => $side,
            "type" => $type,
            "quantity" => $quantity,
            "recvWindow" => 60000
        ];
        if ( $type == "LIMIT" ) {
            $opt["price"] = $price;
            $opt["timeInForce"] = "GTC";
        }
        // allow additional options passed through $flags
        if ( isset($flags['recvWindow']) ) $opt['recvWindow'] = $flags['recvWindow'];
        if ( isset($flags['timeInForce']) ) $opt['timeInForce'] = $flags['timeInForce'];
        if ( isset($flags['stopPrice']) ) $opt['stopPrice'] = $flags['stopPrice'];
        if ( isset($flags['icebergQty']) ) $opt['icebergQty'] = $flags['icebergQty'];
        return $this->signedRequest("v3/order/test", $opt, "POST");
    }
    private function order($side, $symbol, $quantity, $price, $type = "LIMIT", $flags = []) {
        $opt = [
            "symbol" => $symbol,
            "side" => $side,
            "type" => $type,
            "quantity" => $quantity,
            "recvWindow" => 60000
        ];
        if ( $type == "LIMIT" ) {
            $opt["price"] = $price;
            $opt["timeInForce"] = "GTC";
        }
        // allow additional options passed through $flags
        if ( isset($flags['recvWindow']) ) $opt["recvWindow"] = $flags['recvWindow'];
        if ( isset($flags['timeInForce']) ) $opt["timeInForce"] = $flags['timeInForce'];
        if ( isset($flags['stopPrice']) ) $opt['stopPrice'] = $flags['stopPrice'];
        if ( isset($flags['icebergQty']) ) $opt['icebergQty'] = $flags['icebergQty'];
        return $this->signedRequest("v3/order", $opt, "POST");
    }
    //1m,3m,5m,15m,30m,1h,2h,4h,6h,8h,12h,1d,3d,1w,1M
    public function candlesticks($symbol, $interval = "5m") {
        return $this->request("v1/klines",["symbol"=>$symbol, "interval"=>$interval]);
    }
    private function balanceData($array, $priceData = false) {
        if ( $priceData ) $btc_value = 0.00;
        $balances = [];
        foreach ( $array['balances'] as $obj ) {
            $asset = $obj['asset'];
            $balances[$asset] = ["available"=>$obj['free'], "onOrder"=>$obj['locked'], "btcValue"=>0.00000000];
            if ( $priceData ) {
                if ( $obj['free'] < 0.00000001 ) continue;
                if ( $asset == 'BTC' ) {
                    $balances[$asset]['btcValue'] = $obj['free'];
                    $btc_value+= $obj['free'];
                    continue;
                }
                $btcValue = number_format($obj['free'] * $priceData[$asset.'BTC'],8,'.','');
                $balances[$asset]['btcValue'] = $btcValue;
                $btc_value+= $btcValue;
            }
        }
        if ( $priceData ) {
            uasort($balances, function($a, $b) { return $a['btcValue'] < $b['btcValue']; });
            $this->btc_value = $btc_value;
        }
        return $balances;
    }
    private function bookPriceData($array) {
        $bookprices = [];
        foreach ( $array as $obj ) {
            $bookprices[$obj['symbol']] = [
                "bid"=>$obj['bidPrice'],
                "bids"=>$obj['bidQty'],
                "ask"=>$obj['askPrice'],
                "asks"=>$obj['askQty']
            ];
        }
        return $bookprices;
    }
    private function priceData($array) {
        $prices = [];
        foreach ( $array as $obj ) {
            $prices[$obj['symbol']] = $obj['price'];
        }
        return $prices;
    }
}
test.php
<?php
require 'binance-api-single.php';
$api = new Binance("<key>","<secret>");

// Get latest price of all symbols
$tickers = $api->prices();
print_r($tickers); // List prices of all symbols

// Get latest price of a symbol
$price = $api->price("BNBBTC");
echo "Price of BNB: {$price} BTC.".PHP_EOL;

// Get balances for all of your positions, including estimated BTC value
$balances = $api->balances($tickers);
print_r($balances);
echo "BTC owned: ".$balances['BTC']['available'].PHP_EOL;
echo "ETH owned: ".$balances['ETH']['available'].PHP_EOL;
echo "Estimated Value: ".$api->btc_value." BTC".PHP_EOL;

// Getting 24hr ticker price change statistics for a symbol
$prevDay = $api->prevDay("BNBBTC");
print_r($prevDay);
echo "BNB price change since yesterday: ".$prevDay['priceChangePercent']."%".PHP_EOL;