Code Monkey home page Code Monkey logo

rails-unitpay's Introduction

Gem Version Build Status Code Climate Test Coverage

Unitpay

Gem для подключения к платежному шлюзу unitpay.money и unitpay.ru.

Документация к шлюзу help.unitpay.money и help.unitpay.ru

## Установка

Добавьте эти строки в Gemfile вашего приложения:

gem 'unitpay'

И выполните:

$ bundle

Или установите напрямую:

$ gem install unitpay

## Подключение Чтобы получить доступ к сервисному классу, достаточно проинициализировать его с вашим рабочим доменом (unitpay.money или unitpay.ru) и public и secret ключами.

Unitpay::Service.new('domain', 'unitpay_public_key', 'unitpay_secret_key')

По умолчанию курс валюты выставлен в RUB, а использование сигнатуры в true. Переопределить их можно и при инициализации.

use_sign, currency = false, 'RUB'
Unitpay::Service.new('domain', 'unitpay_public_key', 'unitpay_secret_key', use_sign, currency)

Чтобы включить проверку сигнатуры со стороны unitpay, необходимо нажать на "замочек" в настройках вашего партнера.

Settings

  1. Включение проверки сигнатуры.
  2. Secret key для инициализации Unitpay::Service.
  3. Необходимо изменить example.com на адрес вашего приложения.
  4. Необходимо изменить example.com на адрес вашего приложения.

## Получение ссылки для оплаты

Чтобы получить ссылку для оплаты, необходимо использовать метод payment_url, в который нужно передать следующие параметры:

Название Описание
sum Цена, которую необходимо оплатить пользователю
account Внутренний идентификатор платежа (или заказа), однозначно определяющий его в магазине.
desc Описание платежа, отображающееся пользователю на стороне шлюза.
sum, account, desc = 100, 1, 'description'
service = Unitpay::Service.new('domain', 'unitpay_public_key', 'unitpay_secret_key')
service.payment_url(sum, account, desc)
# => domain - 'unitpay.money' or 'unitpay.ru'
# => 'https://domain/pay/public_key?sum=100&account=1&desc=description...'

## Использование в Rails

Добавьте роуты для получения запросов от unitpay (config/routes.rb)

scope :unitpay do
  get :success, to: 'unitpay#success'
  get :fail, to: 'unitpay#fail'
  get :notify, to: 'unitpay#notify'
end

Создайте app/controllers/unitpay_controller.rb со следующим кодом:

class UnitpayController < ApplicationController
  include Unitpay::Controller
  skip_before_filter :verify_authenticity_token
 
  def success
    # вызывается при отправке шлюзом пользователя на Success URL.
    #
    # ВНИМАНИЕ: является незащищенным действием!
    # Для выполнения действий после успешной оплаты используйте pay
  end
  
  def fail
    # вызывается при отправке шлюзом пользователя на Fail URL.
    # (во время принятия платежа возникла ошибка)
  end

  private

  def pay
    # вызывается при оповещении магазина об
    # успешной оплате пользователем заказа и после проверки сигнатуры.
    #
    # ВНИМАНИЕ: правильный ответ будет сгенерирован автоматически (не нужно использовать render\redirect_to)!
    # order = Order.find(params[:params][:account])
    # order.payed!
  end
  
  def error
    # вызывается при оповещении магазина об ошибке при оплате заказа.
    # При отсутствии логики обработки ошибок на стороне приложения оставить метод пустым.
    #
    # ВНИМАНИЕ: правильный ответ будет сгенерирован автоматически (не нужно использовать render\redirect_to)!
    # puts params[errorMessage]
    # => Текст ошибки, присланный unitpay
  end

  def service
    # ВНИМАНИЕ: обязательный метод! Используется при проверке сигнатуры.
    Unitpay::Service.new('domain', 'unitpay_public_key', 'unitpay_secret_key')
  end
end

Описание параметров, передаваемых при запросе: help.unitpay.money и help.unitpay.ru

Исключения при обработке запросов

Важно понимать, что до вызова метода pay происходит проверка только сигнатуры. Прочие проверки на соответствие платежа правилам логики приложения остаются на вашей совести (например, эквивалентность суммы оплаты и суммы заказа). Для удобства обработки таких ситуаций существует зарезервированное исключение Unitpay::Controller::RuntimeException. В этом случае в ответе будет передан текст вашей ошибки.

Пример:

def pay
  order = Order.find(params[:params][:account])
  if order.total_cost == params[:params][:sum]
    order.payed!
  else
    raise Unitpay::Controller::RuntimeException.new('Неверная сумма оплаты')
  end
end

## Подключение виджета для карт оплаты

Рассмотрим один из способов реализации случая, когда необходимо показать виджет оплаты после заполнения пользователем формы заказа.

  • Подключите на странице внешний скрипт:
<script src="https://widget.unitpay.ru/unitpay.js"></script>
  • Добавьте обработчик формы заказа:

unitpay.js.coffe

class Unitpay
  bindEvents: ->
    @handleAfterSubmitForm()

  handleAfterSubmitForm: ->
    $('#id-your-form').submit (e) ->
      e.preventDefault()
      tryUnitpay() # при сабмите формы пытаемся получить параметры для виджета

  tryUnitpay = ->
    $.ajax({
      type: 'POST',
      dataType: 'json'
      url: '/orders' # любой другой путь сохранения\создания вашего платежа (заказа). Не забудьте добавить его в routes.rb
      data: $('#id-your-form').serialize(),
      success: (data) ->
        payment = new UnitPay()
        payment.createWidget(data)
        payment.success ->
          console.log('Unitpay: успешный платеж')
        payment.error ->
          # ошибка платежного шлюза (например, пользователь не завершил оплату)
          console.log('Unitpay: ошибка платежа')
      error: ->
        # ошибка при сохранении заказа (например, ошибки валидации)
        console.log('Ошибка сохраненияоздания платежа (заказа)')
    })
$ ->
  unitpay = new Unitpay
  unitpay.bindEvents()
  • Измените контроллер так, чтобы он отдавал необходимый json ответ:

orders_controller.rb

class OrdersController < ApplicationController
  def create
    order = Order.new(permitted_params)
    if order.save
      render json: unitpay_service.params_for_widget(order.total_cost, order.id, order.description)
    else
      render json: order.errors, status: :unprocessable_entity
    end
  end
  
  private
  
  def unitpay_service
    # Внимание: не храните ключи в открытом виде в репозитории.
    # используйте  конфигурационные файлы (https://github.com/binarylogic/settingslogic) 
    Unitpay::Service.new('domain', 'public_key', 'secret_key')
  end
  
  def permitted_params
    # используйте strong params
  end
end

Contributing

  1. Fork it ( https://github.com/ssnikolay/unitpay/fork )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

rails-unitpay's People

Contributors

byteg avatar distroid avatar ssnickolay avatar unitpayservice avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.