Перейти к содержимому


Фото
- - - - -

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

Liqpay

  • Чтобы отвечать, сперва войдите на форум
20 ответов в теме

#1 ZGG

ZGG
  • Пользователь
  • 8 сообщений
  • Заказчик
  • Версия CMS:2.x

Опубликовано 25.03.2014 - 23:13

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

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

 

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

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

 

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

 

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

Прикрепленные файлы:



#2 pikusov

pikusov

    Автор Simpla CMS

  • Администратор
  • 946 сообщений

Опубликовано 25.03.2014 - 23:40

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

 

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

на

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



#3 ZGG

ZGG
  • Пользователь
  • 8 сообщений
  • Заказчик
  • Версия CMS:2.x

Опубликовано 26.03.2014 - 00:15

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

 

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


#4 pikusov

pikusov

    Автор Simpla CMS

  • Администратор
  • 946 сообщений

Опубликовано 26.03.2014 - 00:28

Возможно сейчас что-то изменилось, но раньше 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  ?



#5 pikusov

pikusov

    Автор Simpla CMS

  • Администратор
  • 946 сообщений

Опубликовано 26.03.2014 - 00:37

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



#6 ZGG

ZGG
  • Пользователь
  • 8 сообщений
  • Заказчик
  • Версия CMS:2.x

Опубликовано 26.03.2014 - 01:03

Возможно сейчас что-то изменилось, но раньше 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.c...er_id_duplicate



#7 pikusov

pikusov

    Автор Simpla CMS

  • Администратор
  • 946 сообщений

Опубликовано 26.03.2014 - 01:09

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

Изменил немного 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.c...er_id_duplicate

 

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



#8 ZGG

ZGG
  • Пользователь
  • 8 сообщений
  • Заказчик
  • Версия CMS:2.x

Опубликовано 26.03.2014 - 12:19

Общался сегодня в чате с представителем Приват Банка по поводу ошибки order_id_duplicate:

 

1jpg_9733965_11409731.jpg

 

2jpg_3092826_11409738.jpg



#9 pikusov

pikusov

    Автор Simpla CMS

  • Администратор
  • 946 сообщений

Опубликовано 26.03.2014 - 21:13

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



#10 pikusov

pikusov

    Автор Simpla CMS

  • Администратор
  • 946 сообщений

Опубликовано 27.03.2014 - 17:01

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

Прикрепленные файлы:

  • Прикрепленный файл  Liqpay.zip   3,82К   107 раз скачано


#11 jacko

jacko
  • Пользователь
  • 9 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x

Опубликовано 31.03.2014 - 17:12

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

 

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



#12 pikusov

pikusov

    Автор Simpla CMS

  • Администратор
  • 946 сообщений

Опубликовано 31.03.2014 - 17:36

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

 

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



#13 jacko

jacko
  • Пользователь
  • 9 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x

Опубликовано 31.03.2014 - 17:42

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

 

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



#14 pikusov

pikusov

    Автор Simpla CMS

  • Администратор
  • 946 сообщений

Опубликовано 31.03.2014 - 18:05

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

 

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

 

заменить на

 

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

 

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



#15 pikusov

pikusov

    Автор Simpla CMS

  • Администратор
  • 946 сообщений

Опубликовано 31.03.2014 - 18:10

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

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

$session['liqpay'] = 1;

 

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

 

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



#16 jacko

jacko
  • Пользователь
  • 9 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x

Опубликовано 31.03.2014 - 18:49

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



#17 RuslanBZ

RuslanBZ
  • Пользователь
  • 16 сообщений

Опубликовано 01.04.2014 - 17:16

У меня

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

 

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



#18 ZGG

ZGG
  • Пользователь
  • 8 сообщений
  • Заказчик
  • Версия CMS:2.x

Опубликовано 03.04.2014 - 20:09

У меня

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

 

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

 

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

http://forum.simplac...php/#entry54097



#19 Kostyafan

Kostyafan
  • Пользователь
  • 57 сообщений
  • Заказчик
  • Версия CMS:2.x
  • Откуда:МО

Опубликовано 08.06.2014 - 15:09

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

http://prntscr.com/3qs3gs

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



#20 Kostyafan

Kostyafan
  • Пользователь
  • 57 сообщений
  • Заказчик
  • Версия CMS:2.x
  • Откуда:МО

Опубликовано 08.06.2014 - 15:13

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

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

$session['liqpay'] = 1;

 

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

 

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

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

И так же в order.tpl







Также с меткой «Liqpay»

0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых