sbrf_merchant 3.0.1 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +28 -12
- data/lib/sbrf_merchant/api/client.rb +12 -7
- data/lib/sbrf_merchant/api/request/body_preprocessor.rb +0 -1
- data/lib/sbrf_merchant/api/response/append_success_flag_to_hash.rb +2 -2
- data/lib/sbrf_merchant/api/response/body_decorator.rb +7 -19
- data/lib/sbrf_merchant/api/response/body_postprocessor.rb +7 -8
- data/lib/sbrf_merchant/utils/hash/to_snake_case_keys.rb +15 -0
- data/lib/sbrf_merchant/utils/json/to_hash_parser.rb +2 -2
- data/lib/sbrf_merchant/version.rb +1 -1
- metadata +5 -5
- data/lib/sbrf_merchant/utils/high_order_functions/compose.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0e29ff9dfedf968e73a6318f1cc014e9a106838f0695a86a99ec8aa2519c8e8a
|
4
|
+
data.tar.gz: bbef1d87432e6f353ee5cab58934db1f42c3b49a73557ae09a49b01f11738d54
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 15e0ab7663e5695859e6af9ee159cb5e3dcfb70fbae6fd123e07a1a6916ad4cca05073e6e1a6aaa6629de1ed3bfdd200d161f0a0deef146966f3467cefdcc255
|
7
|
+
data.tar.gz: aa8e6a4b467ba45e06f09dd0fbcb0954aa8694fdb8f553b0d004482b14bfed9038b7a2faa0dcf7bfbfc019807f2629a7275d7261ffec373194730d567e0ff0b2
|
data/README.md
CHANGED
@@ -11,28 +11,36 @@ Ruby клиент для работы с платёжным шлюзом Сбе
|
|
11
11
|
Ключевые особенности:
|
12
12
|
- Простой (~200 LOC).
|
13
13
|
- Расширяемый из коробки. Если В API появится новый метод то данный клиент будет его поддерживать без каких либо правок в исходный код
|
14
|
-
- Написан в ОО
|
14
|
+
- Написан в ОО стиле без "магии". Легко встроится в ваши сервисные объекты и юнит тесты
|
15
|
+
|
16
|
+
# Содержание
|
17
|
+
- [Установка](#установка)
|
18
|
+
- [Документация](#документация)
|
19
|
+
- [Примеры использования](#примеры-использования)
|
20
|
+
- [Регистрации заказа](#регистрация-заказа)
|
21
|
+
- [Замена HTTP клиента](#замена-http-клиента)
|
22
|
+
- [Замена JSON парсера](#замена-json-парсера)
|
15
23
|
|
16
24
|
## Установка
|
17
25
|
|
18
|
-
### RubyGems.org
|
26
|
+
### RubyGems.org
|
19
27
|
|
20
28
|
```sh
|
21
29
|
% gem install sbrf_merchant
|
22
30
|
```
|
23
31
|
|
24
|
-
### Bundler
|
32
|
+
### Bundler
|
25
33
|
|
26
34
|
```ruby
|
27
35
|
# Gemfile
|
28
36
|
gem 'sbrf_merchant'
|
29
37
|
```
|
30
38
|
## Документация
|
31
|
-
- [
|
39
|
+
- [WEB(RU)](https://securepayments.sberbank.ru/wiki/doku.php/integration:api:start)
|
32
40
|
- [PDF(RU)](http://cs.petrsu.ru/~vadim/sd2018/Merchant-Manual-SBRF.pdf)
|
33
41
|
|
34
|
-
##
|
35
|
-
###
|
42
|
+
## Примеры использования
|
43
|
+
### Регистрация заказа
|
36
44
|
```ruby
|
37
45
|
# Cоздаем клиент
|
38
46
|
client = SBRF::Api::Client.new(
|
@@ -51,14 +59,14 @@ params = {
|
|
51
59
|
order_number: "something_unique_string",
|
52
60
|
return_url: 'localhost:3000'
|
53
61
|
}
|
54
|
-
response = client.call(:register, params)
|
62
|
+
response = client.call(:register, **params)
|
55
63
|
|
56
64
|
response.success? # => true
|
57
65
|
# В ответе доступ к атрибутам в snake_case
|
58
66
|
response.order_id #<order-id>
|
59
67
|
|
60
68
|
```
|
61
|
-
###
|
69
|
+
### Замена HTTP клиента
|
62
70
|
По умолчанию гем использует ```Net::Http``` для отправки HTTP запросов. Если в вашем проекте используется другой Http клиент, например [Faraday](https://github.com/lostisland/faraday) то нужно реализовать callable класс или Proc и передать его в конструктор:
|
63
71
|
```ruby
|
64
72
|
client = SBRF::Api::Client.new(
|
@@ -66,10 +74,18 @@ client = SBRF::Api::Client.new(
|
|
66
74
|
password: '<Merchant Password>',
|
67
75
|
host: '<Sberbank API Host>' # например https://3dsec.sberbank.ru',
|
68
76
|
http_client: ->(uri, params) { Faraday.post(uri, params) }
|
69
|
-
)
|
77
|
+
)
|
70
78
|
```
|
71
79
|
|
80
|
+
### Замена JSON парсера
|
81
|
+
По умолчанию гем использует класс```JSON``` для парсинга JSON строк. Если в вашем проекте используется другой парсер, например [Oj](https://github.com/ohler55/oj) то нужно реализовать callable класс или Proc и передать его в конструктор:
|
82
|
+
```ruby
|
83
|
+
client = SBRF::Api::Client.new(
|
84
|
+
user_name: '<Merchant Username>',
|
85
|
+
password: '<Merchant Password>',
|
86
|
+
host: '<Sberbank API Host>' # например https://3dsec.sberbank.ru',
|
87
|
+
json_parser: ->(json) { Oj.load(json, symbol_keys: true) }
|
88
|
+
)
|
89
|
+
```
|
72
90
|
## Copyright
|
73
|
-
Copyright (c)
|
74
|
-
|
75
|
-
[license]: LICENSE.md
|
91
|
+
Copyright (c) 2019 Eugene Kozlov.
|
@@ -3,6 +3,7 @@
|
|
3
3
|
require 'sbrf_merchant/api/response/body_postprocessor'
|
4
4
|
require 'sbrf_merchant/api/request/body_preprocessor'
|
5
5
|
require 'sbrf_merchant/api/request/uri_builder'
|
6
|
+
require 'sbrf_merchant/utils/json/to_hash_parser'
|
6
7
|
require 'sbrf_merchant/utils/http/client'
|
7
8
|
|
8
9
|
module SbrfMerchant
|
@@ -14,16 +15,18 @@ module SbrfMerchant
|
|
14
15
|
:response_body_postprocessor,
|
15
16
|
:http_client,
|
16
17
|
:uri_builder,
|
17
|
-
:request_body_preprocessor
|
18
|
+
:request_body_preprocessor,
|
19
|
+
:json_parser
|
18
20
|
|
19
21
|
def initialize(
|
20
22
|
user_name:,
|
21
23
|
password:,
|
22
24
|
host:,
|
23
|
-
response_body_postprocessor:
|
24
|
-
request_body_preprocessor:
|
25
|
-
http_client:
|
26
|
-
uri_builder:
|
25
|
+
response_body_postprocessor: SBRF::Api::Response::BodyPostProcessor.new,
|
26
|
+
request_body_preprocessor: SBRF::Api::Request::BodyPreProcessor.new,
|
27
|
+
http_client: SBRF::Utils::Http::Client.new,
|
28
|
+
uri_builder: SBRF::Api::Request::UriBuilder.new,
|
29
|
+
json_parser: SBRF::Utils::JSON::ToHashParser.new
|
27
30
|
)
|
28
31
|
@user_name = user_name
|
29
32
|
@password = password
|
@@ -32,14 +35,16 @@ module SbrfMerchant
|
|
32
35
|
@http_client = http_client
|
33
36
|
@uri_builder = uri_builder
|
34
37
|
@request_body_preprocessor = request_body_preprocessor
|
38
|
+
@json_parser = json_parser
|
35
39
|
end
|
36
40
|
|
37
41
|
def call(method_name, **params)
|
38
42
|
prepared_params = request_body_preprocessor.call(auth_params.merge(params))
|
39
43
|
uri = uri_builder.call(host, method_name)
|
40
|
-
|
41
44
|
response = http_client.call(uri, prepared_params)
|
42
|
-
|
45
|
+
parsed_body = json_parser.call(response.body)
|
46
|
+
|
47
|
+
response_body_postprocessor.call(parsed_body)
|
43
48
|
end
|
44
49
|
|
45
50
|
private
|
@@ -5,7 +5,7 @@ module SbrfMerchant
|
|
5
5
|
module Response
|
6
6
|
class AppendSuccessFlagToHash
|
7
7
|
def call(hash)
|
8
|
-
hash.merge(
|
8
|
+
hash.merge(success?: success?(hash))
|
9
9
|
end
|
10
10
|
|
11
11
|
private
|
@@ -14,7 +14,7 @@ module SbrfMerchant
|
|
14
14
|
# В успешном ответе на запрос register errorCode отсутствует,
|
15
15
|
# поэтому проверяем по параметру formUrl
|
16
16
|
def success?(hash)
|
17
|
-
!hash[
|
17
|
+
!hash[:form_url].nil? || hash[:error_code] == '0'
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
@@ -5,24 +5,18 @@ require 'sbrf_merchant/utils/string/to_camel_case'
|
|
5
5
|
module SbrfMerchant
|
6
6
|
module Api
|
7
7
|
module Response
|
8
|
-
# Проблема - API сбербанка возвращает ответ в формате camelCase,
|
9
|
-
# что не очень красиво выглядит в руби коде
|
10
|
-
|
11
|
-
# Решение - декоратор для хэша на котором будут вызываться методы в snake_case,
|
12
8
|
class BodyDecorator
|
13
|
-
attr_reader :hash
|
9
|
+
attr_reader :hash
|
14
10
|
|
15
|
-
def initialize(hash
|
11
|
+
def initialize(hash)
|
16
12
|
@hash = hash
|
17
|
-
@to_camel_case = to_camel_case
|
18
13
|
end
|
19
14
|
|
20
15
|
def method_missing(meth, *args)
|
21
|
-
|
22
|
-
|
23
|
-
# Если значение не найдено то поведение по умолчанию
|
24
|
-
return super if value.nil?
|
16
|
+
# Если ключ отсутствует то поведение по умолчанию
|
17
|
+
return super unless hash.key?(meth)
|
25
18
|
|
19
|
+
value = hash[meth]
|
26
20
|
# Если значение - хэш то возвращаем его, предварительно обернув в декоратор
|
27
21
|
return self.class.new(value) if value.is_a?(Hash)
|
28
22
|
|
@@ -31,17 +25,11 @@ module SbrfMerchant
|
|
31
25
|
end
|
32
26
|
|
33
27
|
def respond_to?(meth)
|
34
|
-
hash.key?(
|
28
|
+
hash.key?(meth)
|
35
29
|
end
|
36
30
|
|
37
31
|
def respond_to_missing?(meth)
|
38
|
-
hash.key?(
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def key(meth)
|
44
|
-
to_camel_case.call(meth.to_s)
|
32
|
+
hash.key?(meth)
|
45
33
|
end
|
46
34
|
end
|
47
35
|
end
|
@@ -1,20 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'sbrf_merchant/utils/high_order_functions/compose'
|
4
|
-
require 'sbrf_merchant/utils/json/to_hash_parser'
|
5
3
|
require 'sbrf_merchant/api/response/append_success_flag_to_hash'
|
6
4
|
require 'sbrf_merchant/api/response/body_decorator'
|
5
|
+
require 'sbrf_merchant/utils/hash/to_snake_case_keys'
|
7
6
|
|
8
7
|
module SbrfMerchant
|
9
8
|
module Api
|
10
9
|
module Response
|
11
10
|
class BodyPostProcessor
|
12
|
-
def call(
|
13
|
-
::SbrfMerchant::Utils::
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
11
|
+
def call(hash)
|
12
|
+
result = ::SbrfMerchant::Utils::Hash::ToSnakeCaseKeys.new.call(hash)
|
13
|
+
result = ::SbrfMerchant::Api::Response::AppendSuccessFlagToHash.new.call(result)
|
14
|
+
result = ::SbrfMerchant::Api::Response::BodyDecorator.new(result)
|
15
|
+
|
16
|
+
result
|
18
17
|
end
|
19
18
|
end
|
20
19
|
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'json
|
3
|
+
require 'json'
|
4
4
|
|
5
5
|
module SbrfMerchant
|
6
6
|
module Utils
|
7
7
|
module JSON
|
8
8
|
class ToHashParser
|
9
9
|
def call(json)
|
10
|
-
::JSON.parse(json)
|
10
|
+
::JSON.parse(json, symbolize_names: true)
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sbrf_merchant
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eugene Kozlov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-01-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -109,7 +109,7 @@ dependencies:
|
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
112
|
+
name: plissken
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - ">="
|
@@ -122,7 +122,7 @@ dependencies:
|
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
|
-
description: Sberbank
|
125
|
+
description: Simple and flexible Sberbank acquiring API client for Ruby
|
126
126
|
email:
|
127
127
|
- kozlovea8@gmail.com
|
128
128
|
executables: []
|
@@ -140,7 +140,7 @@ files:
|
|
140
140
|
- lib/sbrf_merchant/api/response/body_decorator.rb
|
141
141
|
- lib/sbrf_merchant/api/response/body_postprocessor.rb
|
142
142
|
- lib/sbrf_merchant/utils/hash/to_camel_case_keys.rb
|
143
|
-
- lib/sbrf_merchant/utils/
|
143
|
+
- lib/sbrf_merchant/utils/hash/to_snake_case_keys.rb
|
144
144
|
- lib/sbrf_merchant/utils/http/client.rb
|
145
145
|
- lib/sbrf_merchant/utils/json/to_hash_parser.rb
|
146
146
|
- lib/sbrf_merchant/utils/string/to_camel_case.rb
|
@@ -1,20 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module SbrfMerchant
|
4
|
-
module Utils
|
5
|
-
module HighOrderFunctions
|
6
|
-
# Обьединяем несколько callable сущностей в одну
|
7
|
-
class Compose
|
8
|
-
attr_reader :functions
|
9
|
-
|
10
|
-
def initialize(*functions)
|
11
|
-
@functions = functions
|
12
|
-
end
|
13
|
-
|
14
|
-
def call(arg)
|
15
|
-
functions.inject(arg) { |acc, func| func.call(acc) }
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|