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