Как стать автором
Обновить

Модуль приёма платежей Payler для cms NetCat

Не так давно познакомился с интернет эквайрингом от компании «Payler» — payler.com. В сравнении с другими платёжными системами, эта обладает достаточно низким процентом комиссии за приём платежей. В момент знакомства я обнаружил, что среди готовых модулей оплат к различным cms не было моей. Мысль о создании тикета в обе технические поддержки заставила подумать о том, что это может затянуться на достаточно долгое время. В связи с этим вооружившись блокнотом и «боевым» проектом на свет появился готовый и рабочий модуль для приема платежей.

<?

class nc_payment_system_payler extends nc_payment_system {

    const TARGET_URL = "https://sandbox.payler.com/gapi/"; //secure боевой // sandbox тестовый

    protected $automatic = TRUE;
    

    // принимаемые валюты
    protected $accepted_currencies = array('RUB', 'RUR');
	
    // параметры сайта в платежной системе
    protected $settings = array(
        'key' => null,
        'password' => null,
        'type' => 'OneStep',
        'site_name'=> null,
        'succes_url'=> null,
    );

    // передаваемые параметры
    protected $request_parameters = array( // 'InvId' => null,
        // 'InvDesc' => null,
    );

    // получаемые параметры
    protected $callback_response = array(
        'InvId' => null,
        'OutSum' => null,
    );
    
    public function curl_post_data($data, $url) {
        $headers = array(
            'Content-type: application/x-www-form-urlencoded',
            'Cache-Control: no-cache',
            'charset="utf-8"',
        );
        
        $data = http_build_query($data, '', '&');
        $options = array (
            CURLOPT_URL => $url,
            CURLOPT_POST => 1,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_TIMEOUT => 45,
            CURLOPT_VERBOSE => 0,
            CURLOPT_HTTPHEADER => $headers,
            CURLOPT_POSTFIELDS => $data,            
            CURLOPT_SSL_VERIFYHOST => 0,
            CURLOPT_SSL_VERIFYPEER => 0,
        );
        
        $ch = curl_init();
        curl_setopt_array($ch, $options);
        $json = curl_exec($ch);
        if ($json == false) {
            die ('Curl error: ' . curl_error($ch) . '<br>');
        }
        //Преобразуем JSON в ассоциативный массив
        $result = json_decode($json, TRUE);
        curl_close($ch);
        return $result;
    }
    //новая функция для сессии
    public function execute_payment_session($data, $url) {           
        $result = $this->curl_post_data($data, $url);
        return $result['session_id'];
    }
    
    /**
     *
     */
    public function execute_payment_request(nc_payment_invoice $invoice) {
        $amount = $invoice->get_amount("%0.2F");
        $site_name = $this->get_setting('site_name');
        $userdata = array("site_id" => "1");
		$userdata = serialize($userdata);
        $data = array(
            'key' => $this->settings['key'],
            'type' => 'OneStep',
            'order_id' => $invoice->get_id(),
            'amount' => $amount*100,
            'userdata' => $userdata,
            'product' => 'Оплата заказа от сайта '.$site_name.''
        );
        $session_id = $this->execute_payment_session($data, nc_payment_system_payler::TARGET_URL."StartSession");

        ob_end_clean();
        $form = "
            <html>
              <body>
                    <form action='" . nc_payment_system_payler::TARGET_URL."Pay' method='post'>" .
                    $this->make_inputs(array(
                        'session_id' => $session_id,                        
                    )) . "
                </form>
                <script>
                  document.forms[0].submit();
                </script>
              </body>
            </html>";
        echo $form;
        exit;
    }

    /**
     * @param nc_payment_invoice $invoice
     */
    public function on_response(nc_payment_invoice $invoice = null) {
        $invoice->set('status', nc_payment_invoice::STATUS_SUCCESS);
        $invoice->save();
        $this->on_payment_success($invoice);
        $succes_url = $this->get_setting('succes_url');
        header("Location: ".$succes_url."?order_id=".$invoice->get_id());
        //echo 'OK' . $invoice->get_id();
    }

    /**
     *
     */
    public function validate_payment_request_parameters() {

    }

    /**
     * @param nc_payment_invoice $invoice
     */
    public function validate_payment_callback_response(nc_payment_invoice $invoice = null) {
        $data = array (
            "key" => $this->settings['key'],
            "order_id" => $this->get_response_value('order_id')
        );
        $result = $this->curl_post_data($data, nc_payment_system_payler::TARGET_URL."GetStatus");
        if ($result['status'] != 'Charged') {
            $this->add_error(self::ERROR_SOME_PARAMETERS_ARE_NOT_VALID);
        }
    }

    public function load_invoice_on_callback() {
        return $this->load_invoice($this->get_response_value('order_id'));
    }
}



Для того, чтобы подключить модуль, необходимо:

1) Создать файл payler.php с представленным содержимым и сохранить в директории по пути "/netcat/modules/payment/classes/system/payler.php".

2) Затем переходим в раздел списки. image

3) Далее «приём платежей:

image

4) Добавляем новый элемент с названием платёжной системы „Payler“ и дополнительным значением „nc_payment_system_payler“.

image

5) Далее в разделе Настройки => Приём платежей у нас появится новая платёжная система:

image

Где необходимо внести данные, предоставленные компанией Payler. А это: key и password. type по умолчанию OneStep — одностадийный (не регулярный платёж). site_name — название Вашего сайта. И наконец succes_url — это тот URL, куда будет перенаправлен пользователь после успешной транзакции.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.