использование Banklink (Pandalink) на php

Решил я написать небольшой док по запуску модной в наших краях системы BankLink (Pangalink). Сподвигло меня на это дело сразу несколько обстоятельств. Во-первых, совершенное отсутствие адекватного руководства на русском языке. Во-вторых отсутствие вообще какого-либо руководства о том что это такое и зачем оно собственно нужно. И в третьих, прикольная тема, работа которой мне очень понравилась. Да и чтобы самому не забыть в будущем.

1. Что это такое?
В Прибалтике набирает силу электронная комерция и как результат возникает логичный вопрос: как платить деньги? Есть много разных вариантов, но все они имеют как свои плюсы, так и минусы.
а) оплата товара по факту доставки. Не очень удобно возиться с наличкой. Возможен вариант что клиент откажется от товара, когда ему уже его привезут, а значит будут неоправданные транспортные расходы. Этот вариант работал лет 7 назад в Латвии. Сам покупал таким образом.
б) оплата посредством кредитной карточки. Далеко не у всех еще есть такие карточки. Оправданная паранноя по поводу кражи данных кредиток уменьшит колличество клиентов.
в) оплата через системы типа PayPal. Тоже не очень удобно, потому что занимает время на трансфер денег со счета фирмы посредника.
г) оплата через месный банк, через систему авторизации. Это он и есть тот самый BankLink. Тут есть тоже минусы: круг клиентов ограничивается клиентами банков, с которыми будет заключен договор.
В идеале, надо было бы снабдить свой магазин всеми вариантами оплаты. Кстати, Skype именно так и делает.

2. Алгоритм работы.
Клиент интернет магазина вводит необходимую сумму на сайте Продавца.
Продавец предлагает оплатить через BankLink того банка, который больше устраивает Покупателя.
Выбрав банк, данные об оплате перенаправляются в банк.
Банк предлагает авторизироваться клиенту и подтвердить платежку.
После подтверждения платежа, банк позвращает определенные данные на страницу Продавца.

3. Код.
Необходимые для рабты скрипты я брал вот тут. Невероятное человеческое спасибо Mihkel-Mikelis Putrinsh за проделанную работу.
3.1 Форма отправления данных в банк.
Все данные отправляются методом POST через безопасный HTTPS шлюз. Разберем тот набор данных, которые мы посылаем на примере этой формы.

3.2. Форма получения данных из банка.
Все данные толучаются из банка методом POST через безопасный HTTPS шлюз. Как это делать посмотрим на примере.

4. Безопасность.
Безопасность в нашем деле превыше всего. Как же она осуществляется?
4.1 Продавец посылает данные в банк.
В параграфе 3.1 мы посылали переменную VK_MAC. Она создается следующим образом:
Значение функции МАС008 вычисляется при помощи алгоритма публичного ключа RSA. В учет также принимается длина пустых полей – «000».
MAC008(x1,x2,…,xn) := RSA( SHA-1(p(x1 )|| x1|| p(x2 )|| x2 || … ||p( xn )||xn),d,n)
где:

|| представляет собой действие по сложению строки /стринга/
x1, x2, …, xn являются параметрами запроса
p функция длины параметра. Длина – это номер в виде трехместной строки
d тайный экспонент RSA
n является модулем RSA

Вычисление сигнатуры проводится в соответствии со стандартом PKCS1 (RFC 2437).
Это выдержка с официального сайта ХансаПанка.
В нашем случае это выглят таким образом:
Методов добыть подпись есть немало. Один можно увидеть в этом файле, другой я распишу сам.

Полученную таким образом подпись мы посылаем в банк вместе с другими данными. В процессе заключения договора Продавец послал Банку публичный ключ. И вот с помощью этого ключа Банк будет распознавать правильность нашей подписи.

4.2 В параграфе 3.2 мы проверяли правильность подписи Банка. Для этой цели банк выдает нам свой публичный ключ.
Я разберу метод проверки на этом примере.

5. Вот и все.
Вот собственно и все хитрости, о которых я хотел поведать.
В процессе исследования этой функциональности не пострадало ни одно животное.
Была использована информация со следующих сайтов:
HansaPank — техническое описание.
SEB EESTI Ühispank — техническая спецификация.
Sampo Pank — банковская ссылка.
Mihkel-Mikelis Putrinsh скрипты.