Обратил внимание, что иногда, при включенной двустадийной оплате в плагине ЮКасса, товар из заказа дважды списывается со склада. Но не со 100% воспроизводимостью, т.е. иногда списывается нормально, иногда нет.
- Shop-Script: 12.6.0
- Плагин оплаты yandexkassa: 1.3.6
- Webasyst Framework: 4.2.0
Настройки:
- Shop → Настройки → Склад: «Обновлять остатки на складе» = «Заказ подтверждён и принят в обработку»
(<code>update_stock_count_on_create_order = 0</code>, <code>disable_stock_count = 0</code>) - Способ оплаты yandexkassa, опция «Двухстадийная оплата» включена.
С большой долей вероятности это классический race condition.
1. Ручное нажатие «Списать средства»: shopWorkflowCaptureAction::execute() → $plugin->capture()→успешный ответ yandexkassa→shopWorkflowCaptureAction::postExecute()→shopOrder $order->reduceProductsFromStocks()
2. Callback от Юкасса: handlePayment()→shopPayment::callbackPaymentHandler()→shopWorkflowPayAction::postExecute() → reduceProductsFromStocks()
Возможно, имеет смысл сделать что-то такое:
UPDATE shop_order_params
SET value = 1
WHERE order_id = ? AND name = 'reduced' AND value != 1
и продолжать списание, только если affected_rows > 0 или как-то лочить таблицу (сомнительное решение). Или в shopPayment::callbackPaymentHandler() добавить проверку по payment_transaction_id/native id.
0 комментариев