{"id":18489718,"url":"https://github.com/ssnickolay/unitpay","last_synced_at":"2025-08-02T00:09:01.255Z","repository":{"id":59158665,"uuid":"46433142","full_name":"ssnickolay/unitpay","owner":"ssnickolay","description":"Gem для подключения к платежной системе unitpay.ru","archived":false,"fork":false,"pushed_at":"2016-05-25T14:15:09.000Z","size":160,"stargazers_count":5,"open_issues_count":3,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-21T09:48:08.629Z","etag":null,"topics":["payment","ruby"],"latest_commit_sha":null,"homepage":null,"language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ssnickolay.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-11-18T16:51:26.000Z","updated_at":"2021-03-20T18:37:18.000Z","dependencies_parsed_at":"2022-09-13T20:04:25.464Z","dependency_job_id":null,"html_url":"https://github.com/ssnickolay/unitpay","commit_stats":null,"previous_names":["ssnikolay/unitpay"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssnickolay%2Funitpay","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssnickolay%2Funitpay/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssnickolay%2Funitpay/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ssnickolay%2Funitpay/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ssnickolay","download_url":"https://codeload.github.com/ssnickolay/unitpay/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247931076,"owners_count":21020161,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["payment","ruby"],"created_at":"2024-11-06T12:57:40.298Z","updated_at":"2025-04-08T21:30:49.035Z","avatar_url":"https://github.com/ssnickolay.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Gem Version](https://badge.fury.io/rb/unitpay.svg)](https://badge.fury.io/rb/unitpay)\n[![Build Status](https://travis-ci.org/ssnikolay/unitpay.svg?branch=master)](https://travis-ci.org/ssnikolay/unitpay)\n[![Code Climate](https://codeclimate.com/github/ssnikolay/unitpay.svg)](https://codeclimate.com/github/ssnikolay/unitpay)\n[![Test Coverage](https://codeclimate.com/github/ssnikolay/unitpay/badges/coverage.svg)](https://codeclimate.com/github/ssnikolay/unitpay/coverage)\n\n# Unitpay\n\nGem для подключения к платежному шлюзу [unitpay](http://unitpay.ru).\n\n[Документация к шлюзу](http://help.unitpay.ru/)\n\n- [Установка](#installation)\n- [Подключение](#setup)\n- [Получение ссылки для оплаты](#payment_url)\n- [Использование в  Rails](#rails)\n- [Подключение виджета для карт оплаты](#widget)\n\n##\u003ca name=\"installation\"\u003e\u003c/a\u003e Установка\n\nДобавьте эти строки в Gemfile вашего приложения:\n\n```ruby\ngem 'unitpay'\n```\n\nИ выполните:\n\n    $ bundle\n\nИли установите напрямую:\n\n    $ gem install unitpay\n\n##\u003ca name=\"setup\"\u003e\u003c/a\u003e Подключение\nЧтобы получить доступ к сервисному классу, достаточно проинициализировать его с `public` и `secret` ключами.\n\n```ruby\nUnitpay::Service.new('unitpay_public_key', 'unitpay_secret_key')\n```\n\nПо умолчанию курс валюты выставлен в `RUB`, а использование сигнатуры в `true`.\nПереопределить их можно и при инициализации.\n```ruby\nuse_sign, currency = false, 'RUB'\nUnitpay::Service.new('unitpay_public_key', 'unitpay_secret_key', use_sign, currency)\n```\nЧтобы включить проверку сигнатуры со стороны `unitpay`, необходимо нажать на \"замочек\" в настройках вашего партнера.\n\n![Settings](https://raw.github.com/ssnikolay/unitpay/master/unitpay.jpg)\n\n1. Включение проверки сигнатуры.\n2. `Secret key` для инициализации `Unitpay::Service`.\n3. Необходимо изменить `example.com` на адрес вашего приложения.\n4. Необходимо изменить `example.com` на адрес вашего приложения.\n\n##\u003ca name=\"payment_url\"\u003e\u003c/a\u003e Получение ссылки для оплаты\n\nЧтобы получить ссылку для оплаты, необходимо использовать метод `payment_url`, в который нужно передать следующие параметры:\n\n Название           | Описание\n--------------------|:-----------------------------------------\n`sum`               | Цена, которую необходимо оплатить пользователю\n`account`           | Внутренний идентификатор платежа (или заказа), однозначно определяющий его в магазине.\n`desc`              | Описание платежа, отображающееся пользователю на стороне шлюза.\n\n```ruby\nsum, account, desc = 100, 1, 'description'\nservice = Unitpay::Service.new('unitpay_public_key', 'unitpay_secret_key')\nservice.payment_url(sum, account, desc)\n# =\u003e 'https://unitpay.ru/pay/public_key?sum=100\u0026account=1\u0026desc=description...'\n```\n\n##\u003ca name=\"rails\"\u003e\u003c/a\u003e Использование в  Rails\n\nДобавьте роуты для получения запросов от **unitpay** (`config/routes.rb`)\n\n```ruby\nscope :unitpay do\n  get :success, to: 'unitpay#success'\n  get :fail, to: 'unitpay#fail'\n  get :notify, to: 'unitpay#notify'\nend\n```\n\nСоздайте `app/controllers/unitpay_controller.rb` со следующим кодом:\n\n```ruby\nclass UnitpayController \u003c ApplicationController\n  include Unitpay::Controller\n  skip_before_filter :verify_authenticity_token\n \n  def success\n    # вызывается при отправке шлюзом пользователя на Success URL.\n    #\n    # ВНИМАНИЕ: является незащищенным действием!\n    # Для выполнения действий после успешной оплаты используйте pay\n  end\n  \n  def fail\n    # вызывается при отправке шлюзом пользователя на Fail URL.\n    # (во время принятия платежа возникла ошибка)\n  end\n\n  private\n\n  def pay\n    # вызывается при оповещении магазина об\n    # успешной оплате пользователем заказа и после проверки сигнатуры.\n    #\n    # ВНИМАНИЕ: правильный ответ будет сгенерирован автоматически (не нужно использовать render\\redirect_to)!\n    # order = Order.find(params[:params][:account])\n    # order.payed!\n  end\n  \n  def error\n    # вызывается при оповещении магазина об ошибке при оплате заказа.\n    # При отсутствии логики обработки ошибок на стороне приложения оставить метод пустым.\n    #\n    # ВНИМАНИЕ: правильный ответ будет сгенерирован автоматически (не нужно использовать render\\redirect_to)!\n    # puts params[errorMessage]\n    # =\u003e Текст ошибки, присланный unitpay\n  end\n\n  def service\n    # ВНИМАНИЕ: обязательный метод! Используется при проверке сигнатуры.\n    Unitpay::Service.new('unitpay_public_key', 'unitpay_secret_key')\n  end\nend\n```\n\n[Описание параметров, передаваемых при запросе.\n](http://help.unitpay.ru/article/35-confirmation-payment)\n\n### Исключения при обработке запросов\n\nВажно понимать, что до вызова метода `pay` происходит проверка только сигнатуры.\nПрочие проверки на соответствие платежа правилам логики приложения остаются на вашей совести (например, эквивалентность суммы оплаты и суммы заказа).\nДля удобства обработки таких ситуаций существует зарезервированное исключение `Unitpay::Controller::RuntimeException`. В этом случае в ответе будет передан текст вашей ошибки.\n\nПример:\n\n```ruby\ndef pay\n  order = Order.find(params[:params][:account])\n  if order.total_cost == params[:params][:sum]\n    order.payed!\n  else\n    raise Unitpay::Controller::RuntimeException.new('Неверная сумма оплаты')\n  end\nend\n```\n\n##\u003ca name=\"widget\"\u003e\u003c/a\u003e Подключение виджета для карт оплаты\n\nРассмотрим один из способов реализации случая, когда необходимо показать виджет оплаты после заполнения пользователем формы заказа.\n\n- Подключите на странице внешний скрипт:\n\n```html\n\u003cscript src=\"https://widget.unitpay.ru/unitpay.js\"\u003e\u003c/script\u003e\n```\n\n- Добавьте обработчик формы заказа:\n\n**unitpay.js.coffe**\n```coffee\nclass Unitpay\n  bindEvents: -\u003e\n    @handleAfterSubmitForm()\n\n  handleAfterSubmitForm: -\u003e\n    $('#id-your-form').submit (e) -\u003e\n      e.preventDefault()\n      tryUnitpay() # при сабмите формы пытаемся получить параметры для виджета\n\n  tryUnitpay = -\u003e\n    $.ajax({\n      type: 'POST',\n      dataType: 'json'\n      url: '/orders' # любой другой путь сохранения\\создания вашего платежа (заказа). Не забудьте добавить его в routes.rb\n      data: $('#id-your-form').serialize(),\n      success: (data) -\u003e\n        payment = new UnitPay()\n        payment.createWidget(data)\n        payment.success -\u003e\n          console.log('Unitpay: успешный платеж')\n        payment.error -\u003e\n          # ошибка платежного шлюза (например, пользователь не завершил оплату)\n          console.log('Unitpay: ошибка платежа')\n      error: -\u003e\n        # ошибка при сохранении заказа (например, ошибки валидации)\n        console.log('Ошибка сохранения\\создания платежа (заказа)')\n    })\n$ -\u003e\n  unitpay = new Unitpay\n  unitpay.bindEvents()\n\n```\n\n- Измените контроллер так, чтобы он отдавал необходимый `json` ответ:\n\n**orders_controller.rb**\n```ruby\nclass OrdersController \u003c ApplicationController\n  def create\n    order = Order.new(permitted_params)\n    if order.save\n      render json: unitpay_service.params_for_widget(order.total_cost, order.id, order.description)\n    else\n      render json: order.errors, status: :unprocessable_entity\n    end\n  end\n  \n  private\n  \n  def unitpay_service\n    # Внимание: не храните ключи в открытом виде в репозитории.\n    # используйте  конфигурационные файлы (https://github.com/binarylogic/settingslogic) \n    Unitpay::Service.new('public_key', 'secret_key')\n  end\n  \n  def permitted_params\n    # используйте strong params\n  end\nend\n```\n\n## Contributing\n\n1. Fork it ( https://github.com/ssnikolay/unitpay/fork )\n2. Create your feature branch (`git checkout -b my-new-feature`)\n3. Commit your changes (`git commit -am 'Add some feature'`)\n4. Push to the branch (`git push origin my-new-feature`)\n5. Create a new Pull Request\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fssnickolay%2Funitpay","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fssnickolay%2Funitpay","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fssnickolay%2Funitpay/lists"}