WalletOne проверка статуса платежа

Web-разработка

Автор: Александр Башкин

6 июн. 2016 г., 17:22:48  4274


Всем привет!

Наверняка кто-то из вас использует систему WalletOne на своих сайтах в виде единой кассы. Если кто-то не знает, о чем речь, вот ссылка для ознакомления - https://www.walletone.com/ru/about/

Коротко опишу как это работает.

Вы можете взять из документации пример формы оплаты:

<form method="post" action="https://wl.walletone.com/checkout/checkout/Index">
<input name="WMI_MERCHANT_ID"    value="123456789012"/>
<input name="WMI_PAYMENT_AMOUNT" value="1.00"/>
<input name="WMI_CURRENCY_ID"    value="643"/>
<inputname="WMI_DESCRIPTION"    value="Оплата демонстрационного заказа"/>
<input name="WMI_SUCCESS_URL"    value="https://myshop.ru/w1/paid.php"/>
<input name="WMI_FAIL_URL"       value="https://myshop.ru/w1/fail.php"/>
<inputtype="submit"/>
</form>

Где:

WMI_MERCHANT_ID – Идентификатор интернет-магазина, полученный при регистрации.

WMI_PAYMENT_AMOUNT – Сумма заказа

WMI_SUCCESS_URL - Ссылка на которую вас редиректит после оплаты

WMI_FAIL_URL – Ссылка на которую вас редиректит в случае не оплаты

Имеются и другие параметры, но для простого примера они нам не нужны.

Можете посмотреть на них тут https://www.walletone.com/ru/merchant/documentation/

Предположим, вы вставили эту форму на свой сайт и хотите совершить покупку. Нажимаете на кнопку «Отправить» и вас направляет на страницу оплаты.

Вы выбираете способ оплаты, делаете всё по инструкции и попадаете на страницу «Информации о заказе»:

Как мы видим «Статус оплаты» - ожидает оплаты.

Если мы сейчас нажмем кнопку – вернуться в магазин, то нашему магазину/сайту вернётся параметр WMI_ORDER_STATE.В случае успешной оплаты он будет равен ACCEPTED.

Но в данном случае вернётся параметр отличный от ACCEPTED и скрипт обработчик перенаправит нас по адресу, который находится в параметре WMI_FAIL_URL.

В целом, всё правильно. Статус платежа не оплачен, соответственно на перенаправление по WMI_SUCCESS_URLможно не надеяться.

Чтобы получить вожделенный ACCEPTED, нам нужно оставаться на странице «Информация о заказе» (смотри выше) и ждать, когда же статус сменится на Оплачен.

Это создаёт большие неудобства. Не все пользователи могут сразу понять, что необходимо оставаться на этой странице и дождаться обновления статуса, даже если вы напишете им инструкцию перед тем, как они попытаются совершить оплату. Я уверен, что большая часть проигнорирует все ваши предупреждения и инструкции,а сама проблема заключается в том, что у WalletOne отсутствует в документации, да и вообще где-либо информация о том, как можно проверить статус платежа. На быстрые ответы поддержки вы можете не рассчитывать.

Если пользователь ушёл не дождавшись обновления статуса, то ему могут не начислиться бонусы, или если магазин подразумевает продажу каких-то виртуальных вещей, то он может этого не получить. Потому что магазин не в состоянии самостоятельно перепроверить статус платежа. Это создаёт проблемы, например, пользователь купил у вас товар на сумму 5000 руб. и не дождавшись обновления статуса оплаты вернулся в магазин. И магазин ему ничего не начислит и вообще будет считать, что он ничего вам не заплатил, хоть деньги на счёт магазина уже пришли.

Поковырявшись во внутренностях этой страницы, мы можем увидеть решение этой проблемы.

На ней находится простой скрипт, который проверяет статус платежа… Почему разработчики не описали эту функцию для всех пользователей вообще не понятно.

Сам скрипт выглядит вот так:

<script>
varpaymentsCount = 0;
varinvoiceState = 'Created';
functionstatusHandler() {
console.log("Update invoice status");
    $.ajax({
contentType: "application/json",
type: 'GET',
cache: false,
url: 'https://wl.walletone.com/checkout/checkout/State?i=336119940002',
success: function (data) {
console.log(JSON.stringify(data));
if (paymentsCount != data.paymentsCount ||
invoiceState != data.invoiceState ||
data.invoiceState == "Accepted") {
location.reload();
          }
      },
error: function() {
      }
  });
};
setInterval("statusHandler()", 7000);
</script>

Каждые 7 секунд у нас запускается функция, которая отправляет get-запрос на адрес https://wl.walletone.com/checkout/checkout/State и передаёт в параметре ?i=номер нашего счета 3361120617949.

В ответ мы должны получить сумму платежа – ту которая указана в счете и статус оплачено (ACCEPTED). По умолчанию скрипт имеет данные – сумма = 0 и статус – Created (ожидает оплаты)

Как только мы получаем подтверждение об оплате страница обновляется, и мы видим, чтостатус платежа стал Оплачено. И теперь при нажатии на «Вернуться в магазин» мы получим правильный WMI_ORDER_STATE.

В документации нам предлагают обработать код ответа, вот так:

if (strtoupper($_POST["WMI_ORDER_STATE"]) == "ACCEPTED")
{
  // TODO: Пометить заказ, как «Оплаченный» в системе учета магазина
print_answer("Ok", "Заказ #" . $_POST["WMI_PAYMENT_NO"] . " оплачен!");
}
else
{
  // Случилось что-то странное, пришло неизвестное состояние заказа
print_answer("Retry", "Неверноесостояние ". $_POST["WMI_ORDER_STATE"]);
}

В массиве $_POSTнам придёт WMI_ORDER_ID – который является номером счёта.

Подставив его к https://wl.walletone.com/checkout/checkout/State?i=номер_счёта и сделав запрос мы можем автоматизировать проверку статуса платежа для тех, кто не дождался обновления статуса оплаты.

На этом всё. Спасибо.