Обработка Нового Способа Оплаты

Здравствуйте, Даниил

Подключили новый способ оплаты (стандартный post запрос на сервис платежной системы).
Данные они получают, все проходит хорошо до момента редиректа с платежной системы на наш сайт.
Платежная система обработала заказ, с ним все хорошо, она переводит пользователя обратно на наш сайт по "okUrl", который мы ей даем.
В платежном процессоре мы обрабатываем ответ как Вы объясняли в видео:

if(defined('PAYMENT_NOTIFICATION')){
if($mode == 'ok'){
$order_id = $_REQUEST['order_id'];
$pp_response = array();
$order_status = 'P';
$pp_response = array(
'order_status' => $order_status,
'order_id' => $order_id
);
}
if($mode == 'fail'){
$order_status = 'F';
}
fn_finish_payment($order_id, $pp_response, false);
fn_order_placement_routines('route', $order_id, false);
exit;
}else{ ... здесь передаются данные платежной системе ... }

Есть и другие моды, но не суть, т.к. нас бросает именно сюда.
Проблема в том, что в обработчик мы не приходим, хотя ссылка верная.
Пробовали ставить в обработчик if($mode == 'ok'){ fn_print_die($_REQUEST);}
Но толку не было, нам показывается белый экран с надписью CS-Cart 4.3.3 (наша текущая версия)

Заказ сохраняется правильно, но из-за того, что мы попадаем не весть куда, не получается завершить заказ. Получается, что клиент видит белый экран, если обновит страницу, то получит ошибку, что был получен отказ от платежной системы, а на самом деле, деньги клиент оплатил и заказ оформлен.

Помогите, пожалуйста

Пожалуйста, укажите ссылки которые используете.

Документация тоже не помешает.

$okUrl = fn_url("payment_notification.ok&payment=svetofor_demirbank&order_id=$order_id");
$failUrl = fn_url("payment_notification.fail&payment=svetofor_demirbank&order_id=$order_id");
файл процессора (без конфиденциальных данных, Вы уж простите):
use Tygh\Http;
use Tygh\Registry;
if (!defined('BOOTSTRAP')) { die('Access denied'); }
if(defined('PAYMENT_NOTIFICATION')){
    if($mode == 'ok'){
        $order_id = $_REQUEST['order_id'];
        $pp_response = array();
        $order_status = 'P';
    $pp_response = array(
        'order_status' => $order_status,
        'order_id' => $order_id
    );
}
if($mode == 'fail'){
    $order_status = 'F';
}


fn_finish_payment($order_id, $pp_response, false);
fn_order_placement_routines('route', $order_id, false);


exit;

} else {
$post_address = ‘тут тестовый урл’;
$post_data = array(

‘okUrl’ => $okUrl,
‘failUrl’ => $failUrl,

);

fn_create_payment_form($post_address, $post_data, ‘svetofor_tobank’,false);

}

файл процессора (без конфиденциальных данных, Вы уж простите):

А зачем нам конфиденциальные данные :)

Посмотрите лог веб сервера. По какой ссылке возвращается?

Добавьте в начале файла логирование всех запросов и посмотрите что приходит

пример для 4.3.4:

if (!defined('BOOTSTRAP')) { die('Access denied'); }

$path = fn_get_files_dir_path();
fn_mkdir($path);
$file = fopen($path . ‘request.log’, ‘a’);

if (!empty($file)) {
fputs($file, 'TIME: ’ . date(‘Y-m-d H:i:s’, time()) . “\n”);
fputs($file, fn_array2code_string($_REQUEST) . “\n\n”);
fclose($file);
}

if(defined(‘PAYMENT_NOTIFICATION’)){

В логах - это:
TIME: 2015-10-06 14:26:56
array(
        'payment_id' => 30,
        'result_ids' => 'checkout*,step_four',
        'dispatch' => 'checkout.place_order',
        'customer_notes' => 'п╬п╩я─п╩п╬я─п╬п╩',
        'update_steps' => 1,
        'user_data' => '',
        'update_step' => 'step_four',
)

Такое ощущение, что в массиве с параметрами, который приходит с платежки есть параметр version, который и показывает белый экран с версией магазина.

Для того, чтобы исключить этот момент, откройте файл init.php и закомментируйте следующий код:

if (isset($_REQUEST['version'])) {
    die(PRODUCT_NAME . ' ' . PRODUCT_VERSION . ' ' . (PRODUCT_STATUS != '' ? (' (' . PRODUCT_STATUS . ')') : '') . (PRODUCT_BUILD != '' ? (' ' . PRODUCT_BUILD) : '') . '');
}

В логах - это:
TIME: 2015-10-06 14:26:56
array(
        'payment_id' => 30,
        'result_ids' => 'checkout*,step_four',
        'dispatch' => 'checkout.place_order',
        'customer_notes' => 'п╬п╩я─п╩п╬я─п╬п╩',
        'update_steps' => 1,
        'user_data' => '',
        'update_step' => 'step_four',
)

Это когда уходим с чекаута. Больше нет записей в логах? Что в логах веб сервера access.log?

Такое ощущение, что в массиве с параметрами, который приходит с платежки есть параметр version, который и показывает белый экран с версией магазина.

Для того, чтобы исключить этот момент, откройте файл init.php и закомментируйте следующий код:

if (isset($_REQUEST['version'])) {
    die(PRODUCT_NAME . ' ' . PRODUCT_VERSION . ' ' . (PRODUCT_STATUS != '' ? (' (' . PRODUCT_STATUS . ')') : '') . (PRODUCT_BUILD != '' ? (' ' . PRODUCT_BUILD) : '') . '');
}

Спасибо, помогло.
Теперь, вместо белого экрана, клиент видит страницу оформления заказа - шаг 4ый. Ему все еще выдается ошибка о том, что платежная система выдала ошибку, но судя по логам request.log (теперь в них есть что-то интересное):

array{
... куча всяких параметров, в том числе и version ...
        'dispatch' => 'payment_notification.ok',
        'payment' => 'svetofor_demirbank',
        'order_id' => 9195,
)

Заказ, как и раньше, оформился, но клиент об этом все еще не знает.

Спасибо, помогло.
Теперь, вместо белого экрана, клиент видит страницу оформления заказа - шаг 4ый. Ему все еще выдается ошибка о том, что платежная система выдала ошибку, но судя по логам request.log (теперь в них есть что-то интересное):

array{
... куча всяких параметров, в том числе и version ...
        'dispatch' => 'payment_notification.ok',
        'payment' => 'svetofor_tobank',
        'order_id' => 9195,
)

Заказ, как и раньше, оформился, но клиент об этом все еще не знает.

Есть ещё идеи или что ещё предоставить? access.log выключен и пока не могу его включить.

Есть ещё идеи или что ещё предоставить? access.log выключен и пока не могу его включить.

Я думаю, что вы уже получили ответ на свой вопрос.

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

Либо задавайте вопрос конкретно.

Перед

fn_finish_payment($order_id, $pp_response, false);

поместите

fn_print_die($order_id, $pp_response);

и посмотрите, чем система пытается заапдейтить заказ

Я думаю, что вы уже получили ответ на свой вопрос.

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

Либо задавайте вопрос конкретно.

Конкретный вопрос:
Обработка обрабатывает "положительный ответ" от платежной системы, но перебрасывает пользователя в корзину, с ошибкой. Хотя заказ оформлен.


Перед

fn_finish_payment($order_id, $pp_response, false);

поместите

fn_print_die($order_id, $pp_response);

и посмотрите, чем система пытается заапдейтить заказ

Посмотрел, данные верные.

Заработало! Спасибо большое! Вопрос снят.

Заработало! Спасибо большое! Вопрос снят.

Круто.

Рассказывайте, что было, для будущих поколений.

Сори, что сразу не написал.
В том, что клиента бросало обратно в корзину с ошибкой был виноват неправильно созданный статус заказа,

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

Статус был создан с настройками по-умолчанию.

Надо было выставить галки напротив:
"Уведомить отдел оформления и обработки заказов"

"Уведомить поставщика"
установить
"Расчет кол-ва товара в наличии" в положение "Уменьшение"
"Счет/Кредитное извещение" в положение "Заказ"

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

где можна найти в документации : значении "order_status". и что они означают? например : $order_status = 'P';

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

где можна найти в документации : значении "order_status". и что они означают? например : $order_status = 'P';

Это идентификатор статуса, который вы можете найти на странице редактирования статуса

http://prntscr.com/bpucke