<?php
class LiqPay
{
    protected $_supportedCurrencies = array('EUR','UAH','USD','RUB','RUR');

    protected $_supportedParams = array('public_key','amount','currency','description',
                                        'order_id','result_url','server_url','type',
                                        'signature','language','sandbox');
    private $_public_key;
    private $_private_key;

    public function __construct($public_key, $private_key)
    {
        if (empty($public_key)) {
            throw new InvalidArgumentException('public_key is empty');
        }

        if (empty($private_key)) {
            throw new InvalidArgumentException('private_key is empty');
        }

        $this->_public_key = $public_key;
        $this->_private_key = $private_key;
    }

    public function api($url, $params = array())
    {
        $url = 'https://www.liqpay.com/api/'.$url;

        $public_key = $this->_public_key;
        $private_key = $this->_private_key;
        $data = json_encode(array_merge(compact('public_key'), $params));
        $signature = base64_encode(sha1($private_key.$data.$private_key, 1));
        $postfields = "data={$data}&signature={$signature}";

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS,$postfields);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);

        $server_output = curl_exec($ch);

        curl_close($ch);

        return json_decode($server_output);
    }

    public function cnb_form($params)
    {
        $params['public_key'] = $this->_public_key;

        if (!isset($params['amount'])) {
            throw new InvalidArgumentException('Amount is null');
        }
        if (!isset($params['currency'])) {
           throw new InvalidArgumentException('Currency is null');
        }
        if (!in_array($params['currency'], $this->_supportedCurrencies)) {
            throw new InvalidArgumentException('Currency is not supported');
        }
        if ($params['currency'] == 'RUR') {
            $params['currency'] = 'RUB';
        }
        if (!isset($params['description'])) {
            throw new InvalidArgumentException('Description is null');
        }
        if (!isset($params['sandbox'])) {
            throw new InvalidArgumentException('sandbox is null');
        }

        $params['signature'] = $this->cnb_signature($params);


        $language = 'ru';
        if (isset($params['language']) && $params['language'] == 'en') {
            $language = 'en';
        }

        $inputs = array();
        foreach ($params as $key => $value) {
            if (!in_array($key, $this->_supportedParams)) {
                continue;
            }
            $inputs[] = sprintf('<input type="hidden" name="%s" value="%s" />', $key, $value);
        }

        return sprintf('
                <form method="post" action="https://www.liqpay.com/api/pay" accept-charset="utf-8">
                    %s
                    <input type="submit" value="Оплатить" class="btn-blue" style="height:26px;">
                </form>
            ',
            join("\r\n", $inputs),
            $language
        );
    }

    public function cnb_signature($params)
    {
        $public_key = $params['public_key'] = $this->_public_key;
        $private_key = $this->_private_key;


        if ($params['currency'] == 'RUR') {
            $params['currency'] = 'RUB';
        }

        $amount = $params['amount'];
        $currency = $params['currency'];
        $description = $params['description'];

        $order_id = '';
        if (isset($params['order_id'])) {
           $order_id = $params['order_id'];
        }

        $type = '';
        if (isset($params['type'])) {
           $type = $params['type'];
        }

        $result_url = '';
        if (isset($params['result_url'])) {
           $result_url = $params['result_url'];
        }

        $server_url = '';
        if (isset($params['server_url'])) {
           $server_url = $params['server_url'];
        }

        $signature = $this->str_to_sign(
            $private_key.
            $amount.
            $currency.
            $public_key.
            $order_id.
            $type.
            $description.
            $result_url.
            $server_url
        );

        return $signature;
    }
    public function str_to_sign($str)
    {

        $signature = base64_encode(sha1($str,1));

        return $signature;
    }

}
