Всем привет.
Столкнулся с проблемой при настройке эквайринга от Тинькофф-банка: есть простой сайт с возможностью покупки курсов, после покупки курс автоматически прикрепляется к пользователю. Прикрепление настроено через правило Rules, которое срабатывает на событие "When an order is first paid in full".
Что это за событие хорошо написано на официальном сайте Drupal Commerce: https://docs.drupalcommerce.org/commerce1/user-guide/checkout-process/ch...
Если использовать метод оплаты из коробки - все работает как надо, а вот при использовании метода оплаты от Тинькофф-банка, правило "When an order is first paid in full" не отрабатывает (не срабатывает привязка и не приходит тестовое письмо). При оплате пользователь уходит на страницу банка, вбивает реквизиты и осуществляет оплату, после чего возвращается на сайт.
Кто сталкивался? Как решить?
Много гуглил и по разному пытался решить проблему:
1) Изменение приоритета правил не помогает
2) Не помогает настройка в правиле метода оплаты Тинькофф-банка об изменении статуса заказа после оплаты (испробовал все варианты)
3) Нет другого способа осуществить проверку в моём случае (контент нужно отдавать только после полной оплаты)
4) Сотрудники банка знают о проблеме, но пока не предложили решения, в инструкции и комментариях к модулю об этом ничего нет
5) Решения для меня не работают:
- https://drupalcommerce.org/questions/6861/problem_update_order_status_ac...
- https://drupal.stackexchange.com/questions/74849/is-this-normal-to-have-...
Важно отметить, что при поиске много раз натыкался на модуль от PayPal: https://www.drupal.org/node/1901466. Пишут что вот там как раз все работает и нет никаких проблем с этим правилом. Но нам он, к сожалению, не подходит
Комментарии
О, это маразм в квадрате.
Вот так, например, создается payment_transaction:
->fields(array(
'status' => $order_status,
))
->condition('order_id', (int)$sorted['OrderId'], '=')
->execute();
$transaction = db_select('commerce_payment_transaction', 'n')
->fields('n', array('status', 'uid'))
->condition('order_id', (int)$sorted['OrderId'])
->execute()
->fetchAll();
if (empty($transaction) && $request['Status'] == 'CONFIRMED') {
$tid = db_insert('commerce_payment_transaction')
->fields(array(
'revision_id' => (int)$sorted['OrderId'],
'uid' => $uid,
'order_id' => (int)$sorted['OrderId'],
'payment_method' => 'commerce_tinkoff',
'instance_id' => 'commerce_tinkoff|commerce_tinkoff',
'remote_id' => $_SERVER['REMOTE_ADDR'],
'message' => '',
'message_variables' => '',
'amount' => $sorted['Amount'] / 100,
'currency_code' => 'RUB',
'status' => 'success',
'remote_status' => '',
'payload' => '',
'data' => '',
'created' => time(),
'changed' => time(),
))
->execute();
Судя по обилию $arrFields и $arrRequest в коде - это адаптировал под друпал какой-то битриксоид, с сообветствующим уровнем владения друпалом.
Была проблема - после успешной оплаты юзера надо переадресовать обратно на сайт магазина по роуту /checkout/%order_id%/complete - чтобы уведомить его, что заказ оформлен и оплачен.
У всех нормальных людей back_url передается в post-запросе вместе с параметрами платежа, а у тинькова - в личном кабинете. Разумеется, никакой динамический обратный url с id заказа там ввести невозможно.
Написал в ТП - мол, сделайте у себя в апи, чтобы можно было предавать back_url, в ответ получил какую-то ахинею. Видимо - ТП в их случае это отнюдь не Техническая Поддержка.
В общем, в топку этот банк вместе с его эквайрингом, когда есть куча нормальных банков. И клиентам своим посоветуйте валить оттуда.
Спасибо что написали, сейчас с банком думаем как решить данную проблему, поскольку она связана с недоработкой их модуля. У них хороший и документированный API, но плохо интегрированный с Drupal 7, хотя на сайте указано, что поддерживается статус платежей. Я постараюсь решить этот вопрос и напишу как именно это сделать на Drupal (другого пути у меня нет).
Спасибо большое поддержке Тинькофф-банка, которая все-таки решила данную проблему.
Техподдержка исправила ошибку, изменив в функции commerce_tinkoff_result в файле commerce_tinkoff.module параметры запроса в аргументе функции commerce_tinkoff_create_transaction и вызвав функцию commerce_order_save в функции commerce_tinkoff_create_transaction.
Теперь коробочное правило "When an order is first paid in full" исправно работает.
Модуль на сайте Тинькофф пока не обновили, поэтому выкладываю свой архив с правками от техподдержки: https://yadi.sk/d/z5aIHA3XqIyeAQ (изменения внесены в commerce_tinkoff.module и TinkoffMerchantAPI.php)
большое спасибо за вашу работу.
На будущее не понял, как это подключать. Качать с тинькова, у вас или есть на d.org
Качайте у меня, Тинькофф пока не внес изменения. На d.org его нет
Рассматривал вопрос подключения Яндекс-кассы для Drupal 7, написал в техническую поддержку относительно работы правила "When an order is first paid in full" на их модуле.
Ответ следующий:
При успешной оплате в коде модуля для Drupal Commerce предусмотрено выполнение только правила commerce_checkout_complete:
https://github.com/yoomoney/cms-drupal7/blob/e32444d64279090dc380161f462...
При этом связь с выполнением правила "When an order is first paid in full»" не исследовалась.
В ближайшем времени мы не планируем добавлять выполнение других правил в модуль для Drupal, поэтому при необходимости выполнения правила добавьте его в код модуля самостоятельно.
Скриншот переписки прилагаю: