Ответ 1
Я считаю, что это была старая ошибка от 1.4 до 1.6. Но есть ли у вас старая версия или нет, это можно довольно легко устранить, если вы знаете свой путь вокруг Magento.
Проблема заключается в том, что у вас есть код, который обновляет таблицу salesrule_coupon_usage сразу, когда они нажимают кнопку оплаты. На самом деле это совсем не то, чего вы хотите. Вы хотите, чтобы это было включено в транзакцию платежа. Я не знаю, происходит ли эта ошибка, потому что у вас есть собственный код или используется более старая версия Magento, но я расскажу вам, как я исправлю проблему. Тогда я дам вам исправление, подобное тому, что вы предложили:
Magento уже имеет абстракцию, называемую "транзакцией". Транзакция используется для объединения и группирования объектов, которые необходимы либо всем, либо всем, либо не выполняются, а не полумеры. Magento проведет транзакцию и попытается сохранить каждый из объектов, которые вы разместили в ней. Если какой-либо из них не работает (например, оплата не проходит), все события, которые уже были сохранены, "откат".
К счастью, Magento уже создает объект транзакции для обработки платежа за различные вещи, которые необходимо обновлять вместе при успешной оплате. Вы можете использовать эту транзакцию и использовать ее для правильного обновления использования купона.
Вот вам 10 000 футов, что вам нужно сделать.
- Найти то, что обновляет таблицу salesrule_coupon_usage слишком рано и убить. Мы собираемся добавить нашу собственную безопасную для транзакции версию, поэтому мы не хотим, чтобы она была сохранена в другом месте. Самый простой способ сделать это - выяснить, какая модель подключается к этой таблице и искать создание этой модели. Для 1.7 и 1.8 это модель правила/клиента.
- Создайте наблюдателя, чтобы поймать начало транзакции платежа. В большинстве современных версий magento это событие называется sales_order_payment_place_start и может быть засвидетельствовано в app/code/core/Mage/Sales/Model/Order/Payment.php
- Вытяните заказ из события и вытащите код купона из события.
- Потяните фактическую модель, которую вы хотите обновить. Похоже, кто-то не смог найти его в вашем коде, но должна быть какая-то модель, которая где-то скрывает таблицу salesrule_coupon_usage. Найдите хотя .xml файлы для "salesrule_coupon_usage" и посмотрите, какая модель использует эту таблицу. Опять же, для меня, на 1.7, это модель правила/клиента.
- Загрузите эту модель, при этом клиент изменит значение, в котором ваш код купона будет указывать на то, что клиент использовал купон, но не сохраняет его.
- Вывести транзакцию из события и зарегистрировать обновленный объект купона с помощью метода addObject.
И твоя работа. Транзакция автоматически попытается сохранить все объекты, которые были добавлены к ней. Если какая-либо часть не удалась (включая неудачный платеж), она откатит весь процесс, и ваш купон не будет использоваться. Ура!
Теперь, на мой взгляд, это лучший способ справиться с этой проблемой, но если у вас возникли проблемы по какой-то причине, вот альтернатива, основанная на улавливании неуспешного платежа и последующем использовании вашего кода.
Опять же, здесь вид 10 000 футов:
- Создайте наблюдателя, чтобы поймать неудавшееся событие платежа. В большинстве версий событие, которое вы хотите, - sales_order_payment_cancel.
- Запустите код, который у вас есть... он должен это сделать. Но прояснить для других:
- Вытяните заказ из события, вытащите код купона и идентификатор клиента.
- Обновите таблицу клиентов, правил и salesrule_coupon_usage. (Хотя для этого действительно должна быть модель, я уверен, что вы ее можете найти)
Теперь, когда продажа не удалась, вы возвращаетесь назад и разматываете все вручную. Это не так чисто, как мое первое решение, но может быть проще для вас в зависимости от вашего знакомства с Magento.
Я уверен, что новые, чистые версии Magento не имеют этой проблемы, поэтому позвольте мне предложить довольно очевидное предложение в качестве третьего решения.
- Обновить Magento
- Если Magento обновлен, попробуйте отключить какие-либо пользовательские модули, потому что что-то сломало его. Я заметил, что плагины купонов Amasty особенно неэффективны.
- Если вы внесли пользовательские изменения в ядро Magento... удачи с этим.
Удачи!