На версии модуля 1.0.5 никаких нареканий не было. Клиент создавал заказ, оплачивал его, в админке изменялся статус, заказ становился видимым в Заказах и т.д.
Обновили модуль до версии 1.2.7. Стали замечать, что клиент оплачивает картой, деньги поступают (это видно в Личном Кабинете Я.Кассы), а заказ продолжает висеть со статусом = 0 в Потеряных заказах.
Судя по логу, статус succeeded приходит, но статус не меняется.
Полез в код. В экшене confirm() вижу такое:
if ($payment === null) {
$this->failure(sprintf($this->language->get('log_text_order_not_found'), $paymentId, $orderId));
} elseif (!$payment->getPaid()) {
$this->failure($this->language->get('log_text_error_payment_capture'));
} elseif ($payment->getStatus() === PaymentStatus::CANCELED) {
$this->failure(sprintf($this->language->get('log_text_status_canceled'), $paymentId, $orderId));
}
$this->response->redirect($this->url->link('checkout/success', '', true));
странно, про succeeded ни слова... И никакого confirmOrderPayment() и в помине нет. Странно.
Озадачился.
Однако потом додумался посмотреть в код версии 1.0.5 и вот что там:
if ($payment === null) {
$this->failure('Не найден платёж ' . $paymentId . ' для заказа №' . $orderId);
} elseif (!$payment->getPaid()) {
$this->failure('Платёж не был проведён');
} elseif ($payment->getStatus() === \YaMoney\Model\PaymentStatus::CANCELED) {
$this->failure('Статус платежа ' . $paymentId . ' заказа №' . $orderId . ' - canceled');
} elseif ($payment->getStatus() !== \YaMoney\Model\PaymentStatus::SUCCEEDED) {
$this->getModel()->log('info', 'Confirm order#' . $orderId . ' with payment ' . $payment->getId());
$this->getModel()->confirmOrder($orderId, $payment);
if ($payment->getStatus() === \YaMoney\Model\PaymentStatus::WAITING_FOR_CAPTURE) {
$res = $this->getModel()->capturePayment($payment, false);
if ($res->getStatus() === \YaMoney\Model\PaymentStatus::SUCCEEDED) {
$this->getModel()->confirmOrderPayment(
$orderId, $res, $this->getModel()->getKassaModel()->getSuccessOrderStatusId()
);
}
}
}
$this->response->redirect($this->url->link('checkout/success', '', true));
Ну вот! Все на месте! И проверка на succeeded, и confirmOrderPayment().
Но не может же быть, что все так просто.
Кто знает, как в версии 1.2.7 происходит обновление статуса заказа при удаче в оплате?
UPD Рано я радовался. В версии 1.0.5 к confirmOrderPayment() в эвенте confirm() мы попадем только если платеж со статусом waiting_for_capture.
А в версии 1.2.7 в логе я этого статуса уже вообще не вижу...