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


liqpay и order_id


  • Вы не можете ответить в тему
Сообщений в теме: 15

#1 dorian

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 107 сообщений
Репутация: 24
Ассистент

Отправлено 03 February 2012 - 04:01 PM

проблема заключается в том, что если перейти к оплате на liqpay, и по каким-то причинам не оплатить (мой клиент указал номер карты на которой недостаточно денег), или даже закрыть страницу оплаты, потом, имея модуль оплаты из личного кабинета попробовать оплатить снова, то преславутый liqpay будет ругаться:

Ошибка! Не передана информация для покупки.
Order ID Нарушена уникальность Order id

пытался в liqpay.php сделать при формировании запроса
$rand=rand(100,999);
$orderID+=$rand;

и такой $orderID передать в запрос,
а с ответа наоборот
$orderID-=$rand;

и с этого роя не выходит нифига :( есть еще варианты решения?

P.S. операторы приветбанка говорят что ковыряйте свой магазин чтобы он как-то формировал уникальный order_id
  • 0

#2 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 03 February 2012 - 04:39 PM

order_id является уникальным полем (не может быть двух заказов с одинаковыми order_id), для магазина, конфликты с платежными системами могут возникать при ручном очищении таблицы заказов, при котором сбивается счетчик. Например у Вас человек оплатил заказ 55, Вы очистили вручную таблицу, и когда опять получится закакз 55, то может возникнуть конфликт
  • 0
Изображение Изображение Изображение

#3 dorian

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 107 сообщений
Репутация: 24
Ассистент

Отправлено 03 February 2012 - 05:06 PM

order_id является уникальным полем (не может быть двух заказов с одинаковыми order_id), для магазина, конфликты с платежными системами могут возникать при ручном очищении таблицы заказов, при котором сбивается счетчик. Например у Вас человек оплатил заказ 55, Вы очистили вручную таблицу, и когда опять получится закакз 55, то может возникнуть конфликт

абсолютно верно! есть в магазине заказ с номером 55, клиент переходит на сайт ликпея оплатить его, но не оплачивает (вводит неверные данные карты или даже просто закрывает окно на первом же шаге оплаты), потом нажимает кнопку "оплатить заказ" в личном кабинете, а ликпей выдаст Order ID Нарушена уникальность Order id. т.е. никто ничего не очищает, и речь идет об одном и том же заказе
  • 0

#4 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 04 February 2012 - 12:59 AM

абсолютно верно! есть в магазине заказ с номером 55, клиент переходит на сайт ликпея оплатить его, но не оплачивает (вводит неверные данные карты или даже просто закрывает окно на первом же шаге оплаты), потом нажимает кнопку "оплатить заказ" в личном кабинете, а ликпей выдаст Order ID Нарушена уникальность Order id. т.е. никто ничего не очищает, и речь идет об одном и том же заказе

получается нужно чтобы при каждом повторном вызове функции оплаты из личного кабинета к номеру заказа дописывалась какая-то приставка 1 2 3 4
  • 0

#5 dorian

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 107 сообщений
Репутация: 24
Ассистент

Отправлено 04 February 2012 - 10:33 AM

насколько я начал понимать, то плательщику сам Order_id не виден. В модуле liqpay формируется строка, указанная в Модули оплаты -> LiqPAY -> Описание платежа
и передается в ликпей в operation_xml как $desc, а поле $orderID, который равен номеру заказа в магазине клиент не видит. решение частично нашел (modules/payment/liqpay.php):

$rand=rand(100,999);
$orderID+=$rand;

$request="
1.2
$url
$url
$Id
$orderID
$amount
$currency
$desc
$phone
card,liqpay,delayed
";
в таком варианте, когда ордер_ид суммируется с произвольным числом, и передается на ликпей, можно пробовать оплачивать сколько угодно.
Теперь, когда приходит ответ от ликпея, нужно от полученного ордер_ид отнять $rand, чтобы правильно изменялось состояние заказа - но до этого пока руки не дошли

получается нужно чтобы при каждом повторном вызове функции оплаты из личного кабинета к номеру заказа дописывалась какая-то приставка 1 2 3 4

сам номер заказ в магазине можно не трогать, а уже мутить с ним в модуле оплаты ликпей
  • 0

#6 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 04 February 2012 - 10:46 AM

Вы неправильно рассматриваете логику платежных систем, обьясню в чем причина
При отказе от оплаты в платежной системе должна формироваться запись вида "заказ #1234 отменен"
И это правильно, но при этом отмена заказа в магазине не происходит, а должна
Тоесть чтобы все работало правильно необходимо допил вать модули платежных систем чтобы они обрабатывали
ответы отказа от платежной системы и переводили заказ в статус отменег
  • 0
Изображение Изображение Изображение

#7 dorian

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 107 сообщений
Репутация: 24
Ассистент

Отправлено 04 February 2012 - 11:17 AM

Вы неправильно рассматриваете логику платежных систем, обьясню в чем причина
При отказе от оплаты в платежной системе должна формироваться запись вида "заказ #1234 отменен"
И это правильно, но при этом отмена заказа в магазине не происходит, а должна
Тоесть чтобы все работало правильно необходимо допил вать модули платежных систем чтобы они обрабатывали
ответы отказа от платежной системы и переводили заказ в статус отменег


речь идет не об отмене заказа! пример: заказываю товар в интернет-магазине, перехожу на страницу оплаты картой, и оказывается что карту забыл на работе, закрываю браузер... приезжаю на работу, беру карту чтобы оплатить заказ, захожу в личный кабинет, выбираю "оплатить заказ", и получаю от ликпея ошибку в ордер_ид, и чтобы мне его оплатить, мне нужно этот же заказ (со стороны клиента) создавать по новой, чтобы ему присвоился новый номер!
  • 0

#8 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 04 February 2012 - 12:09 PM

речь идет не об отмене заказа! пример: заказываю товар в интернет-магазине, перехожу на страницу оплаты картой, и оказывается что карту забыл на работе, закрываю браузер... приезжаю на работу, беру карту чтобы оплатить заказ, захожу в личный кабинет, выбираю "оплатить заказ", и получаю от ликпея ошибку в ордер_ид, и чтобы мне его оплатить, мне нужно этот же заказ (со стороны клиента) создавать по новой, чтобы ему присвоился новый номер!


Ну тогда вот вам решение
order_Id + did.mm.hh (+ часы минуты и секунды ) + количество символов в order_I'd

Потом в обработчикеувыбираете все символы после "количества символов order_id"
  • 0
Изображение Изображение Изображение

#9 dorian

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 107 сообщений
Репутация: 24
Ассистент

Отправлено 04 February 2012 - 12:22 PM

Ну тогда вот вам решение
order_Id + did.mm.hh (+ часы минуты и секунды ) + количество символов в order_I'd

Потом в обработчикеувыбираете все символы после "количества символов order_id"


вот и я того же мнения, только я прибавляю не дату, а произвольное число от 100 до 999
теперь основной вопрос - реализация сего чуда кодом :)
  • 0

#10 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 04 February 2012 - 12:27 PM

вот и я того же мнения, только я прибавляю не дату, а произвольное число от 100 до 999
теперь основной вопрос - реализация сего чуда кодом :)


какое произвольое число, и в итоге в некоторых случаях опять будет тоже самое, дата всегда уникальна, а произвольное число нет
  • 0
Изображение Изображение Изображение

#11 dorian

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 107 сообщений
Репутация: 24
Ассистент

Отправлено 04 February 2012 - 12:53 PM

какое произвольое число, и в итоге в некоторых случаях опять будет тоже самое, дата всегда уникальна, а произвольное число нет

согласен! но можно увеличить диапазон генерации числа например от 1000000 до 9999999. в таком случае, при нескольких попытках оплаты генерация одинакового числа сводится почти к нулю :)
  • 0

#12 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 04 February 2012 - 01:47 PM

согласен! но можно увеличить диапазон генерации числа например от 1000000 до 9999999. в таком случае, при нескольких попытках оплаты генерация одинакового числа сводится почти к нулю


да может и так но зачем это делать если дата всегда удобней и всегда уникальна ничего не нужно к нулю сводить ))
  • 0

#13 dorian

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 107 сообщений
Репутация: 24
Ассистент

Отправлено 04 February 2012 - 01:48 PM

да может и так но зачем это делать если дата всегда удобней и всегда уникальна ничего не нужно к нулю сводить ))

да это так, мысли вслух :)
  • 0

#14 dorian

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 107 сообщений
Репутация: 24
Ассистент

Отправлено 04 February 2012 - 09:51 PM

ВСЕ! модуль исправил! генерит уникальный ордер_ид для одного и того же заказа, и статусы меняет при успешной и неуспешной оплате. кому интересно - поделюсь решением :)
  • 0

#15 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 05 February 2012 - 02:20 PM

ВСЕ! модуль исправил! генерит уникальный ордер_ид для одного и того же заказа, и статусы меняет при успешной и неуспешной оплате. кому интересно - поделюсь решением


Так не делают. Если допилил и готов делиться - выкладывай. Если не со всем выкладывай под хайдом. Если не готов делиться - молчи. А то ни туда ни сюда.

---------- Сообщение объединено ----------

И вообще зачем куча тем наплодил?
http://vsupport.club/t296-3.html
http://vsupport.club/t962.html
  • 0

#16 dorian

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 107 сообщений
Репутация: 24
Ассистент

Отправлено 05 February 2012 - 03:03 PM

Так не делают. Если допилил и готов делиться - выкладывай. Если не со всем выкладывай под хайдом. Если не готов делиться - молчи. А то ни туда ни сюда.


1)

$desc = substr($desc, 0, -1); }
else $desc = str_replace("[orderID]", $orderID, $desc);
$desc = iconv('windows-1251', 'utf-8', $desc);

// делаем уникальным ордер_ид
$rand="_".rand(100000,999999); // по советам R.Sergey, eugene_wb можно использовать дату вместо произвольного числа
$orderID.=$rand;

$request="
1.2
$url
$url
$Id
$orderID
$amount
$currency
$desc
$phone
card,liqpay,delayed //delayed = оплата налом в терминалах Приватбанка
";

2)
 
function after_payment_php($operation_xml, $signature) {
$sign = $this->_getSettingValue('CONF_PAYMENTMODULE_LIQPAY_SECRET');
$resp = base64_decode($operation_xml);
$action = $this->parseTag($resp, 'action');
$orderID = $this->parseTag($resp, 'order_id');
$orderID=substr($orderID,0,strlen($orderID)-7); // убираем лишние символы, которые влепили в ордер_ид в запросе


3) вместо 2 нужно ставить statusID статуса заказа, который должен быть присвоен в зависимости от ответа ликпея

case 'wait_secure': // платеж проверяется службой безопасности
ostSetOrderStatusToOrder($orderID, 2, $this->_getSettingValue('CONF_PAYMENTMODULE_LIQPAY_MESSAGE_WAIT'),$mail);
break;
case 'checksum': // ошибка контрольной суммы
ostSetOrderStatusToOrder($orderID, 2, $this->_getSettingValue('CONF_PAYMENTMODULE_LIQPAY_MESSAGE_CHECKSUM'));
case 'failure': // платеж отклонен системой
ostSetOrderStatusToOrder($orderID, 2, $this->_getSettingValue('CONF_PAYMENTMODULE_LIQPAY_MESSAGE_FAILURE'),$mail,$sms);



И вообще зачем куча тем наплодил?
Модуль оплаты через LiqPAY
НОРМАЛЬНЫЙ модуль для liqpay

прочитал правила - больше не буду
  • 0