Работа с LiqPay в ASP.NET и не только
Совсем недавно пришлось по работе столкнутся с сией системой.С помощью Liqpay можно использовать в интернете карточки VISA,MasterCard для своего интернет-магазина.Система конечно классная но что меня удивило - это "обилие" документации не только для ASP, но даже для php.
Её создатели любезно разместили на странице https://liqpay.com/?do=static&name=liqpaydev, которую можно найти долго изучая тэги на главной странице. Но не в этом суть.
Начал я с создания Click&Buy формы. Мы с напарником решили что раз уж работать через эту систему , то наверно нужно использовать новейщую версию АПИ - 1.2. Теперь я понимаю что наверно это было ошибкой). Об этом позже.
В данном примере я использую Click&Buy 1.0
В принципе сам вид запроса довольно прост и тут проблем не возникло.В поле merchant_id вписывается ID который получается в LiqPay.(Кстати если не найдёте где искать регистрацию - то делать нада нажав на Вход для торговцев или LiqPay checkout).
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):
Тут мы вначале склеиваем в опред.формате данные платежа. Merchant_password - пароль торговца. Его можна узнать в настройках торговца на liqpay.com. Полученную строку мы вначале хэшируем, а потом конвертируем в base64string.
Итак сделав сигнатуру мы бонально сравниваем её с той что нам передали в Form["signature"] и если они равны, то выполняем операцию. В моём случае это увеличение баланса пользователя.
Ну вот и всё. :)
PS: Я знаю, что то, что я написал - довольно простая вещь, но мне кажется это будет кому то полезно, потому что нормального примера использования liqpay, а тем более на ASP.NET я не нашёл.
Её создатели любезно разместили на странице 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 я не нашёл.
спасибо за опыт :)
ОтветитьУдалитьта незачто) столько нервов забрало это, что просто не мог не поделится :)
ОтветитьУдалитьА я вот тоже никак не разгребу. Огромное спасибо за статью. Вот если бы ещё примерчик на отправку платежа от мерчата на какой-то телефон пользователя. Например выплата по партнёрке. Вообще круто было бы.
ОтветитьУдалитьК сожалению у самого стоит такая задача, но насколько я понимаю старый API уже такого делать не может.:( Как только разберусь - обязательно напишу ещё статейку :)
ОтветитьУдалитьа код на асп можно посмотреть? скрипты которые обработку делают? а то все никак не могу прикрутить на сайт этот ликвипей... ((
ОтветитьУдалитьок. выложу на днях.
ОтветитьУдалитьhttps://docs.google.com/leaf?id=0B6h7yaggRA4pYzQ0ZDExYTItYzRkZC00ODE0LWIxNGYtYTZmNTNlZmE1ZDg5&hl=en
ОтветитьУдалитьВот тут выложил пару файлов.
с 15 октября 2010 года прекращена поддержка протокола API версии 1.0 и 1.1. Если побороли версию 1.2, напишите как пожалуйста, а то голову уже сломал не сходятся подписи хоть убей
ОтветитьУдалитьДля версии 1.2
ОтветитьУдалитьПри отправке данных используем "Подпись для операции send money API LiqPay",
при получении квитанции "Подпись для остальных операций"