mandarin-api 0.1.1 → 0.2.0
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 +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +39 -4
- data/lib/mandarin_api.rb +11 -10
- data/lib/mandarin_api/card_manager.rb +2 -1
- data/lib/mandarin_api/payment_manager.rb +18 -5
- data/lib/mandarin_api/wrapper.rb +2 -0
- data/mandarin-api.gemspec +1 -1
- data/spec/lib/mandarin_api/card_manager_spec.rb +13 -2
- data/spec/lib/mandarin_api/payment_manager_spec.rb +11 -5
- data/spec/lib/mandarin_api/wrapper_spec.rb +4 -2
- data/spec/mocks.rb +2 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1643d81e6774e7c811abcf111b636a289aa8839a
|
4
|
+
data.tar.gz: 63300bd786765890c7111e1d8d820c3d5fbe2558
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 122c5becef312f7e3a912e6c507dfb73b35e7a967acf70609996d6187c05989fc415344277b92ed964a6a4ac85c45d3c26c2aa19fedb0aa476420f19bace4817
|
7
|
+
data.tar.gz: 8be0eb3138d8d5fc5e176d9b84cad6ac4e36e8df9d6bd4b5a80255ae6087f325ab6ec64d5cddec7ce104f860add2275d63e0660a670574112818ec0b80c9a913
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -13,12 +13,22 @@ MandarinApi.configure do |config|
|
|
13
13
|
config.request_url = 'https://secure.mandarinpay.com'
|
14
14
|
end
|
15
15
|
```
|
16
|
+
|
17
|
+
|
18
|
+
|
16
19
|
###**Example of assigning a card:**
|
17
20
|
```ruby
|
18
|
-
MandarinApi.assign_card user
|
21
|
+
MandarinApi.assign_card user, urls
|
19
22
|
```
|
20
23
|
`user` should be an instance or a Struct, and should respond to `#email` and `#phone` methods
|
21
24
|
`#phone` should be serialized, for example '+79091234567' is correctly serialized number.
|
25
|
+
`urls` is a hash that passes callback and redirect URLs:
|
26
|
+
```ruby
|
27
|
+
{
|
28
|
+
return: 'https://www.your-page-to-return-user-to.com',
|
29
|
+
callback: 'https:/www.your-endpoint-for-callbacks.com'
|
30
|
+
}
|
31
|
+
```
|
22
32
|
`#assign_card` will return a hash.
|
23
33
|
###**Example:**
|
24
34
|
```ruby
|
@@ -30,6 +40,8 @@ MandarinApi.assign_card user
|
|
30
40
|
```
|
31
41
|
Keep id, it will be used for pay/payouts requests. Use userWebLink to redirect user to Mandarin page for card data input.
|
32
42
|
|
43
|
+
|
44
|
+
|
33
45
|
###**Example of oneway card binding:**
|
34
46
|
```ruby
|
35
47
|
MandarinApi.oneway_assign_card user, card_number
|
@@ -47,12 +59,14 @@ Keep id, it will be used for pay/payouts requests. Use userWebLink to redirect u
|
|
47
59
|
Oneway binded card can only be used for payouts.
|
48
60
|
|
49
61
|
|
62
|
+
|
50
63
|
###**Example of performing payment:**
|
51
64
|
```ruby
|
52
65
|
# order_id - id of order/bill, etc. in your system.
|
53
66
|
# amount - sum of payout
|
54
67
|
# assigned_card_uuid - the id you received assigning the card
|
55
|
-
|
68
|
+
# extra - an hash to keep your additional data
|
69
|
+
MandarinApi.payment(order_id, amount, assigned_card_uuid, extra)
|
56
70
|
```
|
57
71
|
`#payment` will return a hash with transaction id.
|
58
72
|
###**Example:**
|
@@ -60,12 +74,15 @@ MandarinApi.payment(order_id, amount, assigned_card_uuid)
|
|
60
74
|
{ 'id' => '721a5185314740aaa304278fb1d8ee63' }
|
61
75
|
```
|
62
76
|
|
77
|
+
|
78
|
+
|
63
79
|
###**Example of performing payout:**
|
64
80
|
```ruby
|
65
81
|
# order_id - id of order/bill, etc. in your system.
|
66
82
|
# amount - sum of payout
|
67
83
|
# assigned_card_uuid - the id you received assigning the card
|
68
|
-
|
84
|
+
# extra - an hash to keep your additional data
|
85
|
+
MandarinApi.payout(order_id, amount, assigned_card_uuid, extra)
|
69
86
|
```
|
70
87
|
`#payout` will return a hash with transaction id.
|
71
88
|
###**Example:**
|
@@ -73,14 +90,27 @@ MandarinApi.payout(order_id, amount, assigned_card_uuid)
|
|
73
90
|
{ 'id' => '721a5185314740aaa304278fb1d8ee63' }
|
74
91
|
```
|
75
92
|
|
93
|
+
|
94
|
+
|
76
95
|
###**Example of charging user without card binding**
|
77
96
|
```ruby
|
78
97
|
# order_id - id of order/bill, etc. in your system.
|
79
98
|
# amount - sum of payout
|
80
|
-
MandarinApi.charge(order_id, amount, user)
|
99
|
+
MandarinApi.charge(order_id, amount, user, optional)
|
81
100
|
```
|
82
101
|
`user` should be an instance or a Struct, and should respond to `#email` and `#phone` methods
|
83
102
|
`#phone` should be serialized, for example '+79091234567' is correctly serialized number.
|
103
|
+
`optional` is an hash to keep URLs, data visible on Mandarin page, and your technical data:
|
104
|
+
```ruby
|
105
|
+
{
|
106
|
+
urls: {
|
107
|
+
return: 'https://www.your-page-to-return-user-to.com',
|
108
|
+
callback: 'https:/www.your-endpoint-for-callbacks.com'
|
109
|
+
},
|
110
|
+
visible: { a: 'This value will be visible during payment process on Mandarin page' },
|
111
|
+
invisible: { some_additional_id: 12} # this value won't be visible and will be returned in callback
|
112
|
+
}
|
113
|
+
```
|
84
114
|
`#charge` will return a hash.
|
85
115
|
###**Example:**
|
86
116
|
```ruby
|
@@ -91,6 +121,8 @@ MandarinApi.charge(order_id, amount, user)
|
|
91
121
|
}
|
92
122
|
```
|
93
123
|
|
124
|
+
|
125
|
+
|
94
126
|
###**Example of performing refund:**
|
95
127
|
```ruby
|
96
128
|
# order_id - id of order/bill, etc. in your system.
|
@@ -103,6 +135,8 @@ MandarinApi.refund(order_id, transaction_uuid)
|
|
103
135
|
{ 'id' => '721a5185314740aaa304278fb1d8ee63' }
|
104
136
|
```
|
105
137
|
|
138
|
+
|
139
|
+
|
106
140
|
###**Example of performing rebill:**
|
107
141
|
```ruby
|
108
142
|
# order_id - id of order/bill, etc. in your system.
|
@@ -117,6 +151,7 @@ MandarinApi.rebill(order_id, amount, transaction_uuid)
|
|
117
151
|
```
|
118
152
|
|
119
153
|
|
154
|
+
|
120
155
|
You will have to provide a link to receive callbacks from Mandarin.
|
121
156
|
MandarinApi.process_callback takes as arguments body of a callback serialized
|
122
157
|
to hash with symbolized keys and an instance with `#success` and `#failure` methods,
|
data/lib/mandarin_api.rb
CHANGED
@@ -5,33 +5,35 @@ module MandarinApi
|
|
5
5
|
attr_accessor :config
|
6
6
|
end
|
7
7
|
|
8
|
-
def self.assign_card(user)
|
9
|
-
MandarinApi::CardManager.new.assign_card user
|
8
|
+
def self.assign_card(user, urls = {})
|
9
|
+
MandarinApi::CardManager.new.assign_card user, urls
|
10
10
|
end
|
11
11
|
|
12
12
|
def self.oneway_assign_card(user, card)
|
13
13
|
MandarinApi::CardManager.new.one_side_assign_card user, card
|
14
14
|
end
|
15
15
|
|
16
|
-
def self.charge(order_id, amount, user)
|
16
|
+
def self.charge(order_id, amount, user, extra = {})
|
17
17
|
params = {
|
18
|
-
order_id: order_id, amount: amount, email: user.email, phone: user.phone
|
18
|
+
order_id: order_id, amount: amount, email: user.email, phone: user.phone,
|
19
|
+
urls: extra[:urls], custom_values: extra[:visible],
|
20
|
+
extra: extra[:invisible]
|
19
21
|
}
|
20
22
|
MandarinApi::PaymentManager.new.perform_charge params
|
21
23
|
end
|
22
24
|
|
23
|
-
def self.pay(order_id, amount, assigned_card_uuid)
|
25
|
+
def self.pay(order_id, amount, assigned_card_uuid, extra = {})
|
24
26
|
params = {
|
25
|
-
order_id: order_id, amount: amount,
|
27
|
+
order_id: order_id, amount: amount, extra: extra,
|
26
28
|
assigned_card_uuid: assigned_card_uuid
|
27
29
|
}
|
28
30
|
MandarinApi::PaymentManager.new.perform_payment params
|
29
31
|
end
|
30
32
|
|
31
|
-
def self.payout(order_id, amount, assigned_card_uuid)
|
33
|
+
def self.payout(order_id, amount, assigned_card_uuid, extra = {})
|
32
34
|
params = {
|
33
35
|
order_id: order_id, amount: amount,
|
34
|
-
assigned_card_uuid: assigned_card_uuid
|
36
|
+
assigned_card_uuid: assigned_card_uuid, extra: extra
|
35
37
|
}
|
36
38
|
MandarinApi::PaymentManager.new.perform_payout params
|
37
39
|
end
|
@@ -43,8 +45,7 @@ module MandarinApi
|
|
43
45
|
|
44
46
|
def self.rebill(order_id, amount, transaction_uuid)
|
45
47
|
params = {
|
46
|
-
order_id: order_id, amount: amount,
|
47
|
-
transaction_uuid: transaction_uuid
|
48
|
+
order_id: order_id, amount: amount, transaction_uuid: transaction_uuid
|
48
49
|
}
|
49
50
|
MandarinApi::PaymentManager.new.perform_rebill params
|
50
51
|
end
|
@@ -2,8 +2,9 @@
|
|
2
2
|
module MandarinApi
|
3
3
|
# Manages cards assignment
|
4
4
|
class CardManager
|
5
|
-
def assign_card(user)
|
5
|
+
def assign_card(user, urls)
|
6
6
|
params = { customer_info: { email: user.email, phone: phone(user) } }
|
7
|
+
params[:urls] = urls unless urls.empty?
|
7
8
|
MandarinApi::Wrapper.new(merchant_id: MandarinApi.config.merchant_id,
|
8
9
|
secret: MandarinApi.config.secret)
|
9
10
|
.request('/api/card-bindings', params)
|
@@ -32,18 +32,23 @@ module MandarinApi
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def normal_request_body(params, action)
|
35
|
-
{
|
35
|
+
body = {
|
36
36
|
payment: payment(params, action),
|
37
|
-
target: { card: params[:assigned_card_uuid] }
|
37
|
+
target: { card: params[:assigned_card_uuid] },
|
38
38
|
}
|
39
|
+
body[:extra] = systemize(params[:extra]) unless params[:extra].empty?
|
40
|
+
body
|
39
41
|
end
|
40
42
|
|
41
43
|
def charge_request_body(params, action)
|
42
|
-
{
|
44
|
+
body = {
|
43
45
|
payment: payment(params, action),
|
44
|
-
customer_info: { email: params[:email], phone: phone(params[:phone]) }
|
45
|
-
custom_values: []
|
46
|
+
customer_info: { email: params[:email], phone: phone(params[:phone]) }
|
46
47
|
}
|
48
|
+
body[:custom_values] = systemize(params[:custom_values]) if params[:custom_values]
|
49
|
+
body[:urls] = params[:urls] if params[:urls]
|
50
|
+
body[:extra] = systemize(params[:extra]) if params[:extra]
|
51
|
+
body
|
47
52
|
end
|
48
53
|
|
49
54
|
def refund_request_body(params, action)
|
@@ -64,6 +69,14 @@ module MandarinApi
|
|
64
69
|
{ order_id: params[:order_id], action: action, price: params[:amount] }
|
65
70
|
end
|
66
71
|
|
72
|
+
def systemize(options)
|
73
|
+
result = []
|
74
|
+
options.each do |key, value|
|
75
|
+
result << { name: key.to_s, value: value }
|
76
|
+
end
|
77
|
+
result
|
78
|
+
end
|
79
|
+
|
67
80
|
def phone(phone)
|
68
81
|
if phone.nil?
|
69
82
|
'+70000000000'
|
data/lib/mandarin_api/wrapper.rb
CHANGED
data/mandarin-api.gemspec
CHANGED
@@ -3,11 +3,22 @@ RSpec.describe MandarinApi::CardManager do
|
|
3
3
|
let(:merchant_id) { 234 }
|
4
4
|
let(:secret) { 'secret' }
|
5
5
|
let(:user) { User.new('ololo@gmail.com', '8-909-999-88-77') }
|
6
|
+
let(:urls) do
|
7
|
+
{
|
8
|
+
return: 'https://www.ololol.com',
|
9
|
+
callback: 'https://www.ololol.com/callbacks'
|
10
|
+
}
|
11
|
+
end
|
6
12
|
|
7
13
|
User = Struct.new('User', :email, :phone)
|
8
14
|
describe 'assign_card' do
|
9
15
|
let(:params) do
|
10
|
-
{ customer_info: { email: 'ololo@gmail.com', phone: '+79099998877' }
|
16
|
+
{ customer_info: { email: 'ololo@gmail.com', phone: '+79099998877' },
|
17
|
+
urls: {
|
18
|
+
return: 'https://www.ololol.com',
|
19
|
+
callback: 'https://www.ololol.com/callbacks'
|
20
|
+
}
|
21
|
+
}
|
11
22
|
end
|
12
23
|
it 'calls wrapper instance with args' do
|
13
24
|
allow(MandarinApi).to \
|
@@ -18,7 +29,7 @@ RSpec.describe MandarinApi::CardManager do
|
|
18
29
|
.with('/api/card-bindings', params)
|
19
30
|
expect_any_instance_of(MandarinApi::Wrapper).to receive(:request)
|
20
31
|
.with('/api/card-bindings', params)
|
21
|
-
card_manager.assign_card user
|
32
|
+
card_manager.assign_card user, urls
|
22
33
|
end
|
23
34
|
end
|
24
35
|
|
@@ -6,30 +6,36 @@ RSpec.describe MandarinApi::PaymentManager do
|
|
6
6
|
let(:params) do
|
7
7
|
{
|
8
8
|
order_id: 123_321, amount: 35_000,
|
9
|
-
assigned_card_uuid: '0eb51e74-e704-4c36-b5cb-8f0227621518'
|
9
|
+
assigned_card_uuid: '0eb51e74-e704-4c36-b5cb-8f0227621518',
|
10
|
+
extra: { a: 'A', b: 'B' }
|
10
11
|
}
|
11
12
|
end
|
12
13
|
let(:normal_request_body) do
|
13
14
|
{
|
14
15
|
payment: { order_id: 123_321, action: action, price: 35_000 },
|
15
|
-
target: { card: '0eb51e74-e704-4c36-b5cb-8f0227621518' }
|
16
|
+
target: { card: '0eb51e74-e704-4c36-b5cb-8f0227621518' },
|
17
|
+
extra: [{ name: 'a', value: 'A' }, { name: 'b', value: 'B' }]
|
16
18
|
}
|
17
19
|
end
|
18
20
|
let(:charge_request_body) do
|
19
21
|
{
|
20
22
|
payment: { order_id: 123_321, action: action, price: 35_000 },
|
21
23
|
customer_info: { email: email, phone: phone },
|
22
|
-
custom_values: []
|
24
|
+
custom_values: [{ name: 'a', value: 'A'}, { name: 'b', value: 'B' }],
|
25
|
+
extra: [{ name: 'one', value: 'One'}, { name: 'two', value: 'Two' }],
|
26
|
+
urls: { callback: 'callback', return: 'return' }
|
23
27
|
}
|
24
28
|
end
|
29
|
+
|
25
30
|
describe '#perform_charge' do
|
26
31
|
let(:email) { Faker::Internet.free_email }
|
27
32
|
let(:phone) { "+7#{Faker::Number.between(100_000_000, 999_999_999)}" }
|
28
33
|
let(:action) { 'pay' }
|
29
34
|
let(:params) do
|
30
35
|
{
|
31
|
-
order_id: 123_321, amount: 35_000,
|
32
|
-
|
36
|
+
order_id: 123_321, amount: 35_000, email: email, phone: phone,
|
37
|
+
custom_values: { a: 'A', b: 'B' }, extra: { one: 'One', two: 'Two' },
|
38
|
+
urls: { callback: 'callback', return: 'return' }
|
33
39
|
}
|
34
40
|
end
|
35
41
|
it 'calls wrapper instance with args' do
|
@@ -46,7 +46,8 @@ RSpec.describe MandarinApi::Wrapper do
|
|
46
46
|
},
|
47
47
|
big_key_two: {
|
48
48
|
key_a: 'a', key_b: 'b'
|
49
|
-
}
|
49
|
+
},
|
50
|
+
a_r_r_a_y: [{ name: 'a_key', value: 'a' }]
|
50
51
|
}
|
51
52
|
end
|
52
53
|
let(:output) do
|
@@ -56,7 +57,8 @@ RSpec.describe MandarinApi::Wrapper do
|
|
56
57
|
},
|
57
58
|
'bigKeyTwo' => {
|
58
59
|
'keyA' => 'a', 'keyB' => 'b'
|
59
|
-
}
|
60
|
+
},
|
61
|
+
'aRRAY' => [{ 'name' => 'a_key', 'value' => 'a' }]
|
60
62
|
}
|
61
63
|
end
|
62
64
|
it 'input: multilevel hash with underscored keys-symbols, ' \
|
data/spec/mocks.rb
CHANGED
@@ -9,7 +9,8 @@ RSpec.shared_context 'mocks', shared_contex: :metadata do
|
|
9
9
|
payout_body =
|
10
10
|
JSON.generate(
|
11
11
|
payment: { orderId: 123_321, action: 'payout', price: 35_000 },
|
12
|
-
target: { card: '0eb51e74-e704-4c36-b5cb-8f0227621518' }
|
12
|
+
target: { card: '0eb51e74-e704-4c36-b5cb-8f0227621518' },
|
13
|
+
customValues: [{ name: 'a', value: 'A' }, {name: 'b', value: 'B' }]
|
13
14
|
)
|
14
15
|
header = {
|
15
16
|
'Accept' => '*/*', 'Accept-Encoding' => 'gzip, deflate',
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mandarin-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vladimir Bogaevsky
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: webmock
|