Проведение платежей через LiqPAY посредством Ruby

January 27, 2012, revised April 17, 2012 gem LiqPay Ruby Ruby on Rails Ruby on Rails 3 биллинг ПриватБанк

(The English version of this tutorial is at liqpay’s GitHub page).

Я подготовил рабочую версию гема для работы с LiqPAY. LiqPAY – это такая биллинговая система от ПриватБанка. Её конкурентное преимущество – простота подключения; для приема платежей не нужно практически ничего, кроме счета в ПриватБанке.

Установка

Подключи гем liqpay к своему приложению.

Настройка

Гем настраивается в Liqpay.default_options (это хеш).

Там обязательно нужно указать merchant_id и merchant_signature, которые сообщаются при регистрации в LiqPAY в качестве приемщика платежей.

Прием платежей

Общая логика

  1. Пользователь выбирает способ оплаты; ты пересылаешь его на LiqPAY POST-запросом, сообщая все необходимые параметры платежа.

  2. Пользователь проводит платеж через LiqPAY.

  3. LiqPAY пересылает пользователя назад, в приложение.

  4. Ты проверяешь корректность платежа секретной подписью.

  5. Если платеж успешен: ты обрабатываешь платеж внутри приложения.

  6. Если платеж безуспешен: ты отклоняешь операцию.

Процесс оплаты довольно простой, может работать “в один поток”, без фонового обмена информацией с сервером.

Реализация Rails

  1. Настрой Liqpay:

    # Gemfile
    gem 'liqpay'
            
    # config/initializers/liqpay.rb
    Liqpay.default_options[:merchant_id] = 'MY_MERCHANT_ID'
    Liqpay.default_options[:merchant_signature] = 'MY_MERCHANT_SIGNATURE'
  2. Создай объект 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.

  3. Размести где-то кнопку оплаты

    Поскольку пользователя нужно пересылать 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 %>
  4. Настрой адрес приемки.

    # 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

Buy Me a Coffee at ko-fi.com