Ответ платежной системы (callback) не правильно указывает статус в сообщении администратору Есть решение

3

Уведомление при оплате Яндекс.Деньги. Ответ платежной системы (callback) не правильно указывает статус в сообщении администратору.

Приходит 2 одинаковых сообщения администратору "Подтверждён", а не "Оплачен". В заказе статус меняется правильно и при проверке отправки уведомления на произвольный Email тоже приходит правильно "Оплачен". Не понятно в чём проблема?

Раньше такого не было, уже два года пользуюсь. Ничего не менял. Это после каких то обновлений Shop Script.

Вот код, но может не в нём дело раз при проверке всё нормально.


{strip}

{$_background_color = "#eeeeee"}
{$_products_bg = "#ffffff"}
{$_bonus_background = "#ffffcc"}
{$_button_background = "#fcd630"}
{$_main_border_color = "#cccccc"}
{$_border_color = "#dddddd"}

<table cellspacing="0" border="0" cellpadding="0" width="100%" bgcolor="{$_background_color}" style="
    font-family:Helvetica,Arial,sans-serif;
    letter-spacing:normal;
    text-indent:0;
    text-transform:none;
    word-spacing:0;
    background-color:rgb(232,232,232);
    border-collapse:collapse
">
    <tr>
        <td style="padding: 20px;">
            <table width="600" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#ffffff" style="
                width: 600px !important;
                background-color:#fff;
                border:1px solid {$_main_border_color};
                border-radius: 4px;
                margin:auto;
                overflow: hidden;
                ">

                <!-- HEADER -->
                <tr>
                    <td width="50" style="width:50px !important; border: solid {$_border_color}; border-width: 0 0 1px 0;"></td>
                    <td height="70" align="center" valign="middle" style="border: solid {$_border_color}; border-width: 0 0 1px 0;">
                        <table width="500" border="0" align="center" cellpadding="0" cellspacing="0" style="width: 100% !important;">
                            <tr>
                                <td>
                                    <font style="font-weight: bold; font-size: 20px; margin: 0 12px 0 0;"><b>{$order.id}</b></font>
                                    <font style="color: #888">{$order.create_datetime|wa_date:'humandate'}</font>
                                </td>
                                <td style="text-align: right;">
                                    <font style="{if !empty($order.style)}{$order.style}{/if}">{$status}</font>
                                </td>
                            </tr>
                        </table>
                    </td>
                    <td width="50" style="width:50px !important; border: solid {$_border_color}; border-width: 0 0 1px 0;"></td>
                </tr>

                <!-- STATUS -->
                <tr>
                    <td></td>
                    <td>
                        <table cellspacing="0" border="0" cellpadding="0" width="100%" style="border-collapse:collapse">
                            <tr>
                                <td>
                                    <p style="
                                    color:rgb(48,48,48);
                                    font-style:normal;
                                    font-variant:normal;
                                    font-weight:normal;
                                    font-size:14px;
                                    line-height:16px;
                                    font-family:Helvetica,Arial,sans-serif;
                                    margin: 20px 0 0;
                                    text-align:center;
                                    ">Спасибо за покупку в магазине «{$wa->shop->settings("name")}»!</p>
                                    <p align="center" style="margin: 20px 0;">
                                        <a href="{$order_url}" style="
                                            text-decoration:none;
                                            font-style:normal;
                                            font-variant:normal;
                                            font-weight:normal;font-size:17px;line-height:40px;font-family:Helvetica,Arial,sans-serif;color:rgb(48,48,48);display:block;
                                            width:225px;
                                            background: {$_button_background};
                                            border-radius: 4px;
                                            " target="_blank">[`Order status`]</a>
                                    </p>
                                    {if !empty($order.params.auth_pin)}
                                        <p style="
                                        color:rgb(48,48,48);
                                        font-style:normal;
                                        font-variant:normal;
                                        font-weight:normal;
                                        font-size:14px;
                                        line-height:16px;
                                        font-family:Helvetica,Arial,sans-serif;
                                        margin: 20px 0;
                                        text-align:center;
                                        text-transform: uppercase;
                                        ">
                                            PIN: <b>{$order.params.auth_pin}</b>
                                        </p>
                                    {/if}
                                </td>
                            </tr>
                        </table>
                    </td>
                    <td></td>
                </tr>

                <!-- TEXT -->
                <tr>
                    <td bgcolor="{$_bonus_background}"></td>
                    <td bgcolor="{$_bonus_background}" style="padding: 12px 0 12px 0;">
                        <p>Здравствуйте, {$customer.name|escape}!</p>
                        <p>Статус вашего заказа {$order.id} был обновлен на <strong>{$status}</strong></p>
                    </td>
                    <td bgcolor="{$_bonus_background}"></td>
                </tr>

                <!-- TEXT -->
                <tr>
                    <td></td>
                    <td style="padding: 24px 0 36px 0;">
                        <h3 style="margin: 0;">Контактная информация</h3>
                        {if strlen($wa->shop->settings("email"))}
                            <p style="margin: 10px 0 0;">
                                [`Email`]: <a href="mailto:{$wa->shop->settings("email")}">{$wa->shop->settings("email")}</a>
                            </p>
                        {/if}
                        {if strlen($wa->shop->settings("phone"))}
                            <p style="margin: 10px 0 0;">
                                [`Phone`]: {$wa->shop->settings("phone")}
                            </p>
                        {/if}
                    </td>
                    <td></td>
                </tr>
            </table>

            <!-- BOTTOM SITE INFORMATION -->
            <table width="100%" border="0" cellspacing="0" cellpadding="0" style="border-collapse:collapse">
                <tr>
                    <td valign="middle" align="center" height="45">
                        <p style="
                        font-style:normal;
                        font-variant:normal;
                        font-weight:normal;
                        font-size:13px;
                        line-height:16px;
                        font-family:Arial,sans-serif,Helvetica;
                        color:rgb(147,154,164);
                        margin: 20px 0 0;
                        ">
                            © {date("Y")} {$wa->shop->settings("name")}<br>
                            <a href="http://{$order.params.storefront}" target="_blank">{$order.params.storefront}</a>
                        </p>
                    </td>
                </tr>
            </table>

        </td>
    </tr>
</table>

{/strip}

16 комментариев

  • +1
    Михаил Ушенин Михаил Ушенин 3 августа 2016 11:08 #

    Иногда платёжная система присылает статус транзакции "Check" или "checkOrder", то выполняется действие "В обработку", которое переводит заказ в статус "Подтвержден". И только если приходит статус "paymentAviso" или "PaymentSuccess", заказ помечается как оплаченный. Попробуйте уточнить у Яндекса, какие запросы он присылал в ваш магазин в связи с заказами, с которыми вы заметили такую проблему.

    • +1
      Антон Антон 3 августа 2016 11:20 #

      Дело в том, что в самом заказе статус меняется правильно на "Оплачено", а "Подтверждён" только в уведомлении на почту администратора и два раза.

    • +1
      Антон Антон 3 августа 2016 16:56 #

      Обратился в Яндекс.Кассу и они ответили, что последний платёж был как обычно по протоколу. Отправлен статус "checkOrder" и "paymentAviso"

      Вот, что у меня в заказе:

      По моему много лишнего.

      Заказ был оформлен 30 июля. Клиент оплатил вчера в 22:15, 03 августа

      ???

    • +1
      Антон Антон 3 августа 2016 17:04 #

      Письмо которое пришло администратору магазина 2 раза в 22:15, 02 августа:

      Про то, что он оплачен не приходило.

    • +1
      Михаил Ушенин Михаил Ушенин 3 августа 2016 17:32 #

      Попробуйте добавить отладочный код как показано ниже.

      1. В файле wa-plugins/payment/yandexmoney/lib/yandexmoneyPayment.class.php после строки

      $result = $this->execAppCallback($app_payment_method, $transaction_data);

      добавьте

      //debug start
      waLog::log('payment_method: '.$app_payment_method, 'yandexmarket-debug.log');
      waLog::log('transaction_data:'."\n".print_r($transaction_data, true), 'yandexmarket-debug.log');
      wa()->getStorage()->set('yandexmarket.debug', 1);
      //debug end

      2. В файле wa-apps/shop/lib/workflow/shopWorkflowAction.class.php после

      shopNotifications::send('order.'.$this->getId(), array(
          'order'       => $order,
          'customer'    => new waContact($order['contact_id']),
          'status'      => $this->getWorkflow()->getStateById($data['after_state_id'])->getName(),
          'action_data' => $data
      ));

      добавьте

      //debug start
      if ((int) wa()->getStorage()->get('yandexmarket.debug') == 1) {
          waLog::log('order ID: '.$this->getId(), 'yandexmarket-debug.log');
          waLog::log('after_state_id: '.$data['after_state_id'], 'yandexmarket-debug.log');
      }
      //debug end

      После очередного возникновения этой проблемы покажите фрагмент лог-файла wa-log/yandexmarket-debug.log, в котором будет фигурировать информация о проблемном заказе.

      • +1
        Антон Антон 5 августа 2016 12:12 #

        Сделал как вы описали. Потом сделал пробный заказ и сразу оплатил. Сообщения после оплаты на почту пришло две штуки и оба с темой - "Заказ #.......обновлён". В первом заказе обновлён на новый, во втором заказ подтверждён. То, что он оплачен не пришло. Может так и задумано?

        Вот скриншот истории заказа в магазине:


        Вот фрагмент лог-файла:


        2016-08-05 08:42:34:
        payment_method: confirmation
        2016-08-05 08:42:34:
        transaction_data:
        Array
        (
            [plugin] => yandexmoney
            [merchant_id] => 14
            [date_time] => 2016-08-05 08:42:34
            [update_datetime] => 2016-08-05 08:42:34
            [result] => 1
            [type] => CHECK
            [native_id] => 2000485232723
            [amount] => 3.00
            [currency_id] => RUB
            [customer_id] => 1
            [order_id] => 1658
            [view_data] => Account: 410011787937846 Оплата со счета в Яндекс.Деньгах Проверка актуальности заказа;
            [state] => 
            [app_id] => shop
            [id] => 529
        )
        
        2016-08-05 08:42:35:
        payment_method: payment
        2016-08-05 08:42:35:
        transaction_data:
        Array
        (
            [plugin] => yandexmoney
            [merchant_id] => 14
            [date_time] => 2016-08-05 08:42:35
            [update_datetime] => 2016-08-05 08:42:35
            [result] => 1
            [type] => AUTH+CAPTURE
            [native_id] => 2000485232723
            [amount] => 3.00
            [currency_id] => RUB
            [customer_id] => 1
            [order_id] => 1658
            [view_data] => Account: 410011787937846 Оплата со счета в Яндекс.Деньгах
            [state] => CAPTURED
            [app_id] => shop
            [id] => 530
        )
        • +1
          Михаил Ушенин Михаил Ушенин 5 августа 2016 12:35 #

          Вы случайно не изменили в настройках магазина название статуса "Оплачен" на "Подтверждён"? Всякое бывает...

          • +1
            Антон Антон 5 августа 2016 12:44 #

            Проверил. Нет не менял. У подтверждён название статуса "Подтверждён", у оплачен название статуса "Оплачен"


            • +1
              Михаил Ушенин Михаил Ушенин 15 августа 2016 11:08 #

              Настройте уведомление на действие "Оплачен", а не на "callback". Во втором случае механизм обработки действий с заказами работает не совсем очевидным образом.

            • +1
              Максим Захаров Максим Захаров 13 августа 2016 14:47 #

              Добрый день.

              Подтверждаю наличие проблемы. Но у меня немного другая ситуация.

              Сайт у вас в облаке.

              Когда клиент оплачивает через Яндекс кассу статус правильно меняется на "Оплачен", но клиенту приходит два уведомления:

              1. По статусу "Подтвержден".

              2. По статусу "Оплачен".

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

              Готов предоставить подтверждения, если понадобится.

              • +2
                Михаил Ушенин Михаил Ушенин 15 августа 2016 11:08 #

                Попробуйте настроить уведомление на действие "Оплачен", а не на "callback".

                • +1
                  Антон Антон 16 августа 2016 21:58 #

                  Всё работает. Настроил уведомление на действие "Оплачен", а не на "callback"

                  Спасибо.

                • +1
                  sitennov sitennov 29 ноября 2019 14:53 #

                  Михаил, столкнулись с такой-же ситуацией. Советы из комментариев не помогают. Что делать ? Приходит два письма.

                • +1
                  ВЕтал ВЕтал Разработчик 27 августа 2022 13:22 #

                  Настройка уведомлений - Событие: Ответ платежной системы (callback)

                  Событие два раза срабатывает. Как исправить, чтоб оно один раз срабатывало?

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

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