Настройка эквайринга от Тинькофф-банка на D7 Commerce (проблема с правилом rules «When an order is first paid in full»)

Главные вкладки

Аватар пользователя chelwolf chelwolf 4 декабря 2019 в 15:33

Всем привет.

Столкнулся с проблемой при настройке эквайринга от Тинькофф-банка: есть простой сайт с возможностью покупки курсов, после покупки курс автоматически прикрепляется к пользователю. Прикрепление настроено через правило 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. Пишут что вот там как раз все работает и нет никаких проблем с этим правилом. Но нам он, к сожалению, не подходит

Лучший ответ

Аватар пользователя chelwolf chelwolf 26 января 2020 в 17:57
1

Спасибо большое поддержке Тинькофф-банка, которая все-таки решила данную проблему.

Техподдержка исправила ошибку, изменив в функции 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)

Комментарии

Аватар пользователя Andruxa Andruxa 5 декабря 2019 в 1:18
1

О, это маразм в квадрате.
Вот так, например, создается payment_transaction:

            $a = db_update('commerce_order')
                ->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, в ответ получил какую-то ахинею. Видимо - ТП в их случае это отнюдь не Техническая Поддержка.

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

Аватар пользователя chelwolf chelwolf 6 декабря 2019 в 15:01

Спасибо что написали, сейчас с банком думаем как решить данную проблему, поскольку она связана с недоработкой их модуля. У них хороший и документированный API, но плохо интегрированный с Drupal 7, хотя на сайте указано, что поддерживается статус платежей. Я постараюсь решить этот вопрос и напишу как именно это сделать на Drupal (другого пути у меня нет).

Аватар пользователя chelwolf chelwolf 26 января 2020 в 17:57
1

Спасибо большое поддержке Тинькофф-банка, которая все-таки решила данную проблему.

Техподдержка исправила ошибку, изменив в функции 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)

Аватар пользователя voviko voviko 26 января 2020 в 21:10

большое спасибо за вашу работу.
На будущее не понял, как это подключать. Качать с тинькова, у вас или есть на d.org

Аватар пользователя chelwolf chelwolf 23 июля 2021 в 14:09

Рассматривал вопрос подключения Яндекс-кассы для 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, поэтому при необходимости выполнения правила добавьте его в код модуля самостоятельно.

Скриншот переписки прилагаю: