Не меняеться статус оплаты LiqPay

Тема в разделе "PHP", создана пользователем Slaxor, 9 янв 2015.

Модераторы: latteo
  1. Slaxor

    Slaxor Постоялец

    Регистр.:
    23 май 2012
    Сообщения:
    66
    Симпатии:
    8
    ImageCMS 4.6

    Метод оплаты Liqpay

    Оплата проходит успешно и возбращает строку вида: 0923nz038q?result=true&pm=10&crc=b8f444466d9701e91 ed4bad6f2076760&amount=1&order_id=86

    Но статут заказа не оплачен.

    Вот код самого модуля
    Код:
    <?php
    
    /**
    * Robokassa payment module
    *
    * author: dev@imagecms.net
    * more info at: http://www.robokassa.ru/HowTo.aspx
    */
    class LiqPaySystem extends BasePaymentProcessor {
    
        protected $settigns = null;
    
        public function __construct() {
            $this->order = ShopCore::app()->SPaymentSystems->getOrder();
            $lang = new MY_Lang();
            $lang->load('main');
        }
    
        /**
         * Process payment.
         */
        public function processPayment() {
            // Check if order is paid.
            if ($this->order->getPaid() == true)
                return ERROR_ORDER_PAID_BEFORE;
    
            $data = $this->loadSettings();
            $public_key = $data['merchant_id'];
            //$mrh_pass2 = $data['password2'];
    
            $shp_order_key = $this->order->getKey();
            $shp_payment_id = $this->paymentMethod->getId();
        $out_summ =  $_REQUEST["amount"];
            $inv_id = $_REQUEST["order_id"];
            $crc = strtoupper($_REQUEST["crc"]);   
    
    
            $my_crc = strtoupper(md5("$out_summ:$inv_id:$shp_order_key:$shp_payment_id:$public_key"));
    
           
            // Check sum
            // ціна доставки
            $deliveryPrice = $this->order->getDeliveryPrice();
            if ($out_summ != ShopCore::app()->SCurrencyHelper->convert($deliveryPrice + $productsPrice, $this->paymentMethod->getCurrencyId()))
                return ERROR_SUM;
    
            // Check sign
            if ($my_crc != $crc)
                return "bad sign $out_summ:$inv_id:Shp_orderKey=$shp_order_key:Shp_pmId=$shp_payment_id";
    
            // Set order paid
            $this->setOrderPaid();
    
            // Show answer for Robokassa API service
            if (isset($_REQUEST['getResult']) && $_REQUEST['getResult'] == 'true') {
                echo "OK" . $this->order->getId();
                exit();
            }
    
    
            if (empty($_POST['operation_xml']) && empty($_POST['signature '])) {
                $this->setOrderPaid();
            }
            return true;
        }
    
        /**
         * Create payment form
         *
         * @return string Generated form
         */
        public function getForm() {
            $data = $this->loadSettings();
    
            // Оплата заданной суммы с выбором валюты на сайте LiqPay
            // регистрационная информация (логин, пароль #1)
            $public_key = $data['merchant_id'];
            $private_key = $data['merchant_sig'];
            $shp_order_key = $this->order->getKey();
            $shp_payment_id = $this->paymentMethod->getId();
           
            $productsPrice = $this->order->getTotalPrice();
            // ціна доставки
            $deliveryPrice = $this->order->getDeliveryPrice();
            $out_summ = ShopCore::app()->SCurrencyHelper->convert($deliveryPrice + $productsPrice, $this->paymentMethod->getCurrencyId());     
           // номер заказа
            $inv_id = $this->order->getId();       
            //шифр
            $crc = md5("$out_summ:$inv_id:$shp_order_key:$shp_payment_id:$public_key");
    
            $result_url = shop_url('order/view/'.$shp_order_key.'?result=true&amp;pm=' . $this->paymentMethod->getId() . '&amp;crc='.$crc. '&amp;amount='.$out_summ. '&amp;order_id='.$inv_id);
            //$result_url= 'http://ninjatest.imagecms.net/shop/order/view/';
            $server_url = 'https://ninjatest.imagecms.net/shop/order';
            $type = "buy";
            $language = "ru";
            $lang = new MY_Lang();
            $language1 = $lang->getLangCode();
            if($language1[0] == 'en'){$language = "en";}else($language == 'ru');
           
    
    
            // описание заказа
            $inv_desc = "Оплата заказа номер " . $this->order->getId();
           
    
            // сумма заказа
            //$out_summ = ShopCore::app()->SCurrencyHelper->convert($this->order->getTotalPrice(), $this->paymentMethod->getCurrencyId());
           
            // ціна доставки
            $deliveryPrice = $this->order->getDeliveryPrice();
            $out_summ = ShopCore::app()->SCurrencyHelper->convert($deliveryPrice + $productsPrice, $this->paymentMethod->getCurrencyId());
    
            // предлагаемая валюта платежа
            $ISOCode = SCurrenciesQuery::create()->filterByIsDefault(true)->findOne()->getCode();
    
           
            // форма оплаты товара
            $inv = $private_key . $out_summ . $ISOCode . $public_key . $inv_id . $type . $inv_desc . $result_url . $server_url;
            $inv = html_entity_decode($inv);
            $signature = base64_encode(sha1($inv,1));
           
    
            $xml = "<form method='POST' action='https://www.liqpay.com/api/pay' target='_blank' accept-charset='utf-8'>
              <input type='hidden' name='public_key' value='$public_key' />
              <input type='hidden' name='amount' value='$out_summ' />
              <input type='hidden' name='currency' value='$ISOCode' />
              <input type='hidden' name='description' value='$inv_desc' />
              <input type='hidden' name='order_id' value='$inv_id' />
              <input type='hidden' name='result_url' value='$result_url' />
              <input type='hidden' name='server_url' value='$server_url' />
              <input type='hidden' name='type' value='$type' />
              <input type='hidden' name='signature' value='$signature' />
              <input type='hidden' name='language' value='$language' />
            ";       
           
            $this->render('LiqPay', array(
                'xml_encoded' => $xml
            ));
        }
    
        /**
         * Create configure form
         *
         * @return string
         */
        public function getAdminForm() {
            $data = $this->loadSettings();
    
            $form = '
               
                <div class="control-group">
                    <label class="control-label" for="inputRecCount">' . lang('Public key', 'main') . ':</label>
                    <div class="controls">
                     <input type="text" name="LiqPay[merchant_id]" value="' . $data['merchant_id'] . '"/>
                    </div>
                </div>
                <div class="control-group">
                    <label class="control-label" for="inputRecCount">' . lang('Private key', 'main') . ':</label>
                    <div class="controls">
                     <input type="text" name="LiqPay[merchant_sig]" value="' . $data['merchant_sig'] . '" />
                    </div>
                </div>
        
            ';
    
            return $form;
        }
    
        /**
         * Save settings
         *
         * @return bool|string
         */
        public function saveSettings(SPaymentMethods $paymentMethod) {
            $saveKey = $paymentMethod->getId() . '_LiqPayData';
            ShopCore::app()->SSettings->set($saveKey, serialize($_POST['LiqPay']));
    
            return true;
        }
    
        /**
         * Load Robokassa settings
         *
         * @return array
         */
        protected function loadSettings() {
            $settingsKey = $this->paymentMethod->getId() . '_LiqPayData';
            $data = unserialize(ShopCore::app()->SSettings->$settingsKey);
            if ($data === false)
                $data = array();
            return array_map('encode', $data);
        }
    
    }
     
  2. HaKyPeHHbIu Nike

    HaKyPeHHbIu Nike Постоялец

    Регистр.:
    17 мар 2010
    Сообщения:
    116
    Симпатии:
    23
    У Вас статус магазина в личном кабинете стоит Активирован? Если там написано подключен без возмещения, то платежи будут проходить но статус оплаты меняться не будет.
    Еще проверьте в личном кабинете LiqPay лог вызова API, там должен быть код 200.
     
  3. Slaxor

    Slaxor Постоялец

    Регистр.:
    23 май 2012
    Сообщения:
    66
    Симпатии:
    8
    Магазин активирован, проблема осталась

    Можно подробнее где именно?
     
  4. HaKyPeHHbIu Nike

    HaKyPeHHbIu Nike Постоялец

    Регистр.:
    17 мар 2010
    Сообщения:
    116
    Симпатии:
    23
    Открываете раздел бизнес, далее история платежей и кликаете на вот эту иконку:
    http://i077.radikal.ru/1501/19/71265e89f93f.png
    У вас появится страница со следущим содержимым:
    http://i004.radikal.ru/1501/c1/8ff937d4be04.png
    Там сможете посмотреть лог вызова API
    Выше в этом же окне, в разделе магазин проверьте адрес API Callback
     
    Последнее редактирование: 9 янв 2015
  5. Slaxor

    Slaxor Постоялец

    Регистр.:
    23 май 2012
    Сообщения:
    66
    Симпатии:
    8
    Последнее редактирование: 10 янв 2015
  6. Slaxor

    Slaxor Постоялец

    Регистр.:
    23 май 2012
    Сообщения:
    66
    Симпатии:
    8
    Поменял API callback на свой домен /shop/order

    [​IMG]

    [​IMG]
     
  7. HaKyPeHHbIu Nike

    HaKyPeHHbIu Nike Постоялец

    Регистр.:
    17 мар 2010
    Сообщения:
    116
    Симпатии:
    23
    А вот здесь уже помочь не смогу, т.к с ImageCMS не знаком.
    Но мне кажется, API callback не правильный, в скрипте должен быть модуль оплаты LiqPay.
    Например, у меня в rootpanel API callback: http://domain.tld/online_liqpay.php
    Смотрите настройки скрипта, в самом кабинете LiqPay настраивать ничего не нужно обычно.
     
  8. MikeIceman

    MikeIceman Писатель

    Регистр.:
    20 мар 2013
    Сообщения:
    2
    Симпатии:
    3
    Нужно
    PHP:
    $server_url 'https://ninjatest.imagecms.net/shop/order';
    заменить на
    PHP:
    $server_url 'http(s)://твойсайт.ру/shop/order';
    Ошибка в адресе коллбека как написал предыдущий автор.

    UPD Я бы сделал так:
    PHP:
    $server_url 'http'.((isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") ? 's' '').'://'.$_SERVER["HTTP_HOST"].'/shop/order'
    UPD2 Видимо дело не только в этом адресе. Нужно серьёзнее дебажить, где-то в коде ошибка.
     
    Последнее редактирование: 12 янв 2015
  9. Watches

    Watches Писатель

    Регистр.:
    15 июл 2015
    Сообщения:
    5
    Симпатии:
    0
    У LiqPay'я очень требователен к id и прочему
    тестируй выходные-входные параметры
    у нас ситуация решилась именно подбором удачной генерации выходных параметров
     
  10. Homjak

    Homjak Создатель

    Регистр.:
    17 авг 2009
    Сообщения:
    14
    Симпатии:
    1
    Банально тесть вход и выход и ищи багу