[![Gem Version](https://badge.fury.io/rb/payanyway.svg)](http://badge.fury.io/rb/payanyway)
[![Build Status](https://travis-ci.org/ssnikolay/payanyway.svg?branch=master)](https://travis-ci.org/ssnikolay/payanyway)
[![Code Climate](https://codeclimate.com/github/ssnikolay/payanyway.svg)](https://codeclimate.com/github/ssnikolay/payanyway)
[![Test Coverage](https://codeclimate.com/github/ssnikolay/payanyway/badges/coverage.svg)](https://codeclimate.com/github/ssnikolay/payanyway)
# Payanyway
Этот gem предназначен для быстрой интеграции платежного шлюза [payanyway](http://payanyway.ru) в ваше ruby приложение.
При возникновении вопросов следует ознакомиться с [документацией к шлюзу](http://moneta.ru/doc/MONETA.Assistant.ru.pdf).
- [Установка](#installation)
- [Подключение](#setup)
- [Использование](#usage)
- [Запрос на оплату](#payment_url)
- [Специальные URL'ы](#special_urls)
- [Check URL](#check_url)
- [Return URL и InProgress URL](#return_url)
- [Расшифровка параметров](#params)
- [Параметры, отвечающие за выбор платежной системы](#payment_ids)
## Установка
Добавьте эти строки в Gemfile вашего приложения:
```ruby
gem 'payanyway'
```
И выполните:
$ bundle
Или установите напрямую:
$ gem install payanyway
## Подключение
Добавьте engine в `config/routes.rb`
```ruby
Rails.application.routes.draw do
mount Payanyway::Engine => '/payanyway'
end
```
Создайте `app/controllers/payanyway_controller.rb` со следующим кодом:
```ruby
class PayanywayController
def success_implementation(order_id)
# вызывается при отправке шлюзом пользователя на Success URL.
#
# ВНИМАНИЕ: является незащищенным действием!
# Для выполнения действий после успешной оплаты используйте pay_implementation
end
def pay_implementation(params)
# вызывается при оповещении магазина об
# успешной оплате пользователем заказа. (Pay URL)
#
# params[ KEY ], где KEY ∈ [ :moneta_id, :order_id, :operation_id,
# :amount, :currency, :subscriber_id, :test_mode, :user, :corraccount,
# :custom1, :custom2, :custom3 ]
end
def fail_implementation(order_id)
# вызывается при отправке шлюзом пользователя на Fail URL.
end
end
```
Создайте конфигурационный файл: `config/payanyway.yml`
```yml
development: &config
moneta_id: YOUR_MONETA_ID
currency: RUB
payment_url: https://demo.moneta.ru/assistant.htm
test_mode: 1
token: secret_token
production: <<: *config
payment_url: https://moneta.ru/assistant.htm
test_mode: 0
```
В настройках счета **moneta.ru** выберите `HTTP метод: GET`
![Settings](https://raw.github.com/ssnikolay/payanyway/master/settings.png)
## Использование
### Запрос на оплату
Чтобы получить ссылку на платежный шлюз для оплаты заказа пользователем,
используйте `Payanyway::Gateway.payment_url(params, use_signature = true)`, где `params[ KEY ]` такой, что `KEY` ∈
`[:order_id, :amount, :test_mode, :description, :subscriber_id, :custom1, :custom2, :custom3, :locale, :payment_system_unit_id, :payment_system_limit_ids]`
Если в настройках счета в системе **moneta.ru** выставлен флаг «Можно переопределять настройки в URL», то можно так же передавать
`[:success_url, :in_progress_url, :fail_url, :return_url]`.
Пример минимальной ссылки:
```ruby
class Order < ActiveRecord::Base; end
class OrdersController < ApplicationController
def create
order = Order.create(params[:order])
redirect_to Payanyway::Gateway.payment_url(
order_id: order.id,
amount: order.total_amount,
description: "Оплата заказа № #{ order.number } на сумму #{ order.total_amount }руб."
)
end
end
```
### Специальные URL'ы
Gem **payanyway** добавляет специальные роуты для обработки запросов от шлюза.
#### Check URL
```ruby
class PayanywayController
...
def check_implementation(params)
# Вызывается при обработке проверочных запросов (Check URL)
# params[ KEY ], где KEY ∈ [ :moneta_id, :order_id, :operation_id,
# :amount, :currency, :subscriber_id, :test_mode, :user, :corraccount,
# :custom1, :custom2, :custom3, :payment_system_unit_id ]
# ВНИМАНИЕ: при отправке корректного ответа со стороны магазина,
# необходимо вернуть в методе параметры для генерации статус-кода.
# { amount: AMOUNT, state: STATE, description: DESCRIPTION,
# attributes: ATTRIBUTES, logger: true\false }
end
end
```
Пример метода:
```ruby
...
def check_implementation(params)
order = Order.find(params[:order_id])
{
amount: order.total_amount,
state: order.state_for_payanyway, # нужно реализовать
attributes: { name: 'John Smith', email: 'js@gmail.com' }
}
end
...
```
**Возвращаемые параметры:**
Название | Описание
---------------------------|:-----------------------------------------------------------
`:amount` | Сумма заказа
`:state` | Состояние оплаты заказа. (см. [таблицу состояний](#states))
`:description` | Описание состояния заказа. Задается в произвольной форме.
`:attributes` | Необязательный элемент. Содержит хеш произвольных параметров, которые будут сохранены в операции.
`:logger` | Вывести XML ответ в log (`Rails.logger`)
**Возможные состояния оплаты заказа:**
Состояние | Описание
-------------------------|:-----------------------------------------------------------
`:paid` | Заказ оплачен. Уведомление об оплате магазину доставлено.
`:in_progress` | Заказ находится в обработке. Точный статус оплаты заказа определить невозможно. (например, если пользователя отправило на InProgress URL, но уведомления на Pay URL от шлюза еще не поступало)
`:unpaid` | Заказ создан и готов к оплате. Уведомление об оплате магазину не доставлено.
`:canceled` | Заказ не является актуальным в магазине (например, заказ отменен).
#### Return URL и InProgress URL
```ruby
class PayanywayController
...
def return_implementation(order_id)
# Вызывается при добровольном отказе пользователем от оплаты (Return URL)
end
def in_progress_implementation(order_id)
# Вызывается после успешного запроса на авторизацию средств,
# до подтверждения списания и зачисления средств (InProgress URL)
#
# ВНИМАНИЕ: InProgress URL может быть использован в любом способе оплаты.
# Если к моменту, когда пользователя надо вернуть в магазин оплата,
# по какой-либо причине не завершена, то его перекинет на InProgress,
# если он указан, если не указан, то на Success URL.
# Если операция уже успешно выполнилась, то сразу на Success.
# В случае с картами чаще всего получается так, что операция не успевает выполниться,
# поэтому InProgress будет использован с бОльшей вероятностью, чем Success URL.
end
...
end
```
### Расшифровка параметров, используемых в gem'e
params[ KEY ], где KEY | В документации | Описание
---------------------------|:-------------------------|:-----------------------------------------
`:moneta_id` | `MNT_ID` | Идентификатор магазина в системе MONETA.RU.
`:order_id` | `MNT_TRANSACTION_ID` | Внутренний идентификатор заказа, однозначно определяющий заказ в магазине.
`:operation_id` | `MNT_OPERATION_ID` | Номер операции в системе MONETA.RU.
`:amount` | `MNT_AMOUNT` | Фактическая сумма, полученная на оплату заказа.
`:currency` | `MNT_CURRENCY_CODE` | ISO код валюты, в которой произведена оплата заказа в магазине.
`:test_mode` | `MNT_TEST_MODE` | Флаг оплаты в тестовом режиме (1 - да, 0 - нет).
`:description` | `MNT_DESCRIPTION` | Описание оплаты.
`:subscriber_id` | `MNT_SUBSCRIBER_ID` | Внутренний идентификатор пользователя в системе магазина.
`:corraccount` | `MNT_CORRACCOUNT` | Номер счета плательщика.
`:custom[1|2|3]` | `MNT_CUSTOM1` | Поля произвольных параметров. Будут возвращены магазину в параметрах отчета о проведенной оплате.
`:user` | `MNT_USER` | Номер счета пользователя, если оплата производилась с пользовательского счета в системе «MONETA.RU».
`:locale` | `moneta.locale` | (ru\|en) Язык пользовательского интерфейса.
`:success_url` | `MNT_SUCCESS_URL` | URL страницы магазина, куда должен попасть покупатель после успешно выполненных действий.
`:in_progress_url` | `MNT_INPROGRESS_URL` | URL страницы магазина, куда должен попасть покупатель после успешного запроса на авторизацию средств, до подтверждения списания и зачисления средств.
`:fail_url` | `MNT_FAIL_URL` | URL страницы магазина, куда должен попасть покупатель после отмененной или неуспешной оплаты.
`:return_url` | `MNT_RETURN_URL` | URL страницы магазина, куда должен вернуться покупатель при добровольном отказе от оплаты.
`:attributes` | `MNT_ATTRIBUTES` | Содержит произвольные параметры, которые будут сохранены в операции.
#### Параметры, отвечающие за выбор платежной системы:
params[ KEY ], где KEY | В документации | Описание
---------------------------|:-------------------------|:-----------------------------------------
`:payment_system_unit_id` | `paymentSystem.unitId` | Конкретная [платежная система](https://www.moneta.ru/viewPaymentMethods.htm)
`:payment_system_limit_ids`| `paymentSystem.limitIds` | Список (разделенный запятыми) идентификаторов платежных систем.
## Contributing
1. Fork it ( https://github.com/ssnikolay/payanyway/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