Как настроить оплату через WalletOne?

Здравствуйте.

Как настроить оплату через Wallet One? Прочёл техническую документацию, но нечего не получилось. Всё сделал как там написано. result.php постоянно выдаёт ошибку "Неверная подпись".
  • Вопрос задан
  • 6145 просмотров
Пригласить эксперта
Ответы на вопрос 6
@AleksandrY
У самого такая проблема была. Два дня возился и разобрался. У них на странице ясно и понятно написано:
Если параметр WMI_DESCRIPTION содержит кириллицу, убедитесь, что форма отправляется на сервер в кодировке UTF-8. Для этого форма должна иметь атрибут accept-charset=»UTF-8″.
Вот из-за этого и дает ошибку, как только я написал описание платежа на английском так и проблема пропала, а платежи проходят отлично.

P.S. Атрибут ставил не помогло. Только EN
Ответ написан
NYMEZIDE
@NYMEZIDE
резюме - ivanfilatov.ru
Приведите пример кода.
Ответ написан
Комментировать
djalexsey
@djalexsey Автор вопроса
result.php
<?php

// Секретный ключ интернет-магазина (настраивается в кабинете)

$skey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

// Функция, которая возвращает результат в Единую кассу

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

// Проверка наличия необходимых параметров в POST-запросе

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

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

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

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

foreach($_POST 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 . $skey)));

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

if ($signature == $_POST["WMI_SIGNATURE"])
{
if (strtoupper($_POST["WMI_ORDER_STATE"]) == "ACCEPTED")
{
// TODO: Пометить заказ, как «Оплаченный» в системе учета магазина

print_answer("Ok", "Заказ #" . $_POST["WMI_PAYMENT_NO"] . " оплачен!");
}
else
{
// Случилось что-то странное, пришло неизвестное состояние заказа

print_answer("Retry", "Неверное состояние ". $_POST["WMI_ORDER_STATE"]);
}
}
else
{
// Подпись не совпадает, возможно вы поменяли настройки интернет-магазина

print_answer("Retry", "Неверная подпись " . $_POST["WMI_SIGNATURE"]);
}

?>

pay.php
//Секретный ключ интернет-магазина
$key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

$fields = array();

// Добавление полей формы в ассоциативный массив
$fields["WMI_MERCHANT_ID"]    = "11111111111";
$fields["WMI_PAYMENT_AMOUNT"] = "0.1";
$fields["WMI_CURRENCY_ID"]    = "643";
$fields["WMI_PAYMENT_NO"]     = "12345-005";
$fields["WMI_SUCCESS_URL"]    = "http://site.ru/_PaySystem/w1/result.php";
$fields["WMI_DESCRIPTION"]    = "BASE64:".base64_encode("Пополнение лицевого счета");
$fields["WMI_EXPIRED_DATE"]   = "2019-12-31T23:59:59";
$fields["Login"]       = "admin";

//Сортировка значений внутри полей
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 . $key)));

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

$fields["WMI_SIGNATURE"] = $signature;

// Формирование HTML-кода платежной формы

print '<form action="https://www.walletone.com/checkout/default.aspx" method="POST">';

foreach($fields as $key => $val)
{
if (is_array($val))
foreach($val as $value)
{
print $key.':<input type="text" name="'.$key.'" value="'.$value.'"/>';
}
else
print $key.':<input type="text" name="'.$key.'" value="'.$val.'"/>';
}

print '<input type="submit"/></form>';
Ответ написан
AloneCoder
@AloneCoder
[object Object]
Даю руку на отсечение, что сделали вы не все как там описано
Ответ написан
windoctor
@windoctor
А почему вы решили задать этот вопрос здесь, а не в службе поддержки WalletOne?
Ответ написан
@Alexandra_Bel
У меня тоже была проблема с сигнатурой, все данные приходили со знаками процентов и другими левыми символами, решилось это тем, что пришлось декодировать полученные данные.
$_POST["WMI_SIGNATURE"]=urldecode($_POST["WMI_SIGNATURE"]);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы