Добрый вечер, выручайте))
Не обновляется статус оплаты в админке,
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)Страницы 
ПС:Написал еще супорту ЕК, жду ответ. Надеюсь общими усилиями справимся 🙂
прописал:
скрин
код
<?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, я могу где вывод настроить на сайте чтоб отловить этот баг?
В каких файлах посоветуете поковыряться или идеи может еще есть какие-то?
