Домой Каталог: Плагины WordPress Wp Reservation Place Не обновляется статус оплаты в заказах (мерчнт ЕК)
10ответ(ов) в теме
виталий
не в сети 5 лет
На сайте с 06.10.2016
Участник
Тем 3
Сообщения 20
1
17:53
Версия плагина: 3.1.6

Добрый вечер, выручайте))
Не обновляется статус оплаты в админке,
1) оплата в ЕК проходит
2) приходят письма \"Неудачная оплата\" с сайта с подобным содержанием:
CMS - 30
TYPE_PAY - 1
USER_ID - vitaliybereza@yandex.ua
WMI_AUTO_ACCEPT - 1
WMI_COMMISSION_AMOUNT - 0.40
WMI_CREATE_DATE - 2017-10-03 10:23:50
WMI_CURRENCY_ID - 643
WMI_DESCRIPTION - 物豚蜞 玎赅玎 铗 vitaliybereza@yandex.ua
WMI_EXPIRED_DATE - 2017-11-03 10:23:50
WMI_FAIL_URL -

Вы не можете просматривать опубликованные ссылки

WMI_INVOICE_OPERATIONS - [{\\\"CreateDate\\\":\\\"2017-10-03 10:45:53\\\",\\\"PaymentId\\\":\\\"151774050\\\",\\\"Amount\\\":\\\"10.00\\\",\\\"AmountEntryId\\\":\\\"10862712470\\\"}]
WMI_LAST_NOTIFY_DATE - 2017-10-03 14:21:37
WMI_MERCHANT_ID - 112466845835
WMI_NOTIFY_COUNT - 29
WMI_ORDER_ID - 340750543939
WMI_ORDER_STATE - Accepted
WMI_PAYMENT_AMOUNT - 10.00
WMI_PAYMENT_NO - 1507036999
WMI_PAYMENT_TYPE - SberOnlineRUB
WMI_SUCCESS_URL -

Вы не можете просматривать опубликованные ссылки

WMI_UPDATE_DATE - 2017-10-03 10:45:53
WMI_SIGNATURE - yV5SCjnDwjp7MRpxyuMCaA==
C褎芯褉屑懈褉芯胁邪薪薪褘泄 褏械褕 - mZSsE/gTOzKI6DRu9c9Vhg==
孝械泻褍褖懈泄 锌芯褋褌 - 72
RESULT - 72
SUCCESS - 70

3) От них недавно приходило письмо что изменился API:
Уважаемые пользователи!
С 21 сентября 2017 года изменится состав коллбэка. В него будет включен новый параметр WMI_INVOICE_OPERATIONS. Для проверки цифровой подписи необходимо его учитывать.

Wallet One Team.
4) Может что-то в коде надо поменять? (кода мерчанта)
if(class_exists(\'WRP_Payment\')){ add_action(\'init\',\'wrp_add_walletone_payment\'); function wrp_add_walletone_payment(){ $pm = new WRP_Walletone_Payment(); $pm->register_payment(\'walletone\'); } class WRP_Walletone_Payment extends WRP_Payment{ public $form_pay_id; public $payments_json; function register_payment($form_pay_id){ $this->form_pay_id = $form_pay_id; parent::add_payment($this->form_pay_id, array( \'class\'=>get_class($this), \'request\'=>\'WMI_PAYMENT_NO\', \'name\'=>\'WalletOne\' )); if(is_admin()) $this->add_options(); } function add_options(){ add_filter(\'wrp_pay_option\',(array($this,\'options\'))); add_filter(\'wrp_pay_child_option\',(array($this,\'child_options\'))); } function options($options){ $options[$this->form_pay_id] = __(\'WalletOne\',\'rcl-walletone\'); return $options; } function child_options($child){ $opt = new WRP_Options(); $child .= $opt->child( array( \'name\'=>\'connect_sale\', \'value\'=>$this->form_pay_id ), array( $opt->title(__(\'Настройки подключения WalletOne\',\'rcl-walletone\')), $opt->label(__(\'Merchant ID\',\'rcl-walletone\')), $opt->option(\'text\',array(\'name\'=>\'WO_MERCHANT_ID\')), $opt->label(__(\'Секретный ключ\',\'rcl-walletone\')), $opt->option(\'password\',array(\'name\'=>\'WO_SECRET_KEY\')), $opt->label(__(\'Доступные способы оплаты\',\'rcl-walletone\')), $content ) ); return $child; } function pay_form($data){ global $wrp_options; $merchant_id = $wrp_options[\'WO_MERCHANT_ID\']; $secret_key = $wrp_options[\'WO_SECRET_KEY\']; $curs = array( \'RUB\' => 643, \'UAH\' => 980, \'KZT\' => 398, \'USD\' => 840, \'EUR\' => 978 ); $code_cur = (isset($curs[$wrp_options[\'primary_cur\']]))? $curs[$wrp_options[\'primary_cur\']]: 643; $desc = ($data->description)? $data->description: \'Платеж от \'.$data->email_user; $fields = array( \'WMI_MERCHANT_ID\'=>$merchant_id, \'WMI_PAYMENT_AMOUNT\'=>$data->pay_summ.\'.00\', \'WMI_CURRENCY_ID\'=>$code_cur, \'WMI_PAYMENT_NO\'=>$data->pay_id, \'WMI_DESCRIPTION\'=>$desc, \'WMI_SUCCESS_URL\'=>get_permalink($wrp_options[\'page_successfully_pay\']), \'WMI_FAIL_URL\'=>get_permalink($wrp_options[\'page_fail_pay\']), \'USER_ID\'=>$data->email_user, \'TYPE_PAY\'=>$data->pay_type, \'CMS\'=>30 ); //Сортировка значений внутри полей foreach($fields as $name => $val) { if (is_array($val)) { usort($val, \"strcasecmp\"); $fields[$name] = $val; } } // Формирование сообщения, путем объединения значений формы, // отсортированных по именам ключей в порядке возрастания. uksort($fields, \"strcasecmp\"); $fieldValues = \"\"; foreach($fields as $value) { if (is_array($value)) foreach($value as $v) { //Конвертация из текущей кодировки (UTF-8) //необходима только если кодировка магазина отлична от Windows-1251 $v = iconv(\"utf-8\", \"windows-1251\", $v); $fieldValues .= $v; } else { //Конвертация из текущей кодировки (UTF-8) //необходима только если кодировка магазина отлична от Windows-1251 $value = iconv(\"utf-8\", \"windows-1251\", $value); $fieldValues .= $value; } } // Формирование значения параметра WMI_SIGNATURE, путем // вычисления отпечатка, сформированного выше сообщения, // по алгоритму MD5 и представление его в Base64 $signature = base64_encode(pack(\"H*\", md5($fieldValues . $secret_key))); //Добавление параметра WMI_SIGNATURE в словарь параметров формы $fields[\"WMI_SIGNATURE\"] = $signature; $form = parent::form($fields,$data,\'https://wl.walletone.com/checkout/checkout/Index\'); return $form; } function result($data){ global $wrp_options; $secret_key = $wrp_options[\'WO_SECRET_KEY\']; $data->pay_summ = $_REQUEST[\"WMI_PAYMENT_AMOUNT\"]; $data->pay_id = $_REQUEST[\"WMI_PAYMENT_NO\"]; $data->email_user = $_REQUEST[\"USER_ID\"]; $data->pay_type = $_REQUEST[\"TYPE_PAY\"]; if (!isset($_REQUEST[\"WMI_SIGNATURE\"])) $this->print_answer(\"Retry\", \"Отсутствует параметр WMI_SIGNATURE\"); if (!isset($_REQUEST[\"WMI_PAYMENT_NO\"])) $this->print_answer(\"Retry\", \"Отсутствует параметр WMI_PAYMENT_NO\"); if (!isset($_REQUEST[\"WMI_ORDER_STATE\"])) $this->print_answer(\"Retry\", \"Отсутствует параметр WMI_ORDER_STATE\"); // Извлечение всех параметров POST-запроса, кроме WMI_SIGNATURE foreach($_REQUEST as $name => $value) { if ($name !== \"WMI_SIGNATURE\") $params[$name] = $value; } // Сортировка массива по именам ключей в порядке возрастания // и формирование сообщения, путем объединения значений формы uksort($params, \"strcasecmp\"); $values = \"\"; foreach($params as $name => $value) { //Конвертация из текущей кодировки (UTF-8) //необходима только если кодировка магазина отлична от Windows-1251 //$value = iconv(\"utf-8\", \"windows-1251\", $value); $values .= $value; } // Формирование подписи для сравнения ее с параметром WMI_SIGNATURE $signature = base64_encode(pack(\"H*\", md5($values . $secret_key))); //Сравнение полученной подписи с подписью W1 if ($signature == $_REQUEST[\"WMI_SIGNATURE\"]){ if (strtoupper($_REQUEST[\"WMI_ORDER_STATE\"]) == \"ACCEPTED\"){ // TODO: Пометить заказ, как «Оплаченный» в системе учета магазина if(!parent::get_pay($data)){ //print_answer(\"Ok\", \"Заказ #\" . $_POST[\"WMI_PAYMENT_NO\"] . \" оплачен!\"); print \"WMI_RESULT=\" . strtoupper(\"Ok\") . \"&\"; print \"WMI_DESCRIPTION=\" .urlencode(\"Заказ #\" . $_POST[\"WMI_PAYMENT_NO\"] . \" оплачен!\"); parent::insert_pay($data); exit; } }else{ // Случилось что-то странное, пришло неизвестное состояние заказа $this->print_answer(\"Retry\", \"Неверное состояние \". $_REQUEST[\"WMI_ORDER_STATE\"]); } }else{ // Подпись не совпадает, возможно вы поменяли настройки интернет-магазина $this->print_answer(\"Retry\", \"Неверная подпись \" . $_REQUEST[\"WMI_SIGNATURE\"],$signature); } } function print_answer($result, $description,$signature=false){ wrp_mail_payment_error($signature); print \"WMI_RESULT=\" . strtoupper($result) . \"&\"; print \"WMI_DESCRIPTION=\" .urlencode($description); exit(); } } }

5) Скрины настроек прилагаю, но вроде все ок.
a)ЕК ЕК
b)Админка Админка
c)Страницы Страницы

ПС:Написал еще супорту ЕК, жду ответ. Надеюсь общими усилиями справимся 🙂

0
виталий
не в сети 5 лет
На сайте с 06.10.2016
Участник
Тем 3
Сообщения 20
2
17:54

Ключ в ЕК новый генерировал и в админке сайта менял, если что)

0
Андрей CS
не в сети 3 дня
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16855
3
18:16

откройте файл \wp-content\plugins\wp-reservation-place\gateways\walletone.php
на 158 строке будет

if ($name !== "WMI_SIGNATURE") $params[$name] = $value;

измените так
if ($name !== "WMI_SIGNATURE") $params[$name] = wp_unslash($value);

0
виталий
не в сети 5 лет
На сайте с 06.10.2016
Участник
Тем 3
Сообщения 20
4
18:31

Заменил, провел новый платеж, платеж прошел, в админке статус так и не изменился.

foreach($_REQUEST as $name => $value)
{
  if ($name !== "WMI_SIGNATURE") $params[$name] = wp_unslash($value);
}

0
виталий
не в сети 5 лет
На сайте с 06.10.2016
Участник
Тем 3
Сообщения 20
5
18:32

Ответ от ЕК
Добрый день. В параметре WMI_INVOICE_OPERATIONS - [{\"CreateDate\":\"2017-10-03 10:45:53\",\"PaymentId\":\"151774050\",\"Amount\":\"10.00\",\"AmountEntryId\":\"10862712470\"}] необходимо убрать символы экранирования \ и повторить попытку.

0
виталий
не в сети 5 лет
На сайте с 06.10.2016
Участник
Тем 3
Сообщения 20
6
18:34

Во всем скрипте плагина не нахожу строк WMI_INVOICE_OPERATIONS, откуда он берет их?

0
Андрей CS
не в сети 3 дня
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16855
7
18:36

я дал вам решение проблемы, убедитесь, что вы верно внесли изменения в указанный файл.

0
виталий
не в сети 5 лет
На сайте с 06.10.2016
Участник
Тем 3
Сообщения 20
8
19:02

прописал:
скрин


код
Спойлер

<?php

if(class_exists(\'WRP_Payment\')){

add_action(\'init\',\'wrp_add_walletone_payment\');
function wrp_add_walletone_payment(){
    $pm = new WRP_Walletone_Payment();
    $pm->register_payment(\'walletone\');
}

class WRP_Walletone_Payment extends WRP_Payment{

    public $form_pay_id;
    public $payments_json;

    function register_payment($form_pay_id){
        $this->form_pay_id = $form_pay_id;
        parent::add_payment($this->form_pay_id, array(
            \'class\'=>get_class($this),
            \'request\'=>\'WMI_PAYMENT_NO\',
            \'name\'=>\'WalletOne\'
            ));
        if(is_admin()) $this->add_options();
    }

    function add_options(){
        add_filter(\'wrp_pay_option\',(array($this,\'options\')));
        add_filter(\'wrp_pay_child_option\',(array($this,\'child_options\')));
    }

    function options($options){
        $options[$this->form_pay_id] = __(\'WalletOne\',\'rcl-walletone\');
        return $options;
    }

    function child_options($child){

        $opt = new WRP_Options();

        $child .= $opt->child(
            array(
                \'name\'=>\'connect_sale\',
                \'value\'=>$this->form_pay_id
            ),
            array(
                $opt->title(__(\'Настройки подключения WalletOne\',\'rcl-walletone\')),
                $opt->label(__(\'Merchant ID\',\'rcl-walletone\')),
                $opt->option(\'text\',array(\'name\'=>\'WO_MERCHANT_ID\')),
                $opt->label(__(\'Секретный ключ\',\'rcl-walletone\')),
                $opt->option(\'password\',array(\'name\'=>\'WO_SECRET_KEY\')),
                $opt->label(__(\'Доступные способы оплаты\',\'rcl-walletone\')),
                $content
            )
        );

        return $child;
    }

    function pay_form($data){
        global $wrp_options;

        $merchant_id = $wrp_options[\'WO_MERCHANT_ID\'];
        $secret_key = $wrp_options[\'WO_SECRET_KEY\'];

        $curs = array( \'RUB\' => 643, \'UAH\' => 980, \'KZT\' => 398, \'USD\' => 840, \'EUR\' => 978 );
        $code_cur = (isset($curs[$wrp_options[\'primary_cur\']]))? $curs[$wrp_options[\'primary_cur\']]: 643;
        
		//описание
        $desc = ($data->description)? $data->description: \'Платеж от \'.$data->email_user;

        $fields = array(
            \'WMI_MERCHANT_ID\'=>$merchant_id,
            \'WMI_PAYMENT_AMOUNT\'=>$data->pay_summ.\'.00\',
            \'WMI_CURRENCY_ID\'=>$code_cur,
            \'WMI_PAYMENT_NO\'=>$data->pay_id,
            \'WMI_DESCRIPTION\'=>$desc,
            \'WMI_SUCCESS_URL\'=>get_permalink($wrp_options[\'page_successfully_pay\']),
            \'WMI_FAIL_URL\'=>get_permalink($wrp_options[\'page_fail_pay\']),
            \'USER_ID\'=>$data->email_user,
            \'TYPE_PAY\'=>$data->pay_type,
            \'CMS\'=>30
        );

        //Сортировка значений внутри полей
          foreach($fields as $name => $val)
          {
            if (is_array($val))
            {
               usort($val, "strcasecmp");
               $fields[$name] = $val;
            }
          }

          // Формирование сообщения, путем объединения значений формы,
          // отсортированных по именам ключей в порядке возрастания.
          uksort($fields, "strcasecmp");
          $fieldValues = "";

          foreach($fields as $value)
          {
              if (is_array($value))
                 foreach($value as $v)
                 {
                //Конвертация из текущей кодировки (UTF-8)
                    //необходима только если кодировка магазина отлична от Windows-1251
                    $v = iconv("utf-8", "windows-1251", $v);
                    $fieldValues .= $v;
                 }
             else
            {
               //Конвертация из текущей кодировки (UTF-8)
               //необходима только если кодировка магазина отлична от Windows-1251
               $value = iconv("utf-8", "windows-1251", $value);
               $fieldValues .= $value;
            }
          }

          // Формирование значения параметра WMI_SIGNATURE, путем
          // вычисления отпечатка, сформированного выше сообщения,
          // по алгоритму MD5 и представление его в Base64

          $signature = base64_encode(pack("H*", md5($fieldValues . $secret_key)));

          //Добавление параметра WMI_SIGNATURE в словарь параметров формы

          $fields["WMI_SIGNATURE"] = $signature;

        $form = parent::form($fields,$data,\'https://wl.walletone.com/checkout/checkout/Index\');

        return $form;
    }

    function result($data){
        global $wrp_options;

        $secret_key = $wrp_options[\'WO_SECRET_KEY\'];

        $data->pay_summ = $_REQUEST["WMI_PAYMENT_AMOUNT"];
        $data->pay_id = $_REQUEST["WMI_PAYMENT_NO"];
        $data->email_user = $_REQUEST["USER_ID"];
        $data->pay_type = $_REQUEST["TYPE_PAY"];
	
		

        if (!isset($_REQUEST["WMI_SIGNATURE"]))
            $this->print_answer("Retry", "Отсутствует параметр WMI_SIGNATURE");

          if (!isset($_REQUEST["WMI_PAYMENT_NO"]))
            $this->print_answer("Retry", "Отсутствует параметр WMI_PAYMENT_NO");

          if (!isset($_REQUEST["WMI_ORDER_STATE"]))
            $this->print_answer("Retry", "Отсутствует параметр WMI_ORDER_STATE");

          // Извлечение всех параметров POST-запроса, кроме WMI_SIGNATURE

          foreach($_REQUEST as $name => $value)
          {
            if ($name !== "WMI_SIGNATURE") $params[$name] = wp_unslash($value);
          }

          // Сортировка массива по именам ключей в порядке возрастания
          // и формирование сообщения, путем объединения значений формы

          uksort($params, "strcasecmp"); $values = "";

          foreach($params as $name => $value)
          {
            //Конвертация из текущей кодировки (UTF-8)
            //необходима только если кодировка магазина отлична от Windows-1251
            //$value = iconv("utf-8", "windows-1251", $value);
            $values .= $value;
          }

          // Формирование подписи для сравнения ее с параметром WMI_SIGNATURE

          $signature = base64_encode(pack("H*", md5($values . $secret_key)));

          //Сравнение полученной подписи с подписью W1

          if ($signature == $_REQUEST["WMI_SIGNATURE"]){
            if (strtoupper($_REQUEST["WMI_ORDER_STATE"]) == "ACCEPTED"){
              // TODO: Пометить заказ, как «Оплаченный» в системе учета магазина
              if(!parent::get_pay($data)){
                  print_answer("Ok", "Заказ #" . $_POST["WMI_PAYMENT_NO"] . " оплачен!");
                  print "WMI_RESULT=" . strtoupper("Ok") . "&";
                  print "WMI_DESCRIPTION=" .urlencode("Заказ #" . $_POST["WMI_PAYMENT_NO"] . " оплачен!");
                  parent::insert_pay($data);
                  exit;
              }
            }else{
              // Случилось что-то странное, пришло неизвестное состояние заказа
              $this->print_answer("Retry", "Неверное состояние ". $_REQUEST["WMI_ORDER_STATE"]);
            }
          }else{
            // Подпись не совпадает, возможно вы поменяли настройки интернет-магазина
            $this->print_answer("Retry", "Неверная подпись " . $_REQUEST["WMI_SIGNATURE"],$signature);
          }

    }

    function print_answer($result, $description,$signature=false){
      wrp_mail_payment_error($signature);
      print "WMI_RESULT=" . strtoupper($result) . "&";
      print "WMI_DESCRIPTION=" .urlencode($description);
      exit();
    }

}

}

Провел еще один платеж, все равно не обновляется статус(
Письма приходят от wordpress@respectshow.ru, я могу где вывод настроить на сайте чтоб отловить этот баг?
В каких файлах посоветуете поковыряться или идеи может еще есть какие-то?

0
Андрей CS
не в сети 3 дня
На сайте с 30.11.-0001
Администратор
Тем 71
Сообщения 16855
9
19:08

Данная правка должна решить проблему с изменением в работе АПИ от ЕК, больше ничего делать не требуется.
Проблема может возникнуть только если были сбиты настройки подключения.

0
виталий
не в сети 5 лет
На сайте с 06.10.2016
Участник
Тем 3
Сообщения 20
10
19:24

Ок, спасибо. Буду разбираться дальше.

0
Вы не имеете права на публикацию сообщений в этой теме