Работа с 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 я не нашёл.

Комментарии

  1. Анонимный24 июля 2009 г., 14:15

    спасибо за опыт :)

    ОтветитьУдалить
  2. та незачто) столько нервов забрало это, что просто не мог не поделится :)

    ОтветитьУдалить
  3. А я вот тоже никак не разгребу. Огромное спасибо за статью. Вот если бы ещё примерчик на отправку платежа от мерчата на какой-то телефон пользователя. Например выплата по партнёрке. Вообще круто было бы.

    ОтветитьУдалить
  4. К сожалению у самого стоит такая задача, но насколько я понимаю старый API уже такого делать не может.:( Как только разберусь - обязательно напишу ещё статейку :)

    ОтветитьУдалить
  5. а код на асп можно посмотреть? скрипты которые обработку делают? а то все никак не могу прикрутить на сайт этот ликвипей... ((

    ОтветитьУдалить
  6. https://docs.google.com/leaf?id=0B6h7yaggRA4pYzQ0ZDExYTItYzRkZC00ODE0LWIxNGYtYTZmNTNlZmE1ZDg5&hl=en

    Вот тут выложил пару файлов.

    ОтветитьУдалить
  7. с 15 октября 2010 года прекращена поддержка протокола API версии 1.0 и 1.1. Если побороли версию 1.2, напишите как пожалуйста, а то голову уже сломал не сходятся подписи хоть убей

    ОтветитьУдалить
  8. Для версии 1.2
    При отправке данных используем "Подпись для операции send money API LiqPay",
    при получении квитанции "Подпись для остальных операций"

    ОтветитьУдалить

Отправить комментарий

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

HLSL шейдеры для чайников

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