Проведение платежей через LiqPAY посредством Ruby
January 27, 2012 , revised April 17, 2012 in Ruby on Rails(The English version of this tutorial is at liqpay’s GitHub page).
Я подготовил рабочую версию гема для работы с LiqPAY. LiqPAY – это такая биллинговая система от ПриватБанка. Её конкурентное преимущество – простота подключения; для приема платежей не нужно практически ничего, кроме счета в ПриватБанке.
Установка
Подключи гем liqpay к своему приложению.
Настройка
Гем настраивается в Liqpay.default_options
(это хеш).
Там обязательно нужно указать merchant_id
и merchant_signature
, которые сообщаются при регистрации в LiqPAY в качестве приемщика платежей.
Прием платежей
Общая логика
-
Пользователь выбирает способ оплаты; ты пересылаешь его на LiqPAY POST-запросом, сообщая все необходимые параметры платежа.
-
Пользователь проводит платеж через LiqPAY.
-
LiqPAY пересылает пользователя назад, в приложение.
-
Ты проверяешь корректность платежа секретной подписью.
-
Если платеж успешен: ты обрабатываешь платеж внутри приложения.
-
Если платеж безуспешен: ты отклоняешь операцию.
Процесс оплаты довольно простой, может работать “в один поток”, без фонового обмена информацией с сервером.
Реализация Rails
-
Настрой Liqpay:
# Gemfile gem 'liqpay' # config/initializers/liqpay.rb Liqpay.default_options[:merchant_id] = 'MY_MERCHANT_ID' Liqpay.default_options[:merchant_signature] = 'MY_MERCHANT_SIGNATURE'
-
Создай объект
Liqpay::Request
.Обязательные атрибуты – сумма и валюта платежа, а также “идентификатор заказа”.
Идентификатор заказа – произвольная строка, которая нужна будет тебе для опознания платежа после его окончания. Если у тебя есть модель
Order
(советую её завести), тут может быть ее ID. Если нет, это может быть даже случайно сгенерированный ключ, хранимый в сессии. Главное, чтоб он был уникальным.@liqpay_request = Liqpay::Request.new( :amount => '999.99', :currency => 'UAH', :order_id => '123', :description => 'Some Product', :result_url => liqpay_payment_url )
Эта операция не делает никаких изменений. Ничего не пишет в базу, ничего не пересылает в LiqPAY.
-
Размести где-то кнопку оплаты
Поскольку пользователя нужно пересылать POST-запросом, тебе обязательно понадобится форма.
Чтоб показать форму, состоящую из единственной кнопки “Pay with LiqPAY”, напиши
<%=liqpay_button @liqpay_request %>
Или:
<%=liqpay_button @liqpay_request, :title => "Оплатить" %>
Или:
<%=liqpay_button @liqpay_request do %> <%=link_to 'Оплатить!', '#', :onclick => 'document.forms[0].submit();' %> <% end %>
-
Настрой адрес приемки.
# config/routes.rb post '/liqpay_payment' => 'payments#liqpay_payment' # app/controllers/payments_controller.rb class PaymentsController < ApplicationController # Это важно protect_from_forgery :except => :liqpay_payment def liqpay_payment @liqpay_response = Liqpay::Response.new(params) if @liqpay_response.success? && @liqpay_response.order_id == ACTUAL_ORDER_ID && @liqpay_reponse.amount == EXPECTED_AMOUNT # обработать платеж else # обработать ошибку end rescue Liqpay::InvalidResponse # обработать ошибку end end
Вот и все.
Безопасность
- Проверяй, что сумма платежа в ответе равна ожидаемой;
- проверяй правильность идентификатора заказа;
- проверяй, что заказ еще не оплачен (чтоб избежать повторного использования ответа от LiqPAY);
Документация по исходникам liqpay
Понравился пост? Купи мне кофе