Не создается транзакция и не меняется статус заказа.

Связка commerce_robokassa и kickstart 2

Устанавливается и настраивается модуль без проблем.
Проверяется работа на тестовом сервере Robokassa.

Во время оформления заказа переходим к пункту с оплатой.
Выбираем Robokassa.
Происходит перенаправление на сайт Robokassa.
Нажимаем успешную операцию.
Возвращаемся на сайт.
Показывается сообщение, что платеж прошел.

Проверяем:
Переходим в Заказы.
Смотрим статус заказа. Он замерз на статусе Оформление заказа: Оплата.
Заходим в раздел Оплаты заказа. Видис, что баланс не 0.00.
Транзакция не создана.

Должно работать так:
....... Возвращаемся на сайт.
Показано сообщение об успешной оплате.
Автомтически создается транзакция.
Происходит смена статуса с Оплаты на Завершен.

No transaction is created and does not change the status of your order.

Ligament commerce_robokassa and kickstart 2

Installed and configured the module without problems.
Checks the operation on the test server Robokassa.

During checkout, go to step with payment.
Choose Robokassa.
Redirected to the website of Robokassa.
Push successful operation.
Return to the site.
Shows a message that the payment has gone through.

Check:
Turn in Orders.
Watch the status of your order. He froze on the status of my order: Payment.
Go to the Payment section of the order. See that the balance is not 0.00.
The transaction is not created.

Should work like this:
....... Return to the site.
See the message on successful payment.
Avtomticheski transaction is created.
There is a change of status with Payment Completed.

Support from Acquia helps fund testing for Drupal Acquia logo

Comments

andypost’s picture

Похоже придется переделать часть логики, чтобы в пакет обмена данными передавался не заказ, а транзакция, поэтому нужно делать 7.x-2.x ветку по аналогии с https://www.drupal.org/project/commerce_interkassa

UksusoFF’s picture

Есть решение для этой проблемы?

shevgeny’s picture

Тоже интересует. Интеркасса — не катит.

andypost’s picture

решение есть - переделать на передачу транзакции, патчи приветствуются

lukasss’s picture

FileSize
6.67 KB

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

commerce_robokassa_result
commerce_robokassa_create_transaction
commerce_robokassa_success
commerce_robokassa_fail

andypost’s picture

Status: Active » Needs work

Исправлено, я так понимаю, только обновление статуса, но теперь транзакции плодятся при каждом ответе шлюза, а всё потому, что передавать шлюзу нужно идентификатор транзакции, а не заказа.

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

Также очень большие нарекания на форматирование кода, соблюдайне плиз https://www.drupal.org/coding-standards

  1. +++ b/commerce_robokassa.module
    @@ -176,29 +176,21 @@ function commerce_robokassa_get_settings($settings) {
     function commerce_robokassa_success() {
    ...
    +     drupal_goto('checkout/'.$_POST['InvId'].'/complete');
    +  } else {
    +     drupal_goto('robokassa/fail'); ¶
    

    это как success перенаправляет на fail?

  2. +++ b/commerce_robokassa.module
    @@ -176,29 +176,21 @@ function commerce_robokassa_get_settings($settings) {
     function commerce_robokassa_fail() {
    ...
    -  if ($message = commerce_robokassa_get_settings('fail_message')) {
    -    $build['message_fail']['#markup'] = $message;
    -  }
    +  $build = array();  ¶
    +  $build['#markup'] = t('Payment unsuccessful!');
    

    те настроенное сообщение не выведется

lukasss’s picture

Ещё раз всё протестировал:

Нажимаем успешную операцию.
Возвращаемся на сайт.
Показывается сообщение, что платеж прошел.

Проверяем:
Переходим в Заказы.
Смотрим статус заказа. Он замерз на статусе Оформление заказа: Оплата.
Заходим в раздел Оплаты заказа. Видис, что баланс не 0.00.
Транзакция не создана.

Пробовали на тестовом сервере?
Если так, то скорее так и должно быть: вы, наверное, переходили по Success Url. Если так, то да, транзакция не создаётся и выводится простое сообщение об оплате, но по Result Url транзакция создается! и по моему тут всё корректно, единственное, что AMOUNT = 0.

Исправлено, я так понимаю, только обновление статуса, но теперь транзакции плодятся при каждом ответе шлюза, а всё потому, что передавать шлюзу нужно идентификатор транзакции, а не заказа.

Транзакции плодятся и без патча, но передавать, наверное нужно действительно их.

И вторая проблема - это то что когда происходит отказ от платежа, вот тогда он и зависает в корзине.

Сейчас пробую сделать нормальный патч

andypost’s picture

спасибо за тестирование, я настоятельно рекомендую посмотреть комиты http://cgit.drupalcode.org/commerce_interkassa/log/

там боролись с абсолютно той же проблемой, в итоге единственный выход - сделать версию 2.х (один из важнейших комитов)

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

lukasss’s picture

Коммиты не читал, но всё же посмотрите пожалуйста ещё один патч

lukasss’s picture

FileSize
8 KB

немного исправил

andypost’s picture

Assigned: g0nz01 » Unassigned

В целом теперь правильно передается транзакция, так что осталлось дочистить код
очень рекомендую выкладывая новый патч прилагать interdiff изменений
тогда реально легче делать ревью и следить за ходом изменений/мыслей

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

  1. +++ b/commerce_robokassa.module
    @@ -40,8 +40,7 @@ function commerce_robokassa_commerce_payment_method_info() {
    -    // @todo Maybe better make it auto?
    -    //'offsite_autoredirect' => TRUE,
    +    'offsite_autoredirect' => commerce_robokassa_get_settings('offsite_autoredirect'),
    
    +++ b/includes/commerce_robokassa.admin.inc
    @@ -13,6 +13,7 @@ function commerce_robokassa_settings_form($settings = NULL) {
    +    'offsite_autoredirect' => 'true',
    
    @@ -45,6 +46,16 @@ function commerce_robokassa_settings_form($settings = NULL) {
    +    '#options' => array(
    +      'true' => ('True'),
    +      'false' => ('False'),
    

    строка или булево значение?
    полагаю, что комерсу нужно булево

  2. +++ b/commerce_robokassa.module
    @@ -102,10 +101,12 @@ function commerce_robokassa_build_redirect_form($form, &$form_state, $order, $se
    +  ¶
    ...
    +  ¶
    
    @@ -208,51 +209,69 @@ function commerce_robokassa_fail() {
    +   ¶
    ...
    +    $transaction_id = $_POST['InvId'];  ¶
    +     ¶
    ...
    +    ¶
    ...
    +      dsm($transaction->status);      ¶
    +      // Get robokassa other variables.  ¶
    ...
    +      $signature_in = $_POST['SignatureValue'];    ¶
    ...
    +          //Success          ¶
    ...
    +          ¶
    ...
    +          $transaction->message = 'Payment has been received';          ¶
    ...
    +    } ¶
    ...
    +      watchdog('commerce_robokassa', 'There is no transaction or she was paid.', array(), WATCHDOG_ERROR);    ¶
    ...
    +  }  ¶
    
    @@ -282,14 +301,18 @@ function commerce_robokassa_create_transaction($order_id, $status) {
    +  $transaction->status = $status; ¶
    ...
    +  ¶
    
    +++ b/includes/commerce_robokassa.admin.inc
    @@ -45,6 +46,16 @@ function commerce_robokassa_settings_form($settings = NULL) {
    +  ¶
    

    лишние пробелы в конце строки, www.dreditor.org показывает всё

  3. +++ b/commerce_robokassa.module
    @@ -208,51 +209,69 @@ function commerce_robokassa_fail() {
    +          echo 'OK' . $_POST['InvId'];
    ...
    +          echo 'bad'.$amount_in;
    ...
    +        echo 'bad'.$signature_in;
    ...
    +      echo 'bad'.$transaction->transaction_id;
    

    уверен, что это отладочный код. ибо выводить что-либо не нужно.

lukasss’s picture

FileSize
10.15 KB

Вроде всё почистил, исправил, просмотрел coder.

Проверял только на тестовом сервере!!!

lukasss’s picture

исправил кое, что

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

Для чего это может потребоваться?

andypost’s picture

бегло просмотрел патч, в целом - супер!
довольно много нареканий на пробелы в пустых строках... просьба поправить

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

andypost’s picture

Status: Needs work » Needs review

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

lukasss’s picture

вроде все пробелы убрал...

lukasss’s picture

нет, не все 1 упустил )

lukasss’s picture

Протестировал сам на рабочем аккаунте, Вроде все работает...

andypost’s picture

@lukasss большое спасибо за новые патчи и тестирование
главная проблема для принятия - это отсутствие обновления с предыдущей версии, мы не можем потерять платежки, которые Уже созданы на заказы...
ну и было бы хорошо еще пару глаз привлеч для ревью и тестирования

ну и интересный момент с настройками остался:

  1. +++ b/commerce_robokassa.module
    @@ -40,8 +40,7 @@ function commerce_robokassa_commerce_payment_method_info() {
    -    // @todo Maybe better make it auto?
    -    //'offsite_autoredirect' => TRUE,
    +    'offsite_autoredirect' => (boolean) commerce_robokassa_get_settings('offsite_autoredirect'),
    

    как-то странно, настроек еще нет но умолчания берутся из них?! по идее должно быть TRUE

  2. +++ b/commerce_robokassa.module
    @@ -208,49 +209,74 @@ function commerce_robokassa_fail() {
    +      if (commerce_robokassa_get_settings('server') == 'test') {
    

    а если 2 ака робокассы добавлено? с разными настройками...

lukasss’s picture

а если 2 ака робокассы добавлено? с разными настройками...

Вообще не думал об этом...Вы имеете в виду создание ещё одного способа оплаты на основе уже имеющегося со статусом Custom?

lukasss’s picture

как-то странно, настроек еще нет но умолчания берутся из них?! по идее должно быть TRUE

Ну они же берутся из умолчания, которое в форме прописывается

andypost’s picture

#20 да можно включить более одного идентичного плагина оплаты
#21 это как раз умолчание, которое потом должно в форму попасть, насколько я понимаю

lukasss’s picture

Ещё потестирую...

sozonov’s picture

Хотел уточнить, можно ли как-нибудь передать номер заказа в робокассу, чтобы там можно было посмотреть номер заказа для текущей транзакции?!
(я использовал #10 патч, может сейчас что-то изменилось уже).
спасибо!

andypost’s picture

хорошее замечание! сейчас как раз именно номер заказа и передается, но так как патч делает правильно - передает номер транзакции, то стоит передавать и дополнительную информацию
насколько я помню, можно передавать пару дополнительных параметров, но можно и просто расширить информацию в передаваемом описание

UksusoFF’s picture

Когда при использовании тестового сервера должен изменятся статус заказа?
Пробовал отправлять по result url и переходить по success url.
На сайте отображается "Спасибо, оплата прошла успешно!", но статус заказа все равно в ожидании.
Патч применял из #17 поста.

lukasss’s picture

Вы должны в первую очередь смотреть не на статус заказа, а на статус оплаты.
А нужный статус выставляется в настройках рулеса

lukasss’s picture

А нужный статус

статус заказа я имел в виду

UksusoFF’s picture

lukasss’s picture

меняется здесь: admin/commerce/config/payment-methods/manage/commerce_payment_commerce_robokassa/edit/3

UksusoFF’s picture

Можно скрин или экспорт рулса?

lukasss’s picture

FileSize
18.86 KB
UksusoFF’s picture

Там как раз и стоит "Выполнено", только статусы в этом чекбоксе не совпадают с возможными статусами заказа.

lukasss’s picture

в этом чекбоксе

имеете в виду селекте?

UksusoFF’s picture

Да, в селекте.

lukasss’s picture

Вы используете кастомные статусы?

UksusoFF’s picture

lukasss’s picture

да, вы правы, сейчас не работает, я работаю над патчем

lukasss’s picture

Только прошу сразу камнями не закидывать )))
Много чего поисправлял...

Самое трудное оказалось решить вопрос:

а если 2 ака робокассы добавлено? с разными настройками...

Точнее ту часть с настройками авторедиректа. Ничего лучшего не придумал, как аттачить файл js прямо в альтере формы.

Пришлось полностью переделать логику получению настроек. Теперь они берутся прямо из payment_method, а не из переменной как раньше.

Протестировал с двумя акаунтами: в рабочим и с тестовым.
Вроде всё работает...
У меня теперь новый вопрос: Что делать с рулесом оплаты после удаления модуля? Он остается...

Жду отзывов )

P.S.: Код на корректность и лишние пробелы не проверял пока.

andypost’s picture

О! это уже больше похоже на то, что я пытался показать в 1-м коментарии
просто в интеркассе тоже было переписывание на вторую версию точно по тем же причинам и там как раз учтены все нюансы
Может имеет смысл пока перенести код на github и заанонсить где-нить, чтобы люди потестировали

lukasss’s picture

Может имеет смысл пока перенести код на github

Мне можно это сделать?

заанонсить где-нить

Если только на drupal.ru )))

lukasss’s picture

Может быть Вы обновите свой пост: http://www.drupal.ru/node/70117 ?

shevgeny’s picture

А вы не смотрели подобный модуль от PayAnyWay (https://www.payanyway.ru/info/w/ru/public/w/partnership/developers/instr...)?

lukasss’s picture

А вы не смотрели подобный модуль от PayAnyWay (https://www.payanyway.ru/info/w/ru/public/w/partnership/developers/instr...)?

Бегло просмотрел. Не увидел реализации авторедиректа.

keereel’s picture

Скачал, пропатчил #39, установил. Проверил... Статус заказа меняется на тот, который в rules для этого способа поставил.. Но! Мне необходимо, что бы срабатывало ещё и другое правило, в котором Event - "When an order is first paid in full" (по этому событию активируются проданные лицензии на файлы), и оно не срабатывает, судя по всему это событие не активируется. Уже всю голову сломал, подскажите, плс, как быть?

lukasss’s picture

Недавно работал c продажей файлов, честно говоря не замечал проблем.
Всё как обычно было, при смене статуса заказа активировалась лицензия.
Смогу протестировать ещё раз чуть позже

dillix’s picture

#39 пашет отлично! Энди сделай приз коммит)

dillix’s picture

Status: Needs review » Reviewed & tested by the community
fortis’s picture

я правильно понимаю что commerce_robokassa_create_transaction вызывается в конструкторе формы?
кажется в патче транзакция создается при показе формы, имхо это не верно, но нужно меня проверить)

andypost’s picture

Полагаю, что изменение довольно сильно изменяет модуль, и его нужно выносить в отдельную ветку 2.x
Также необходимо продумать upgrade path, чтобыпользователи 1.x могли обновиться связав данные предыдущих транзакций.
Именно для миграции данных таск всё еще требует доработок.
Как только будет готов патч, я сразу сделаю 2ю ветку

niko-’s picture

На досуге сделаю тут рефакторинг в стиле интеркассы

fortis’s picture

в интеркассе транзакция создается в колбеке который вызывает шлюз, так правильнее, создавать ее до оплаты при показе формы не стоит, если есть необходимость отслеживать какие платежи бросили то это видно по статусу заказа да и можно прикрутить воронку/цели от аналитики или метрики

fortis’s picture

и сейчас в робокассе настраивается метод хеширования, лучше сделать чтобы можно было выбирать в админке md5 или другое
> Поддерживаются следующие алгоритмы расчёта хэша: MD5, RIPEMD160, SHA1, SHA256, SHA384, SHA512

dillix’s picture

fortis, если я буду юзать патченную версию у меня сайт сломается?

fortis’s picture

@dillix, нет, но я указал на недостаток патча, теоретически тут можно бесконтрольно генерировать сколько угодно транзакций для этого заказа, в итоге будет оплачена одна транзакция, но возможен флуд pending-транзакциями.

ну и так как транзакция создается заранее и ее id открыт (в форме он как hidden), то если на сайте будет возможно провести csrf атаку - получим возможность направлять пользователей на оплату чужих заказов и транзакций

andypost’s picture

Status: Reviewed & tested by the community » Needs work

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

  1. +++ b/commerce_robokassa.module
    @@ -40,8 +40,6 @@ function commerce_robokassa_commerce_payment_method_info() {
    -    //'offsite_autoredirect' => TRUE,
    

    полагаю, что нужно оставить и добавить комент, почему именно FALSE/TRUE

  2. +++ b/commerce_robokassa.module
    @@ -94,8 +92,7 @@ function commerce_robokassa_redirect_form($form, &$form_state, $order, $payment_
    +  $form['#action'] = commerce_robokassa_server_url($settings['server']);  ¶
    
    @@ -103,25 +100,29 @@ function commerce_robokassa_build_redirect_form($form, &$form_state, $order, $se
    +    ¶
    
    @@ -130,44 +131,36 @@ function commerce_robokassa_build_redirect_form($form, &$form_state, $order, $se
    +  unset($form["form_build_id"]);  ¶
    +  $payment_method = commerce_payment_method_instance_load($form_state['order']->data['payment_method']);  ¶
    ...
    +    $form['#attached']['js'][] = drupal_get_path('module', 'commerce_payment') . '/commerce_payment.js';    ¶
    ...
    +  $payment_method = commerce_payment_method_instance_load($order->data['payment_method']);  ¶
    +  if ($payment_method) {    ¶
    ...
    +    }    ¶
    
    @@ -208,49 +201,74 @@ function commerce_robokassa_fail() {
    +          ¶
    ...
    +      // Calculate the hash.             ¶
    ...
    +      if ($md5 == $signature_in) {        ¶
    

    trailing whitespace

niko-’s picture

Как и обещал сделал версию робокассы с учетом наработок интеркассы тут

Фичи
1. Использованы все наработки интеркассы с учетом того, что протокол робокассы обрезан по сравнению с интеркассой (к примеру нет статустов wait process и отложеных транзакций)
2. модуль умеет грузить и работать с не завершенніми транзациями версии 1.x Для определения что транзакция родная используется параметр shp_order_id если он присутствует это версия 2 если нет 1. соотвественно по разному грузится тразакция.
3. Добавленна поддержка нескольких рулов
4. Версия 2.х не совместима с версией 1.х по настройкам - прийдется перстроить платежный метод и кабинет в робокассе (урлы).
5. Простановка статусов транзакции и ордера происходит drupal commerce way
6. Убраны кастомные страницы success/fail вместо них используется стандартный процесинг редиректа ордера на следующий\прошлый степ (опять же drupal commerce way ) Что позволяет после платежа добавлять шаги как это обычно делается у комерса а не строить костыли
7. Платежная транзакция создается когда ей положено при редиректе на платежку (по аналогии с интеркассой)

Ложка дегтя
1. Так как я не резидент РФ то я не смог зарегестрировать хост и протестировать в связке с робокассой.
2. Провел проверку на включение и "офлайн" тестирование на сайте. Ничего не упало

Онлайн тесты, фидбек, мерж реквесты приветствуются.

niko-’s picture

И да поддерживаются все доступные в робокассе алгоритмы хеширования

niko-’s picture

Тестинг\фиксы прошли успешно вроде все ровно.
Спасибо @dillix за помощь с тестированием

dillix’s picture

Подтверждаю, протестировали в тест моде все работает отлично!

niko-’s picture

ну и так как транзакция создается заранее и ее id открыт (в форме он как hidden), то если на сайте будет возможно провести csrf атаку - получим возможность направлять пользователей на оплату чужих заказов и транзакций

Вернул отправку order ID в InvId
shp_order_id заменен на shp_trxid
В shp_trxid отправляю GUID транзакции и по нему же происходит загрузка необходимой транзакции на result/fail GUID хранится в remote_id так как Робокасса не использует его.
Добавлена проверка суммы

andypost’s picture

New maintainer niko- added and permissions updated.

Предоставил Олегу доступ к проекту, ожидаю ветку 2.х

shp_trxid таки лучше заменить на shp_txn_id вроде как это общепринятое именование

niko-’s picture

Версия 7.x-2.х выпущена, читайте release notes

niko-’s picture

Status: Needs work » Needs review
dillix’s picture

Status: Needs review » Closed (outdated)

Закрываю ишью в связи с выходом ветки 2.x. Там данный функционал реализован.

andypost’s picture

Version: 7.x-1.0-rc1 » 7.x-2.0-rc1
Status: Closed (outdated) » Fixed

right status, to make issue visible for 2 weeks

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.