🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!

Проведение платежей через 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 в качестве приемщика платежей.

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

Общая логика

  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 Понравился пост? Купи мне кофе