ZGG Опубликовано 25 марта, 2014 Жалоба Поделиться Опубликовано 25 марта, 2014 Здравствуйте.После совершения оплаты через Liqpay идет перенаправление на /payment/Liqpay/callback.php, который должен засчитать оплату заказа и перенаправить клиента на страницу заказа. Оплата засчитывается, но нет перенаправления. В строке браузера вижу http://сайт.ру/payment/Liqpay/callback.php и пустую страницу. В кабинете Liqpay оплата success, в адмике сиплы заказ оплачен, письма клиенту и мне отправились, но вот перенаправление на главную страницу не выполнилось. Если же оплата в Liqpay завершилась неудачно, то после перенаправления на /payment/Liqpay/callback.php, никакой ошибке на показывает, пустая страница. Может кто сталкивался с такой проблемой, как решали?callback.phpLiqpay.phpsettings.xml Цитата Ссылка на сообщение Поделиться на другие сайты
pikusov Опубликовано 25 марта, 2014 Жалоба Поделиться Опубликовано 25 марта, 2014 Попробуйте в callback.php заменить header('Location: '.$simpla->request->root_url.'/order/'.$order->url); на header('Location: '.$simpla->config->root_url.'/order/'.$order->url); Цитата Ссылка на сообщение Поделиться на другие сайты
ZGG Опубликовано 25 марта, 2014 Автор Жалоба Поделиться Опубликовано 25 марта, 2014 Спасибо за ответ. Я нашел в чем проблема. Сначала Liqpay отправляет operation_xml в server_url. А потом перенаправляет клиента на result_url, но без передачи operation_xml. Надо сделать еще обработчик на result_url, который будет перенаправлять клиента на страницу его заказа. Только вот как узнать тогда order_id клиента? Цитата Ссылка на сообщение Поделиться на другие сайты
pikusov Опубликовано 25 марта, 2014 Жалоба Поделиться Опубликовано 25 марта, 2014 Возможно сейчас что-то изменилось, но раньше liqpay работал по такой схеме: 1) Покупетель переходит на liqpay2) Покупатель совершает оплату3) Liqpay перенаправляет пользователя на result_url4) Важно! 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 ? Цитата Ссылка на сообщение Поделиться на другие сайты
pikusov Опубликовано 25 марта, 2014 Жалоба Поделиться Опубликовано 25 марта, 2014 Попробуйте в качестве result url указать сайт.ру/order/ Цитата Ссылка на сообщение Поделиться на другие сайты
ZGG Опубликовано 25 марта, 2014 Автор Жалоба Поделиться Опубликовано 25 марта, 2014 Возможно сейчас что-то изменилось, но раньше liqpay работал по такой схеме: 1) Покупетель переходит на liqpay2) Покупатель совершает оплату3) Liqpay перенаправляет пользователя на result_url4) Важно! 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 Цитата Ссылка на сообщение Поделиться на другие сайты
pikusov Опубликовано 25 марта, 2014 Жалоба Поделиться Опубликовано 25 марта, 2014 Скорее всего, поменялся механизм у ликпея.Изменил немного 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, я отправлю вам архив, попробуете его Цитата Ссылка на сообщение Поделиться на другие сайты
ZGG Опубликовано 26 марта, 2014 Автор Жалоба Поделиться Опубликовано 26 марта, 2014 Общался сегодня в чате с представителем Приват Банка по поводу ошибки order_id_duplicate: Цитата Ссылка на сообщение Поделиться на другие сайты
pikusov Опубликовано 26 марта, 2014 Жалоба Поделиться Опубликовано 26 марта, 2014 Проблему с order_id_duplicate удалось решить подсовыванием ликпею номера заказа с рандомной добавкой, например 15-6549363. Скоро выложу свежий модуль для оплаты liqpay. Цитата Ссылка на сообщение Поделиться на другие сайты
pikusov Опубликовано 27 марта, 2014 Жалоба Поделиться Опубликовано 27 марта, 2014 Прикладываю новый модуль Liqpay, работающий на второй версии Liqpay API. Для его установки замените папку payment/Liqpay и настройте заново способ оплаты Liqpay в разделе Настройки->ОплатаLiqpay.zip Цитата Ссылка на сообщение Поделиться на другие сайты
jacko Опубликовано 31 марта, 2014 Жалоба Поделиться Опубликовано 31 марта, 2014 Прикладываю новый модуль Liqpay, работающий на второй версии Liqpay API. Для его установки замените папку payment/Liqpay и настройте заново способ оплаты Liqpay в разделе Настройки->Оплата если liqpay отдает нам status как wait_secure, то после перенаправления страницы мы получаем сообщение о том, что заказ всё еще не оплачен и система предлагает повторно его оплатить ? (хотя по сути ответ wait secure на liqpay в последнее время частенько бывает - это когда платеж на проверке). То есть получается нужно организовать еще один статус заказа: на проверке ? Цитата Ссылка на сообщение Поделиться на другие сайты
pikusov Опубликовано 31 марта, 2014 Жалоба Поделиться Опубликовано 31 марта, 2014 если liqpay отдает нам status как wait_secure, то после перенаправления страницы мы получаем сообщение о том, что заказ всё еще не оплачен и система предлагает повторно его оплатить ? (хотя по сути ответ wait secure на liqpay в последнее время частенько бывает - это когда платеж на проверке). То есть получается нужно организовать еще один статус заказа: на проверке ? Вы можете создать промежуточную страницу, на которой написать для пользователя сообщение "Ожидайте подтверждения оплаты", и указать ее в качестве страницы возврата с Liqpay. Цитата Ссылка на сообщение Поделиться на другие сайты
jacko Опубликовано 31 марта, 2014 Жалоба Поделиться Опубликовано 31 марта, 2014 Вы можете создать промежуточную страницу, на которой написать для пользователя сообщение "Ожидайте подтверждения оплаты", и указать ее в качестве страницы возврата с Liqpay. Решение интересное, но как быть в ситуации, когда пользователь зайдет в свой лист заказов и по второму кругу оплатит уже оплаченный заказ (ведь в листе заказов - по прежнему будет предлагать оплатить, пока liqpay не отдаст status success) ? Цитата Ссылка на сообщение Поделиться на другие сайты
pikusov Опубликовано 31 марта, 2014 Жалоба Поделиться Опубликовано 31 марта, 2014 Можно удалить случайное число из номера заказа (файл Liqpay.php) $liqpay_order_id = $order->id."-".rand(100000, 999999); заменить на $liqpay_order_id = $order->id."-"; В этом случае liqpay не даст оплатить заказ еще раз. Но тогда и после неудачной попытки оплаты (например неверно введен cvv карты) он не даст больше возможности оплатить. К сожалению, liqpay работает так криво, что приходится делать для него эти все костыли. Например, он даже не интересуется пришло ли магазину уведомление и даёт ли магазин добро на оплату текущего заказа. Цитата Ссылка на сообщение Поделиться на другие сайты
pikusov Опубликовано 31 марта, 2014 Жалоба Поделиться Опубликовано 31 марта, 2014 Еще как вариант, похожий на то что вы предложили, но без добавления специального статуса заказа для liqpay: записать в сессию флаг о то, что выбрана оплата через liqpay:в Liqpay.php добавить$session['liqpay'] = 1; а в order.tpl написать что-то такое: {if $smarty.session.liqpay && !$order->paid}Ваша оплата liqpay ожидает подтвердения{/if} Цитата Ссылка на сообщение Поделиться на другие сайты
jacko Опубликовано 31 марта, 2014 Жалоба Поделиться Опубликовано 31 марта, 2014 Да, с помощью сессии можно решить этот вопрос гораздо проще и рандомное число у заказа убирать не нужно - просто спрятать кнопку оплаты, если заказ на проверке. Спасибо. Цитата Ссылка на сообщение Поделиться на другие сайты
RuslanBZ Опубликовано 1 апреля, 2014 Жалоба Поделиться Опубликовано 1 апреля, 2014 У меняЕсли оплата прошла удачно перенаправляет на /payment/Liqpay/callback.php которая пустая, дальше никуда не перенаправляетТакже есть ошибка с order_id_duplicateЕще Liqpay не проставляет дату оплаты, если оплата прошла успешно. Если кто доделает модуль выложите пожалуйста нормальный. Цитата Ссылка на сообщение Поделиться на другие сайты
ZGG Опубликовано 3 апреля, 2014 Автор Жалоба Поделиться Опубликовано 3 апреля, 2014 У меняЕсли оплата прошла удачно перенаправляет на /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 Цитата Ссылка на сообщение Поделиться на другие сайты
Kostyafan Опубликовано 8 июня, 2014 Жалоба Поделиться Опубликовано 8 июня, 2014 Подскажите все таки, правильно писать как ЛикПэй предлагает или все же "сайт/payment/Liqpay/callback.php"?http://prntscr.com/3qs3gsИ галочки надо включать? Цитата Ссылка на сообщение Поделиться на другие сайты
Kostyafan Опубликовано 8 июня, 2014 Жалоба Поделиться Опубликовано 8 июня, 2014 Еще как вариант, похожий на то что вы предложили, но без добавления специального статуса заказа для liqpay: записать в сессию флаг о то, что выбрана оплата через liqpay:в Liqpay.php добавить$session['liqpay'] = 1; а в order.tpl написать что-то такое: {if $smarty.session.liqpay && !$order->paid}Ваша оплата liqpay ожидает подтвердения{/if}И подскажите в файле Liqpay.php в какой строчке вставлять лучше?И так же в order.tpl Цитата Ссылка на сообщение Поделиться на другие сайты
bananovsv Опубликовано 21 сентября, 2015 Жалоба Поделиться Опубликовано 21 сентября, 2015 (изменено) Только что сделал новый модуль для liqpay на основе их нового API второй версии, напишите пожалуйста на info@simplacms.ru, я отправлю вам архив, попробуете его Автор, а сможете сделать новый модуль для третьей версии API? Оплата через раз проходит, непонятно, в чем проблема. Изменено 21 сентября, 2015 пользователем bananovsv Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.