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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +23 -0
- data/Rakefile +2 -0
- data/lib/pay24.rb +7 -0
- data/lib/pay24/errors.rb +21 -0
- data/lib/pay24/response_handler.rb +107 -0
- data/lib/pay24/result.rb +84 -0
- data/lib/pay24/version.rb +3 -0
- metadata +79 -0
checksums.yaml
ADDED
@@ -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
|
data/MIT-LICENSE
ADDED
@@ -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.
|
data/README.md
ADDED
@@ -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
|
+
|
data/Rakefile
ADDED
data/lib/pay24.rb
ADDED
data/lib/pay24/errors.rb
ADDED
@@ -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
|
data/lib/pay24/result.rb
ADDED
@@ -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
|
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: []
|