Рассмотрим основные вехи большого пути на примере интеграции bitcoin в качестве способа приема платежей.
Предположим вы — разработчик, и ваш продвинутый и небедный заказчик, начитавшись о том как круто принимать платежи в криптовалюте, пришел к вам с простенькой просьбой — «А прикрути-ка нам биткоин!».
Для начала попробую отбить у вас желание заниматься этим неблагодарным делом.
Вот неполный список проблем, с которыми вы столкнетесь:
-постоянно меняющийся курс
-время прохождения транзакции по сети
-полное отсутствие контроля над суммой, которую отправляет покупатель
-отсутствие внятного и прозрачного механизма, который позволит просто организовать отслеживание платежа
Но давайте представим, чисто теоретически, что заказчик готов мириться со всеми этими и еще десятком других проблем, и отвертеться от него не получилось.
Тогда для начала рассмотрим, как, собственно, мы будем принимать платежи. Как всегда, есть как минимум два пути. Первый, относительно простой, мало чем отличающийся от интеграции, например, PayPal или Privat24. Воспользоваться готовым сервисом, например — bitpay. Сервисов таких немало, многие из них, помимо bitcoin, позволяют принимать несколько разных криптовалют. Все прозаично и достаточно просто, документация и примеры есть чаще всего на сайте сервиса в достаточном объеме.
Но мы не ищем легких путей, да? К тому же сумму, выставленную настойчивому заказчику, нужно отработать ( или сделать вид, что отработали).
Поэтому рассмотрим второй путь, полный трудностей, проблем и неочевидных решений.
Плюс его в том, что осилив его один раз, вы освоите не только несколько уровней морских ругательств, но и значительно глубже поймете, как организованы криптовалюты и что они позволяют реализовать.
В обычном случае, при интеграции сферического в вакууме платежного шлюза, последовательность действий (с незначительными деталями) выглядит примерно следующим образом.
Пользователь выбрал интересующие его товары, добавил их в корзину и нажал заветную кнопку «купить». Заполнил все необходимые поля, такие как адрес доставки, телефон, адрес электронной почты, и наконец добрался до оплаты. Тут начинается немного магии.
Программное обеспечение сайта продавца формирует специальную форму, чаще всего именуемую SCI (Shopping Cart interface). После клика по кнопке «Оплатить» эта форма перенаправит покупателя на сайт платежной системы (к примеру PayPal), с заранее заданными данными о платеже. Очевидно это будет как минимум — номер заказа, сумма к оплате и, вероятно, какое-то примечание к платежу, например «Инвойс за теннисные мячики №00012».
Пользователь входит под своими учетными данными и подтверждает, что он действительно хочет произвести оплату. В случае, если у него достаточно средств, все данные введены корректно и нет проблем с передачей денег, происходит непосредственно оплата. В случае успешной оплаты, платежный шлюз отправляет уведомление серверу продавца, которое включает сумму, время оплаты и номер счета, который был оплачен. Дополнительно могут быть переданы произвольные данные, но для нашего примера это не столь важно. В это же время сам покупатель перенаправляется обратно на сайт продавца, где получает торжественное поздравление с успешной оплатой и клятвенное обещание выслать товар вот прямо сейчас.
Что нам важно в этой последовательности?
Три ключевых момента.
Первое — сумма оплаты задается продавцом.
Второе -платеж происходит с достаточно точной идентификацией за какой именно заказ.
И третье — уведомление, которое получает сервер продавца практически невозможно подделать.
Такая система сформировалась не сразу, но в более-менее похожей форме она реализована в большинстве платежных шлюзов и электронных платежных систем, таких как Skrill или PayPal.
Теперь посмотрим, что нас ожидает, когда мы собираемся интегрировать bitcoin в качестве средства платежа.
Во-первых, в bitcoin (и во всех криптовалютах, построенных на его основе) нет прямого способа, позволяющего передать идентификатор платежа.
Во-вторых — вы практически не контролируете, какую сумму отправит пользователь (с небольшими оговорками).
В общем случае, начиная с момента перехода пользователя к оплате, дальнейший процесс будет выглядеть примерно так.
Вы получаете новый адрес bitcoin и передаете его пользователю, вместе с рассчитанной суммой к оплате. Хорошим тоном считается указывать на протяжении какого времени платежные реквизиты валидны (мы ведь помним, курс криптовалют очень нестабилен), обычно это 15 минут. Далее, вы регулярно проверяете состояние этого адреса, получена ли на него необходимая сумма или нет. В случае, если сумма поступила — платеж можно считать совершившимся, и перейти к обработке дальнейшей заказа (отправка товара, пополнение мобильного счета и так далее)
Учитывая особенности функционирования криптовалют, потенциально нас ожидают некоторые подводные камни.
Если пользователь отправил транзакцию в сеть — это еще не означает что вы её получили. До момента первого подтверждения ваш сервер может даже не узнать о том, что такая транзакция была. А от момента оплаты до момента включения транзакции в блок может пройти и несколько часов. Эта ситуация порождает массу неприятных последствий.
Например, если курс на момент получения транзакции значительно ниже, или, как вариант,- если при оплате указана слишком низкая комиссия, вы можете получить уведомление о транзакции, но сами средства могут зайти спустя несколько суток. А ведь покупатель будет уверен, что он оплатил заказ и будет требовать его выполнения.