Работа с LiqPay в ASP.NET и не только

Совсем недавно пришлось по работе столкнутся с сией системой.С помощью Liqpay можно использовать в интернете карточки VISA,MasterCard для своего интернет-магазина.Система конечно классная но что меня удивило - это "обилие" документации не только для ASP, но даже для php.

Её создатели любезно разместили на странице https://liqpay.com/?do=static&name=liqpaydev, которую можно найти долго изучая тэги на главной странице. Но не в этом суть.

Начал я с создания Click&Buy формы. Мы с напарником решили что раз уж работать через эту систему , то наверно нужно использовать новейщую версию АПИ - 1.2. Теперь я понимаю что наверно это было ошибкой). Об этом позже.

В данном примере я использую Click&Buy 1.0




<form action='https://liqpay.com/?do=click_n_buy' method='POST' accept-charset='utf-8'/>
<input type='hidden' name='version' value='1.1' />
<input type='hidden' name='merchant_id' value='i4999913091' />
<input type='hidden' name='amount' value='сумма'/>
<input type='hidden' name='currency' value='UAH' />
<input type='hidden' name='description' value='DESCR' />
<input type='hidden' name='order_id' value='test' />
<input type='hidden' name='result_url'
value='тут_страничка_куда переходим после оплаты' />
<input type='hidden' name='server_url'
value='это_страничка_уведомления_о_статусе_платежа' />
<input type='submit' value='Оплатить' />
</form>



В принципе сам вид запроса довольно прост и тут проблем не возникло.В поле merchant_id вписывается ID который получается в LiqPay.(Кстати если не найдёте где искать регистрацию - то делать нада нажав на Вход для торговцев или LiqPay checkout).


Кстати замечу что в поле order_id можно передать свой параметр( например номер заказа). Система его не использует.


result_url - страница которая будет отображена когда оплата будет совершена. Тут можно написать о том что оплата была успешной и поблагодарить пользователя за то что отдал денюжки. Но вот совершать какие либо действия тут ( как например увеличить баланс пользователя или чтото в этом роде) ни в коем случае не следует - данные операции следует выполнять на server_url.

server_url - страница оповещения об успешном переводе денег. Это скорее даже не страница, а скрипт. В АСП её удобно создавать как .ashx страницу.

Итак первая часть задачи прошла как по маслу. Запрос отправлялся и я с радостью видел страничку оплаты на Liqpay. Теперь предстояло создать result_url и server_url. И если при создании result_url не обязательно делать много проверок на безопасность, то при создании server_url очень важно проверить является ли действительно это запрос от сервера liqpay или это проделки хакера.

Для этого в server_url кроме данных о статусе платежа передаётся сигнатура - строка составленная из данных торговца, данных платежа и секретного пароля. На странице server_url составляется аналогичная строка и если строки совпадают то значит всё ОК.
Так вот именно в этой части я увяз вначале.

Если читать документацию к АПИ 1.2 то можно увидеть что там сигнатура составляется по виду пароль+неупакованная хмл+пароль. Далее она хэшируется и приводится к base64_string. Но как не старайся сигнатура не совпадала. В поддержке меня ещё более удивили, дав пример с совсем другим видом сигнатуры. Но и оно не помогло. Вообщем проблема была решена, когда я решил использовать АПИ 1.0.

Так вот в этом АПИ на server_url передаются след. параметры методом POST:
signature - та строка с сигнатурой, которая правильная. мы должны составить свою и если она совпадёт значит это запрос с сервера liqpay.
merchant_id - не знаю зачем оно передаётся, мы его и так знаем. Но это наш id торговца
amount - цена товара
currency - валюта
order_id - наш пользовательский параметр.
status - статус платежа.если success - то платёж принят. если failure - то чтото не так.
sender_phone - телефон отправителя

Кроме того есть параметры action,code,transaction_id,action_name,version. Они нам понадобятся для создания сигнатуры.

Код создания сигнатуры(на ASP):


var signature_source = string.Format("|{0}|{1}|{2}|{3}|{4}|{5}|{6}|{7}|{8}|{9}|{10}|",
version, merchant_password, action_name, sender_phone, merchant_id,
amount, currency, order_id, transaction_id, status, code);
var signature_hash = Convert.ToBase64String(
SHA1.Create().ComputeHash(
Encoding.UTF8.GetBytes(signature_source)));


Тут мы вначале склеиваем в опред.формате данные платежа. Merchant_password - пароль торговца. Его можна узнать в настройках торговца на liqpay.com. Полученную строку мы вначале хэшируем, а потом конвертируем в base64string.

Итак сделав сигнатуру мы бонально сравниваем её с той что нам передали в Form["signature"] и если они равны, то выполняем операцию. В моём случае это увеличение баланса пользователя.

Ну вот и всё. :)

PS: Я знаю, что то, что я написал - довольно простая вещь, но мне кажется это будет кому то полезно, потому что нормального примера использования liqpay, а тем более на ASP.NET я не нашёл.

Популярные сообщения из этого блога

Backbone.JS + ASP.NET WebAPI

2D Физика для игр - Separate Axis Theorem