pay24 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9274a3468a62dc80013cc7386a800536d77d9339
4
+ data.tar.gz: a8891b5ad107c2f354da099a2fdcfa0f91782ad9
5
+ SHA512:
6
+ metadata.gz: 1441fc399559a096428b839278019a8b2e4ecb9f58b5d9eb6d1f1897cca8beed4f9b2eca91502218d0dda8a8b9867089a72be878390495974aaf91c893d96b1c
7
+ data.tar.gz: 676e733a8c43f2e382c1b2320fee34c94e2de6cee5a5a5978c40218f76d6517a85f906d9fdb892d7b78decf0c44df7d7880b2a5d5e4f3fd2f742a9920fbc61c2
@@ -0,0 +1,20 @@
1
+ Copyright 2019 Bexeiitov Nursultan
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,23 @@
1
+ # Гем для работы с pay24
2
+
3
+ Гем для работы с платежной системой Pay24 для использования в проектах, использующих Ruby (Ruby On Rails, Sinatra и др.).
4
+
5
+ Платежная система «Pay24» создана в 2014 году, с самого начала осуществляет свою деятельность на рынке приема платежей.
6
+ В 2015 году Компания получила две лицензии Национального Банка Кыргызской Республики.
7
+
8
+ Официальный сайт: https://pay24.asia/
9
+
10
+ ## Установка
11
+
12
+ Добавьте эту строку в ваш Gemfile:
13
+
14
+ gem 'pay24'
15
+
16
+ Затем установите gem, используя bundler:
17
+
18
+ $ bundle
19
+
20
+ Или выполните команду:
21
+
22
+ $ gem install pay24
23
+
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require 'bundler/gem_tasks'
@@ -0,0 +1,7 @@
1
+ require 'pay24/version'
2
+
3
+ module Pay24
4
+ autoload :ResponseHandler, 'pay24/response_handler'
5
+ autoload :Result, 'pay24/result'
6
+ autoload :Errors, 'pay24/errors'
7
+ end
@@ -0,0 +1,21 @@
1
+ require 'builder'
2
+
3
+ module Pay24
4
+ module Errors
5
+ attr_reader :code, :message, :result_code
6
+
7
+ # фатальные ошибки начинаются с ERROR_, остальные - с других символов
8
+ SUCCESS = :ok # non-fatal
9
+ TEMPORARY_ERROR = :temporary_error # non-fatal
10
+ ERROR_INVALID_USER_ID_FORMAT = :user_id_does_not_match_format # fatal
11
+ ERROR_USER_NOT_FOUND = :user_not_found # fatal
12
+ ERROR_PAYMENT_DENIED_BY_PROVIDER = :payment_denied_by_provider # fatal
13
+ ERROR_PAYMENT_DENIED_FOR_TECHNICAL_REASON = :payment_denied_tech_reason # fatal
14
+ ERROR_INACTIVE_USER = :inactive_user # fatal
15
+ PAYMENT_PROCESSING_NOT_FINISHED = :payment_processing_not_finished # non-fatal
16
+ ERROR_SUM_IS_TOO_SMALL = :sum_is_too_small # fatal
17
+ ERROR_SUM_IS_TOO_LARGE = :sum_is_too_large # fatal
18
+ ERROR_CANNOT_CHECK_USER_ACCOUNT_STATE = :cannot_check_account_state # fatal
19
+ ERROR_INTERNAL = :internal_error # fatal
20
+ end
21
+ end
@@ -0,0 +1,107 @@
1
+ require 'builder'
2
+
3
+ # Обработчик входящих платежей Pay24.
4
+ #
5
+ # transaction_id целое число длиной до 28 знаков
6
+ # sum Сумма платежа, дробное число с точностью до сотых, в качестве разделителя используется точка
7
+ # transaction_date дата платежа (дата получения запроса от клиента)
8
+ # account ID пользователя, строка, содержащая буквы, цифры и спецсимволы, длиной до 200 символов.
9
+ #
10
+ # Передача информации о платеже провайдеру производится системой в 2 этапа:
11
+ # command=check Проверка возможности совершения платежа. Запись информации о платеже у поставщика
12
+ # command=pay Подтверждение проведения платежа
13
+ #
14
+ module Pay24
15
+ class ResponseHandler
16
+ include Pay24::Errors
17
+
18
+ attr_reader :command, :account, :transaction_id, :transaction_date, :sum
19
+
20
+ EMAIL_REGEX = /\A[^@\s]+@([^@\s]+\.)+[^@\s]+\z/
21
+ IDENTIFICATOR_REGEX = /\A\d+\z/
22
+
23
+ REQUEST_HANDLERS = {
24
+ pay: :osmp_pay,
25
+ check: :check_if_account_is_valid,
26
+ }.freeze
27
+
28
+ def initialize(params: {}, find_user_callback: nil, payment_callback: nil, raise_on_error: false)
29
+ @command = params[:command]
30
+ @account = params[:account]
31
+ @transaction_id = params[:txn_id]
32
+ @transaction_date = params[:txn_date]
33
+ @sum = params[:sum]
34
+ @find_user_callback = find_user_callback
35
+ @payment_callback = payment_callback
36
+ @raise_on_error = raise_on_error
37
+ freeze
38
+ end
39
+
40
+ def command_is_valid?
41
+ @command.to_sym.in?(REQUEST_HANDLERS.keys)
42
+ end
43
+
44
+ def payment_command?
45
+ @command.to_sym == :pay
46
+ end
47
+
48
+ def run_command
49
+ result_code = if command_is_valid?
50
+ send(REQUEST_HANDLERS[@command.to_sym]) || ERROR_INTERNAL
51
+ else
52
+ ERROR_INTERNAL
53
+ end
54
+
55
+ Pay24::Result.new(result_code)
56
+ end
57
+
58
+ def requested_account
59
+ @find_user_callback.(@account) rescue ERROR_CANNOT_CHECK_USER_ACCOUNT_STATE
60
+ end
61
+
62
+ def generate_xml(result, comment = '')
63
+ xml = Builder::XmlMarkup.new indent: 2
64
+ xml.instruct!
65
+ xml.response do |req|
66
+ req.result result.code
67
+ req.comment comment
68
+ if payment_command?
69
+ req.txn_id @transaction_id
70
+ req.sum @sum
71
+ end
72
+ end
73
+ end
74
+
75
+ private
76
+
77
+ def osmp_pay
78
+ return check_if_account_is_valid if check_if_account_is_valid != SUCCESS
79
+
80
+ sum = @sum.to_f.abs
81
+ result_code = nil
82
+
83
+ begin
84
+ raise PaymentIsZero, 'Попытка пополнить баланс на 0 единиц через Pay24' if sum.zero?
85
+
86
+ @payment_callback.(requested_account, sum)
87
+ rescue => e
88
+ raise e if @raise_on_error
89
+ result_code = ERROR_INTERNAL
90
+ else
91
+ result_code = SUCCESS
92
+ end
93
+
94
+ result_code
95
+ end
96
+
97
+ def check_if_account_is_valid
98
+ if @account =~ EMAIL_REGEX || @account =~ IDENTIFICATOR_REGEX
99
+ requested_account.present? ? SUCCESS : ERROR_USER_NOT_FOUND
100
+ else
101
+ ERROR_INVALID_USER_ID_FORMAT
102
+ end
103
+ end
104
+
105
+ class PaymentIsZero < StandardError; end
106
+ end
107
+ end
@@ -0,0 +1,84 @@
1
+ require 'builder'
2
+
3
+ # Модель для вывода результата обработчика.
4
+ #
5
+ # code код результата
6
+ # message_code комментарий
7
+ # result_code названия результата
8
+ #
9
+ module Pay24
10
+ class Result
11
+ include Pay24::Errors
12
+
13
+ attr_reader :code, :message, :result_code
14
+
15
+ # назание неточно, тут не только ошибки. MESSAGES_TO_PAYMENT_GATEWAY
16
+ ERRORS = {
17
+ SUCCESS => {
18
+ message: 'OK',
19
+ code: 0,
20
+ },
21
+ TEMPORARY_ERROR => {
22
+ message: 'Временная ошибка. Повторите запрос позже',
23
+ code: 1,
24
+ },
25
+ ERROR_INVALID_USER_ID_FORMAT => {
26
+ message: 'Неверный формат идентификатора абонента',
27
+ code: 4,
28
+ },
29
+ ERROR_USER_NOT_FOUND => {
30
+ message: 'Идентификатор абонента не найден (Нет такого пользователя)',
31
+ code: 5,
32
+ },
33
+ ERROR_PAYMENT_DENIED_BY_PROVIDER => {
34
+ message: 'Прием платежа запрещен провайдером',
35
+ code: 7,
36
+ },
37
+ ERROR_PAYMENT_DENIED_FOR_TECHNICAL_REASON => {
38
+ message: 'Прием платежа запрещен по техническим причинам',
39
+ code: 8,
40
+ },
41
+ ERROR_INACTIVE_USER => {
42
+ message: 'Счет абонента не активен',
43
+ code: 79,
44
+ },
45
+ PAYMENT_PROCESSING_NOT_FINISHED => {
46
+ message: 'Проведение платежа не окончено (При отмене платежа – отмена еще не подтверждена. Система отправит повторный запрос через некоторое время.)',
47
+ code: 90,
48
+ },
49
+ ERROR_SUM_IS_TOO_SMALL => {
50
+ message: 'Сумма слишком мала',
51
+ code: 241,
52
+ },
53
+ ERROR_SUM_IS_TOO_LARGE => {
54
+ message: 'Сумма слишком велика',
55
+ code: 242,
56
+ },
57
+ ERROR_CANNOT_CHECK_USER_ACCOUNT_STATE => {
58
+ message: 'Невозможно проверить состояние счета',
59
+ code: 243,
60
+ },
61
+ ERROR_INTERNAL => {
62
+ message: 'Другая ошибка провайдера',
63
+ code: 300,
64
+ },
65
+ }.freeze
66
+
67
+ NON_FATAL_ERRORS = %i{ ok temporary_error payment_processing_not_finished }.freeze
68
+
69
+ def initialize(result_code)
70
+ @result_code = result_code
71
+ @message = ERRORS.try(:[], result_code).try(:[], :message)
72
+ @code = ERRORS.try(:[], result_code).try(:[], :code)
73
+ end
74
+
75
+ def failure?
76
+ !success?
77
+ end
78
+
79
+ def success?
80
+ @result_code.to_sym.in? NON_FATAL_ERRORS
81
+ end
82
+
83
+ end
84
+ end
@@ -0,0 +1,3 @@
1
+ module Pay24
2
+ VERSION = '0.0.1'
3
+ end
metadata ADDED
@@ -0,0 +1,79 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pay24
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Bexeiitov Nursultan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-05-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 4.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 4.1.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: builder
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ description: Adds the ability to work with the payment system pay24.
42
+ email:
43
+ - bekseitov@mail.ru
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - MIT-LICENSE
49
+ - README.md
50
+ - Rakefile
51
+ - lib/pay24.rb
52
+ - lib/pay24/errors.rb
53
+ - lib/pay24/response_handler.rb
54
+ - lib/pay24/result.rb
55
+ - lib/pay24/version.rb
56
+ homepage: http://neoweb.kz
57
+ licenses: []
58
+ metadata: {}
59
+ post_install_message:
60
+ rdoc_options: []
61
+ require_paths:
62
+ - lib
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '2.3'
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ requirements: []
74
+ rubyforge_project:
75
+ rubygems_version: 2.6.12
76
+ signing_key:
77
+ specification_version: 4
78
+ summary: pay24 gem
79
+ test_files: []