Shop-Script: Потенциальный race condition при двустадийной оплате Принято

2

Обратил внимание, что иногда, при включенной двустадийной оплате в плагине ЮКасса, товар из заказа дважды списывается со склада. Но не со 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 комментариев

    Добавить комментарий

    Чтобы добавить комментарий, зарегистрируйтесь или войдите