Задать вопрос

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

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

Как настроить оплату через Wallet One? Прочёл техническую документацию, но нечего не получилось. Всё сделал как там написано. result.php постоянно выдаёт ошибку "Неверная подпись".
  • Вопрос задан
  • 6171 просмотр
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 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"]);
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы