Перейти к содержанию
Официальный форум поддержки Simpla

Liqpay, некорректно работает callback.php


Рекомендуемые сообщения

Здравствуйте.

После совершения оплаты через Liqpay идет перенаправление на /payment/Liqpay/callback.php, который должен засчитать оплату заказа и перенаправить клиента на страницу заказа.

 

Оплата засчитывается, но нет перенаправления. В строке браузера вижу http://сайт.ру/payment/Liqpay/callback.php и пустую страницу. 

В кабинете Liqpay оплата success, в адмике сиплы заказ оплачен, письма клиенту и мне отправились, но вот перенаправление на главную страницу не выполнилось.

 

Если же оплата в Liqpay завершилась неудачно, то после перенаправления на /payment/Liqpay/callback.php, никакой ошибке на показывает, пустая страница.

 

Может кто сталкивался с такой проблемой, как решали?

callback.php

Liqpay.php

settings.xml

Ссылка на сообщение
Поделиться на другие сайты

Попробуйте в callback.php заменить

 

header('Location: '.$simpla->request->root_url.'/order/'.$order->url);

на

header('Location: '.$simpla->config->root_url.'/order/'.$order->url);

Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответ.

 

Я нашел в чем проблема. 
Сначала Liqpay отправляет operation_xml в server_url.  А потом перенаправляет клиента на result_url, но без передачи operation_xml.
 
Надо сделать еще обработчик на result_url, который будет перенаправлять клиента на страницу его заказа. Только вот как узнать тогда order_id клиента? :)
Ссылка на сообщение
Поделиться на другие сайты

Возможно сейчас что-то изменилось, но раньше liqpay работал по такой схеме:

 

1) Покупетель переходит на liqpay

2) Покупатель совершает оплату

3) Liqpay перенаправляет пользователя на result_url

4) Важно! Liqpay отправляет operation_xml в server_url. После (!) перенаправления пользователя в магазин

 

Соответственно, пользователь, перейдя в магазин, видит что заказа еще не оплачен. Хотя через пару секунд прийдет оповещение на server_url.

 

Избежать такой проблемы удалось благодаря тому, что Liqpay отправляет operation_xml не только на server_url, а и на result_url при перенаправлении туда пользователя. Поэтому в качестве result_url нужно указывать тот же адрес что и server_url, то есть ..../callback.php, который обработает operation_xml и перенаправит пользователя на страницу заказа.

 

Возможно, что в liqpay сейчас что-то изменилось, и эта схема перестала работать. Вы указываете result_url такой же как и result_url? То есть http://сайт.ру/payme...ay/callback.php  ?

Ссылка на сообщение
Поделиться на другие сайты

 

Возможно сейчас что-то изменилось, но раньше liqpay работал по такой схеме:

 

1) Покупетель переходит на liqpay

2) Покупатель совершает оплату

3) Liqpay перенаправляет пользователя на result_url

4) Важно! Liqpay отправляет operation_xml в server_url. После (!) перенаправления пользователя в магазин

 

Соответственно, пользователь, перейдя в магазин, видит что заказа еще не оплачен. Хотя через пару секунд прийдет оповещение на server_url.

 

Избежать такой проблемы удалось благодаря тому, что Liqpay отправляет operation_xml не только на server_url, а и на result_url при перенаправлении туда пользователя. Поэтому в качестве result_url нужно указывать тот же адрес что и server_url, то есть ..../callback.php, который обработает operation_xml и перенаправит пользователя на страницу заказа.

 

Возможно, что в liqpay сейчас что-то изменилось, и эта схема перестала работать. Вы указываете result_url такой же как и result_url? То есть http://сайт.ру/payme...ay/callback.php  ?

 

Скорее всего, поменялся механизм у ликпея.

Изменил немного callback.php:

<?php

/**
 * Simpla CMS
 *
 * @copyright 	2011 Denis Pikusov
 * @link 		http://simplacms.ru
 * @author 		Denis Pikusov
 *
 * К этому скрипту обращается Liqpay в процессе оплаты
 *
 */
// Работаем в корневой директории
chdir('../../');
require_once('api/Simpla.php');
$simpla = new Simpla();

if (isset($_POST["operation_xml"]) && !empty($_POST["operation_xml"])) {

    $xml = base64_decode($_POST['operation_xml']);
    $signature = $_POST['signature'];

// Выбираем из xml нужные данные
    $order_id = intval(get_tag_val($xml, 'order_id'));
    $merchant_id = get_tag_val($xml, 'merchant_id');
    $amount = get_tag_val($xml, 'amount');
    $currency_code = get_tag_val($xml, 'currency');
    $status = get_tag_val($xml, 'status');

    if ($status !== 'success')
        exit();

////////////////////////////////////////////////
// Выберем заказ из базы
////////////////////////////////////////////////
    $order = $simpla->orders->get_order(intval($order_id));
    if (empty($order))
        die('Оплачиваемый заказ не найден');

////////////////////////////////////////////////
// Выбираем из базы соответствующий метод оплаты
////////////////////////////////////////////////
    $method = $simpla->payment->get_payment_method(intval($order->payment_method_id));
    if (empty($method))
        die("Неизвестный метод оплаты");

    $settings = unserialize($method->settings);
    $payment_currency = $simpla->money->get_currency(intval($method->currency_id));

// Проверяем контрольную подпись
    $mysignature = base64_encode(sha1($settings['liqpay_sign'] . $xml . $settings['liqpay_sign'], 1));
    if ($mysignature !== $signature)
        die("bad sign");

// Нельзя оплатить уже оплаченный заказ  
    if ($order->paid)
        die('Этот заказ уже оплачен');

    if ($amount != round($simpla->money->convert($order->total_price, $method->currency_id, false), 2) || $amount <= 0)
        die("incorrect price");

    if ($currency_code != $payment_currency->code)
        die("incorrect currency");

// Установим статус оплачен
    $simpla->orders->update_order(intval($order->id), array('paid' => 1));

// Отправим уведомление на email
    $simpla->notify->email_order_user(intval($order->id));
    $simpla->notify->email_order_admin(intval($order->id));

// Спишем товары  
    $simpla->orders->close(intval($order->id));

    function get_tag_val($xml, $name) {
        preg_match("/<$name>(.*)<\/$name>/i", $xml, $matches);
        return trim($matches[1]);
    }

} else {

    header('Location: ' . $simpla->request->root_url . '/order/');
    exit();
    
}

 

 

Попробуйте в качестве result url указать сайт.ру/order/

 

Да, пересылает.

Но вот если клиент еще раз нажимает на кнопку "Прейти к оплате", то получает https://www.liqpay.com/ru/pay/error/order_id_duplicate

Ссылка на сообщение
Поделиться на другие сайты

Скорее всего, поменялся механизм у ликпея.

Изменил немного callback.php:

<?php

/**
 * Simpla CMS
 *
 * @copyright 	2011 Denis Pikusov
 * @link 		http://simplacms.ru
 * @author 		Denis Pikusov
 *
 * К этому скрипту обращается Liqpay в процессе оплаты
 *
 */
// Работаем в корневой директории
chdir('../../');
require_once('api/Simpla.php');
$simpla = new Simpla();

if (isset($_POST["operation_xml"]) && !empty($_POST["operation_xml"])) {

    $xml = base64_decode($_POST['operation_xml']);
    $signature = $_POST['signature'];

// Выбираем из xml нужные данные
    $order_id = intval(get_tag_val($xml, 'order_id'));
    $merchant_id = get_tag_val($xml, 'merchant_id');
    $amount = get_tag_val($xml, 'amount');
    $currency_code = get_tag_val($xml, 'currency');
    $status = get_tag_val($xml, 'status');

    if ($status !== 'success')
        exit();

////////////////////////////////////////////////
// Выберем заказ из базы
////////////////////////////////////////////////
    $order = $simpla->orders->get_order(intval($order_id));
    if (empty($order))
        die('Оплачиваемый заказ не найден');

////////////////////////////////////////////////
// Выбираем из базы соответствующий метод оплаты
////////////////////////////////////////////////
    $method = $simpla->payment->get_payment_method(intval($order->payment_method_id));
    if (empty($method))
        die("Неизвестный метод оплаты");

    $settings = unserialize($method->settings);
    $payment_currency = $simpla->money->get_currency(intval($method->currency_id));

// Проверяем контрольную подпись
    $mysignature = base64_encode(sha1($settings['liqpay_sign'] . $xml . $settings['liqpay_sign'], 1));
    if ($mysignature !== $signature)
        die("bad sign");

// Нельзя оплатить уже оплаченный заказ  
    if ($order->paid)
        die('Этот заказ уже оплачен');

    if ($amount != round($simpla->money->convert($order->total_price, $method->currency_id, false), 2) || $amount <= 0)
        die("incorrect price");

    if ($currency_code != $payment_currency->code)
        die("incorrect currency");

// Установим статус оплачен
    $simpla->orders->update_order(intval($order->id), array('paid' => 1));

// Отправим уведомление на email
    $simpla->notify->email_order_user(intval($order->id));
    $simpla->notify->email_order_admin(intval($order->id));

// Спишем товары  
    $simpla->orders->close(intval($order->id));

    function get_tag_val($xml, $name) {
        preg_match("/<$name>(.*)<\/$name>/i", $xml, $matches);
        return trim($matches[1]);
    }

} else {

    header('Location: ' . $simpla->request->root_url . '/order/');
    exit();
    
}

 

 

Да, пересылает.

Но вот если клиент еще раз нажимает на кнопку "Прейти к оплате", то получает https://www.liqpay.com/ru/pay/error/order_id_duplicate

 

Только что сделал новый модуль для liqpay на основе их нового API второй версии, напишите пожалуйста на info@simplacms.ru, я отправлю вам архив, попробуете его

Ссылка на сообщение
Поделиться на другие сайты

Проблему с order_id_duplicate удалось решить подсовыванием ликпею номера заказа с рандомной добавкой, например 15-6549363. Скоро выложу свежий модуль для оплаты liqpay.

Ссылка на сообщение
Поделиться на другие сайты

Прикладываю новый модуль Liqpay, работающий на второй версии Liqpay API. Для его установки замените папку payment/Liqpay и настройте заново способ оплаты Liqpay в разделе Настройки->Оплата

Liqpay.zip

Ссылка на сообщение
Поделиться на другие сайты

Прикладываю новый модуль Liqpay, работающий на второй версии Liqpay API. Для его установки замените папку payment/Liqpay и настройте заново способ оплаты Liqpay в разделе Настройки->Оплата

 

если liqpay  отдает нам  status как wait_secure,  то после перенаправления страницы мы получаем сообщение о том, что заказ всё еще не оплачен и система предлагает повторно его оплатить ?  (хотя по сути ответ wait secure на liqpay в последнее время частенько бывает - это когда платеж на проверке). То есть получается нужно организовать еще один статус заказа:  на проверке ?

Ссылка на сообщение
Поделиться на другие сайты

если liqpay  отдает нам  status как wait_secure,  то после перенаправления страницы мы получаем сообщение о том, что заказ всё еще не оплачен и система предлагает повторно его оплатить ?  (хотя по сути ответ wait secure на liqpay в последнее время частенько бывает - это когда платеж на проверке). То есть получается нужно организовать еще один статус заказа:  на проверке ?

 

Вы можете создать промежуточную страницу, на которой написать для пользователя сообщение "Ожидайте подтверждения оплаты", и указать ее в качестве страницы возврата с Liqpay.

Ссылка на сообщение
Поделиться на другие сайты

Вы можете создать промежуточную страницу, на которой написать для пользователя сообщение "Ожидайте подтверждения оплаты", и указать ее в качестве страницы возврата с Liqpay.

 

Решение интересное, но как быть в ситуации, когда пользователь зайдет в свой лист заказов и по второму кругу оплатит уже оплаченный заказ (ведь в листе заказов - по прежнему будет предлагать оплатить, пока liqpay не отдаст status success) ? ;)

Ссылка на сообщение
Поделиться на другие сайты

Можно удалить случайное число из номера заказа (файл Liqpay.php)

 

$liqpay_order_id = $order->id."-".rand(100000, 999999);

 

заменить на

 

$liqpay_order_id = $order->id."-";

 

В этом случае liqpay не даст оплатить заказ еще раз. Но тогда и после неудачной попытки оплаты (например неверно введен cvv карты) он не даст больше возможности оплатить. К сожалению, liqpay работает так криво, что приходится делать для него эти все костыли. Например, он даже не интересуется пришло ли магазину уведомление и даёт ли магазин добро на оплату текущего заказа.

Ссылка на сообщение
Поделиться на другие сайты

Еще как вариант, похожий на то что вы предложили, но без добавления специального статуса заказа для liqpay: записать в сессию флаг о то, что выбрана оплата через liqpay:

в Liqpay.php добавить

$session['liqpay'] = 1;

 

а в order.tpl написать что-то такое:

 

{if $smarty.session.liqpay && !$order->paid}Ваша оплата liqpay ожидает подтвердения{/if}

Ссылка на сообщение
Поделиться на другие сайты

Да, с помощью сессии можно решить этот вопрос гораздо проще и рандомное число у заказа убирать не нужно - просто спрятать кнопку оплаты, если заказ на проверке. Спасибо.

Ссылка на сообщение
Поделиться на другие сайты

У меня

  • Если оплата прошла удачно перенаправляет на  /payment/Liqpay/callback.php которая пустая, дальше никуда не перенаправляет
  • Также есть ошибка с order_id_duplicate
  • Еще Liqpay не проставляет дату оплаты, если оплата прошла успешно.

 

Если кто доделает модуль выложите пожалуйста нормальный.

Ссылка на сообщение
Поделиться на другие сайты

У меня

  • Если оплата прошла удачно перенаправляет на  /payment/Liqpay/callback.php которая пустая, дальше никуда не перенаправляет
  • Также есть ошибка с order_id_duplicate
  • Еще Liqpay не проставляет дату оплаты, если оплата прошла успешно.

 

Если кто доделает модуль выложите пожалуйста нормальный.

 

Замените модель оплаты Ликпей:

http://forum.simplacms.ru/topic/7090-liqpay-%D0%BD%D0%B5%D0%BA%D0%BE%D1%80%D1%80%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82-callbackphp/?do=findComment&comment=54097

Ссылка на сообщение
Поделиться на другие сайты
  • 2 месяца спустя...

Подскажите все таки, правильно писать как ЛикПэй предлагает или все же "сайт/payment/Liqpay/callback.php"?

http://prntscr.com/3qs3gs

И галочки надо включать?
 

Ссылка на сообщение
Поделиться на другие сайты

Еще как вариант, похожий на то что вы предложили, но без добавления специального статуса заказа для liqpay: записать в сессию флаг о то, что выбрана оплата через liqpay:

в Liqpay.php добавить

$session['liqpay'] = 1;

 

а в order.tpl написать что-то такое:

 

{if $smarty.session.liqpay && !$order->paid}Ваша оплата liqpay ожидает подтвердения{/if}

И подскажите в файле Liqpay.php в какой строчке вставлять лучше?

И так же в order.tpl

Ссылка на сообщение
Поделиться на другие сайты
  • 1 год спустя...

Только что сделал новый модуль для liqpay на основе их нового API второй версии, напишите пожалуйста на info@simplacms.ru, я отправлю вам архив, попробуете его

 

 

Автор, а сможете сделать новый модуль для третьей версии API? Оплата через раз проходит, непонятно, в чем проблема.

Изменено пользователем bananovsv
Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...