daily pastebin goal
52%
SHARE
TWEET

Untitled

a guest Feb 22nd, 2019 61 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?
  2.  
  3. class payment_system_payonline extends nc_payment_system {
  4.  
  5.     const ERROR_MERCHANT_ID = NETCAT_MODULE_PAYMENT_PAYONLINE_ERROR_MERCHANT_ID;
  6.     const ERROR_PRIVATE_SECURITY_KEY_IS_NULL = NETCAT_MODULE_PAYMENT_PAYONLINE_ERROR_PRIVATE_SECURITY_KEY_IS_NULL;
  7.     const ERROR_PRIVATE_SECURITY_IS_NOT_VALID = NETCAT_MODULE_PAYMENT_PAYONLINE_ERROR_PRIVATE_SECURITY_IS_NOT_VALID;
  8.  
  9.     const TARGET_URL = "https://secure.payonlinesystem.com/ru/payment/select/";
  10.  
  11.     protected $automatic = TRUE;
  12.  
  13.     // принимаемые валюты
  14.     protected $accepted_currencies = array('RUB', 'RUR', 'USD', 'EUR');
  15.     protected $currency_map = array('RUR' => 'RUB');
  16.  
  17.     // параметры сайта в платежной системе
  18.     protected $settings = array(
  19.         'MerchantId' => null,
  20.         'PrivateSecurityKey' => null,
  21.         'ReturnUrl' => null,
  22.         'FailUrl' => null,
  23.     );
  24.  
  25.     // передаваемые параметры
  26.     protected $request_parameters = array(
  27.         // 'Amount' => null,
  28.         // 'Currency' => 'RUB',
  29.         'ValidUntil' => null,
  30.         // 'OrderDescription' => null,
  31.         // 'SecurityKey' => null, // вычисляется
  32.         // 'ReturnUrl' => null,
  33.         // 'FailUrl' => null,
  34.     );
  35.  
  36.     // получаемые параметры
  37.     protected $callback_response = array(
  38.         'DateTime' => null,
  39.         'TransactionID' => null,
  40.         'Provider' => null, // [Card, Qiwi, WebMoney, YandexMoney]
  41.         'IpAddress' => null,
  42.         'IpCountry' => null,
  43.         // ???????
  44.         'OrderId' => null,
  45.         'Amount' => null,
  46.         'Currency' => null,
  47.         // при оплате с карты
  48.         'CardHolder' => null,
  49.         'CardNumber' => null,
  50.         'Country' => null,
  51.         'City' => null,
  52.         'Address' => null,
  53.         'BinCountry' => null,
  54.         // при оплате QIWI
  55.         'Phone' => null,
  56.         // при оплате WebMoney
  57.         'WmTranId' => null,
  58.         'WmInvId' => null,
  59.         'WmId' => null,
  60.         'WmPurse' => null,
  61.         // при оплате Яндекс.Деньги
  62.         'YmInvoiceId' => null,
  63.         'YmMode' => null,
  64.         'YmPayerCode' => null,
  65.     );
  66.  
  67.     /**
  68.      *
  69.      */
  70.     public function execute_payment_request(nc_payment_invoice $invoice) {
  71.         ob_end_clean();
  72.         header("Location: " . $this->get_pay_request_url($invoice));
  73.     }
  74.  
  75.     /**
  76.      * @param nc_payment_invoice $invoice
  77.      * @return string
  78.      */
  79.     protected function get_pay_request_url(nc_payment_invoice $invoice) {
  80.         // вычисление значения для параметра SecurityKey
  81.         $security_key_values = array(
  82.             'MerchantId' => $this->get_setting('MerchantId'),
  83.             'OrderId' => $invoice->get_id(),
  84.             'Amount' => $invoice->get_amount('%0.2F'),
  85.             'Currency' => $this->get_currency_code($invoice->get_currency()),
  86.             'ValidUntil' => $this->get_request_parameter('ValidUntil'),
  87.             'OrderDescription' => $invoice->get_description(),
  88.             'PrivateSecurityKey' => $this->get_setting('PrivateSecurityKey'),
  89.         );
  90.         $security_key = $this->calculate_security_key($security_key_values);
  91.  
  92.         // подготовка параметров для запроса
  93.         $query_values = array_merge($this->request_parameters, array(
  94.             'MerchantId' => $this->get_setting('MerchantId'),
  95.             'OrderId' => $invoice->get_id(),
  96.             'Amount' => $invoice->get_amount('%0.2F'),
  97.             'Currency' => $this->get_currency_code($invoice->get_currency()),
  98.             'ValidUntil' => $this->get_request_parameter('ValidUntil'),
  99.             'OrderDescription' => $invoice->get_description(),
  100.             'SecurityKey' => $security_key,
  101.             'ReturnUrl' => $this->get_setting('ReturnUrl'),
  102.             'FailUrl' => $this->get_setting('FailUrl'),
  103.         ));
  104.         $query = $this->make_query_string($query_values);
  105.         return nc_payment_system_payonline::TARGET_URL . "?" . $query;
  106.     }
  107.  
  108.     /**
  109.      *
  110.      */
  111.     protected function calculate_security_key(array $secret_key_values) {
  112.         $res = array();
  113.         foreach ($secret_key_values as $k => $v) {
  114.             if ($v !== null) {
  115.                 $res[] = "$k=$v";
  116.             }
  117.         }
  118.         $res = implode('&', $res);
  119.         return md5($res);
  120.     }
  121.  
  122.     /**
  123.      * @param array $params
  124.      * @return string
  125.      */
  126.     protected function make_query_string($params) {
  127.         return http_build_query($params, '', '&');
  128.     }
  129.  
  130.     /**
  131.      *
  132.      */
  133.     public function validate_payment_request_parameters() {
  134.         if (!is_numeric($this->get_setting('MerchantId'))) {
  135.             $this->add_error(nc_payment_system_payonline::ERROR_MERCHANT_ID);
  136.         }
  137.  
  138.         if (!($this->get_setting('PrivateSecurityKey'))) {
  139.             $this->add_error(nc_payment_system_payonline::ERROR_PRIVATE_SECURITY_KEY_IS_NULL);
  140.         }
  141.  
  142.     }
  143.  
  144.     /**
  145.      * @param nc_payment_invoice $invoice
  146.      */
  147.     public function on_response(nc_payment_invoice $invoice = null) {
  148.         // предполагается, что в настройках PayOnline в URL callback вызова передается
  149.         // GET-параметр action (success — платеж прошёл, error — нет)
  150.         if ($this->get_response_value('action') === 'success') {
  151.             $this->on_payment_success($invoice);
  152.         }
  153.         else {
  154.             $this->on_payment_failure($invoice);
  155.         }
  156.     }
  157.  
  158.     /**
  159.      * @param nc_payment_invoice $invoice
  160.      */
  161.     public function validate_payment_callback_response(nc_payment_invoice $invoice = null) {
  162.         $security_key_values = array(
  163.             'DateTime' => $this->get_response_value('DateTime'),
  164.             'TransactionID' => $this->get_response_value('TransactionID'),
  165.             'OrderId' => $this->get_response_value('OrderId'),   // ??? $invoice->get_id(),
  166.             'Amount' => $this->get_response_value('Amount'),     // ??? $invoice->get_amount("%0.2F"),
  167.             'Currency' => $this->get_response_value('Currency'), // ???
  168.             'PrivateSecurityKey' => $this->get_setting('PrivateSecurityKey')
  169.         );
  170.         $security_key = $this->calculate_security_key($security_key_values);
  171.  
  172.         if ($security_key != $this->get_response_value('SecurityKey')) {
  173.             $this->add_error(self::ERROR_PRIVATE_SECURITY_IS_NOT_VALID);
  174.         }
  175.     }
  176.  
  177.     public function load_invoice_on_callback() {
  178.         return $this->load_invoice($this->get_response_value('OrderId'));
  179.     }
  180. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top