Pull to refresh

LiqPay и PHP4 – опыт внедрения и вариант решения проблем

Reading time 2 min
Views 4K
Добрый день Хабра-сообщество!
Столкнулся я с системой платежей liqpay. В принципе, система создает очень приятное первое впечатление.
Но при попытке её интеграции на сайт я столкнулся с несколькими недостатками и проблемами.
Их описанием и решением я хотел бы с вами поделиться.

Форум поддержки


Очень забавная картина – бегло просматриваю форум, высматривая ответы на интересующие меня вопросы по API и интеграции. Подавляющее большинство ответов от liqpay: «письмо с решением Вашей проблемы отправлено на почту»…
Это что, простите, за форум такой? Общение через приват? Зачем он тогда нужен, если для получения ответа, мне все-равно нужно написать письмо в support?
Решения, простите не нашел. Думаю, что служба поддержки все-же поймет, что проще дать публичный ответ, чем отвечать приватно каждому, у кого возникла проблема.

Формулировки


Вторым сюрпризом для меня были не точности в формулировках терминов.
Например, на странице выбранной мною «API по приёму платежей в пользу мерчанта»:
Пароль мерчанта(merchant_sig) это уникальная запись мерчанта, которая выдается во время регистрации вашего магазина в нашей системе.
Свой merchant_id(номер мерчанта) и merchant_sig(подпись{пароль} мерчанта) можно посмотреть в разделе Настройки магазина после авторизации.
Цитата из «Инструкция по установке Liq&Buy 1.2»

Оказывается, при регистрации, мерчанту выдается две подписи, и ниодна из неих не называтся merchant_sig…
Одна имеет название «Подпись для операции send money API LiqPay», другая «Подпись для остальных операций».
Так вот, для приема платежей по средствам API через Интернет подходит не та, в которой есть слова «API LiqPay», а та, которая для остальных операций.

Версия PHP и sha1


В рекомендациях по интеграции я не нашел (или просто не увидел) информации о версии PHP. Как оказалось, такое системное требование liqpay все-же выставляет.
Примеры кода:
PHP: $sign=base64_encode(sha1($merc_sign.$xml.$merc_sign,1));
Perl: $sign=encode_base64(sha1($merc_sign.$xml.$merc_sign));
Цитата из «Инструкция по установке Liq&Buy 1.2 :: Создание подписи signature »

Ряд проектов я поддерживаю на PHP версии 4, поэтому первый тест я писал именно для нее. Интерпритатор выдал мне ошибку несоответствия колличества параметров для функции Sha1. Как нормальный разработчик обращаюсь к документации и вижу, что второй, необязательный параметр, был введен только в версии 5.0.0

Решение:

  1. Простое: перейти на версию PHP 5
  2. Сложное ( :) ): Почитать внимательно документацию и понять разницу в работе функции с параметром и без него.

Без параметра sha1 выдает Хэш в виде 40-разрядного шестнадцатиричного числа.
С параметром — хэш, в виде двоичной строки из 20 символов.
Соответственно, нужно перевести 40-разрядное шестнадцатиричное число в двоичную строку? состоящую из 20 символов.
Как выяснилось, это делается довольно просто — функция Pack сделает это для вас :)
Итого
PHP5:sha1($str,true) = PHP4:pack( "H40", sha1($str) )
Вуаля :)
Если будет интересно и возникнут еще ситуации — обязательно отпишусь :)
Tags:
Hubs:
-3
Comments 11
Comments Comments 11

Articles