Все изменения производились в файле media\zoo\applications\jbuniversal\framework\controllers\payment.php
Делал на основе Робокассы (по сути переделал робокассу, теперь у меня ее нет)
В настройках корзины, в полях Робокассы указываем id мерчанта (login) и сигнатуру (password 1) и включаем робокассу
далее файл payment.php
17 строка: const TYPE_ROBOX = 'Liqpay.com';
далее функция function index()
в ней формируется запрос на платежную систему
// robox замена на Privat24 if ((int)$this->appParams->get('global.jbzoo_cart_config.robox-enabled', 0)) { $params = new stdClass(); // id мерчанта $params->login = JString::trim($this->appParams->get('global.jbzoo_cart_config.robox-login')); // подпись мерчанта $params->password1 = JString::trim($this->appParams->get('global.jbzoo_cart_config.robox-password1')); // берем поле тефефон клиента из формы заказа $params->phone = $this->order->getElement('c1b20e16-3869-40db-95b9-2c8fd0a8649f')->get('value'); $params->summ = $totalSumm; $params->orderId = $this->orderId; $params->summFormated = $totalSummFormated; // формируем xml liqpay // поля operation_xml $params->xml_operation_xml = '<request> <version>1.2</version> <merchant_id>'.$params->login.'</merchant_id> <result_url>{страница возврата после платежа}</result_url> <server_url>{страница на которую приходит callback от платежки}</server_url> <order_id>'.$this->orderId.'</order_id> <amount>'.$totalSumm.'</amount> <currency>UAH</currency> <description>OrderID #'.$this->orderId.' Podarochniy sertifikat na summu: '.$totalSumm.' UAH</description> <default_phone>'.$params->phone.'</default_phone> <pay_way>card</pay_way> </request>'; // Создание подписи signature $params->sign = base64_encode(sha1($params->password1.$params->xml_operation_xml.$params->password1,1)); //Запаковка XML $params->xml_encoded = base64_encode($params->xml_operation_xml); $this->payments['robox'] = $this->app->data->create($params); }После этого правим функцию _init
нам надо получить order_id который приходит от привата в массиве post в закодированном виде (в отличии от робокассы и интеркассы)
строку
if ($invId = (int)$this->_jbreq->get('InvId')) {меняем на
$this->appParams = $this->application->getParams(); if (isset($_POST['operation_xml']) && isset($_POST['signature'])){ $operation_xml = $_POST['operation_xml']; $signature_input = $_POST['signature']; $merc_sig = JString::trim($this->appParams->get('global.jbzoo_cart_config.robox-password1')); $xml_decoded=base64_decode($operation_xml); $my_signature_decoded = base64_encode(sha1($merc_sig . $xml_decoded . $merc_sig, 1)); if ($signature_input === $my_signature_decoded) { if ($xml = simplexml_load_string($xml_decoded)) { foreach($xml as $xmlRow) { if ($xmlRow->getName() == 'order_id') $this->orderId = (int)$xmlRow; if ($xmlRow->getName() == 'status') $status = (string)$xmlRow; } } $this->systemType = self::TYPE_ROBOX; } } else if ($invId = (int)$this->_jbreq->get('InvId')) {далее функция paymentCallback()
меняем всю ветку по робокассе:
if ($this->systemType == self::TYPE_ROBOX) {на:
if ($this->systemType == self::TYPE_ROBOX) { if (isset($_POST['operation_xml']) && isset($_POST['signature'])){ $operation_xml = $_POST['operation_xml']; $signature_input = $_POST['signature']; $merc_sig = JString::trim($this->appParams->get('global.jbzoo_cart_config.robox-password1')); $xml_decoded=base64_decode($operation_xml); $my_signature_decoded = base64_encode(sha1($merc_sig . $xml_decoded . $merc_sig, 1)); // формируем свою подпись для проверки if ($signature_input === $my_signature_decoded) { // подпись аутентична if ($xml = simplexml_load_string($xml_decoded)) { // парсим XML foreach($xml as $xmlRow) { if ($xmlRow->getName() == 'order_id') $this->orderId = (int)$xmlRow; if ($xmlRow->getName() == 'status') $status = (string)$xmlRow; } } // get request vars $args = array( 'date' => $this->app->date->create()->toSQL(), 'system' => $this->systemType, 'additionalState' => $status ); // execute callback method $this->orderDetails->callback('paymentCallback', $args); jexit('OK' . $this->orderId); } else { throw new PaymentJBUniversalControllerException('No valid hash'); } } else { throw new PaymentJBUniversalControllerException('Empty data from liqpay'); } } else if ($this->systemType == self::TYPE_IKASSA) {Все. После 70+ тренеровочных оплат по 3 копейки (ну нет у привата тестового режима) я смог заставить принимать и правильно обрабываться каллбек.
Проблема была в том, что после _init функция обрывалась и не возвращалась в callback
Когда я получил id заказа в _init я смог продвинуться дальше.
Надеюсь комуто пригодится.