cloud_payments 0.0.3 → 1.0.2

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.
Files changed (73) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +12 -15
  3. data/Gemfile +2 -2
  4. data/README.md +74 -5
  5. data/Rakefile +1 -0
  6. data/cloud_payments.gemspec +7 -6
  7. data/config.ru +1 -0
  8. data/lib/cloud_payments.rb +1 -1
  9. data/lib/cloud_payments/client.rb +3 -2
  10. data/lib/cloud_payments/client/errors.rb +1 -0
  11. data/lib/cloud_payments/client/gateway_errors.rb +3 -1
  12. data/lib/cloud_payments/client/response.rb +2 -1
  13. data/lib/cloud_payments/client/serializer.rb +1 -0
  14. data/lib/cloud_payments/client/serializer/base.rb +9 -1
  15. data/lib/cloud_payments/client/serializer/multi_json.rb +1 -0
  16. data/lib/cloud_payments/config.rb +4 -0
  17. data/lib/cloud_payments/models.rb +2 -0
  18. data/lib/cloud_payments/models/like_subscription.rb +1 -0
  19. data/lib/cloud_payments/models/model.rb +1 -0
  20. data/lib/cloud_payments/models/on_fail.rb +2 -0
  21. data/lib/cloud_payments/models/on_kassa_receipt.rb +23 -0
  22. data/lib/cloud_payments/models/on_pay.rb +2 -0
  23. data/lib/cloud_payments/models/on_recurrent.rb +1 -0
  24. data/lib/cloud_payments/models/order.rb +1 -0
  25. data/lib/cloud_payments/models/secure3d.rb +1 -0
  26. data/lib/cloud_payments/models/subscription.rb +2 -1
  27. data/lib/cloud_payments/models/transaction.rb +9 -0
  28. data/lib/cloud_payments/namespaces.rb +12 -1
  29. data/lib/cloud_payments/namespaces/apple_pay.rb +18 -0
  30. data/lib/cloud_payments/namespaces/base.rb +2 -1
  31. data/lib/cloud_payments/namespaces/cards.rb +6 -0
  32. data/lib/cloud_payments/namespaces/kassa.rb +22 -0
  33. data/lib/cloud_payments/namespaces/orders.rb +5 -0
  34. data/lib/cloud_payments/namespaces/payments.rb +11 -0
  35. data/lib/cloud_payments/namespaces/subscriptions.rb +6 -0
  36. data/lib/cloud_payments/namespaces/tokens.rb +1 -0
  37. data/lib/cloud_payments/version.rb +2 -1
  38. data/lib/cloud_payments/webhooks.rb +7 -2
  39. data/spec/cloud_payments/client/response_spec.rb +3 -1
  40. data/spec/cloud_payments/client/serializer/multi_json_spec.rb +1 -0
  41. data/spec/cloud_payments/models/order_spec.rb +1 -0
  42. data/spec/cloud_payments/models/secure3d_spec.rb +1 -0
  43. data/spec/cloud_payments/models/subscription_spec.rb +1 -1
  44. data/spec/cloud_payments/models/transaction_spec.rb +25 -1
  45. data/spec/cloud_payments/namespaces/apple_pay_spec.rb +21 -0
  46. data/spec/cloud_payments/namespaces/base_spec.rb +10 -3
  47. data/spec/cloud_payments/namespaces/cards_spec.rb +42 -2
  48. data/spec/cloud_payments/namespaces/kassa_spec.rb +43 -0
  49. data/spec/cloud_payments/namespaces/orders_spec.rb +13 -0
  50. data/spec/cloud_payments/namespaces/payments_spec.rb +119 -0
  51. data/spec/cloud_payments/namespaces/subscriptions_spec.rb +21 -1
  52. data/spec/cloud_payments/namespaces/tokens_spec.rb +1 -0
  53. data/spec/cloud_payments/namespaces_spec.rb +2 -1
  54. data/spec/cloud_payments/webhooks_spec.rb +43 -0
  55. data/spec/cloud_payments_spec.rb +27 -4
  56. data/spec/fixtures/apis/cards/post3ds/failed.yml +45 -0
  57. data/spec/fixtures/apis/cards/post3ds/successful.yml +48 -0
  58. data/spec/fixtures/apis/orders/cancel/failed.yml +6 -0
  59. data/spec/fixtures/apis/orders/cancel/successful.yml +6 -0
  60. data/spec/fixtures/apis/payments/find/failed.yml +45 -0
  61. data/spec/fixtures/apis/payments/find/failed_with_message.yml +6 -0
  62. data/spec/fixtures/apis/payments/find/successful.yml +48 -0
  63. data/spec/fixtures/apis/payments/get/failed.yml +46 -0
  64. data/spec/fixtures/apis/payments/get/failed_with_message.yml +6 -0
  65. data/spec/fixtures/apis/payments/get/refunded.yml +49 -0
  66. data/spec/fixtures/apis/payments/get/successful.yml +49 -0
  67. data/spec/fixtures/apis/subscriptions/find/successful.yml +4 -4
  68. data/spec/fixtures/apis/subscriptions/get/successful.yml +31 -0
  69. data/spec/spec_helper.rb +13 -24
  70. data/spec/support/examples.rb +1 -0
  71. data/spec/support/helpers.rb +3 -2
  72. metadata +45 -15
  73. data/spec/cloud_payments/client_spec.rb +0 -5
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+ # frozen_string_literal: true
4
+ require 'spec_helper'
5
+
6
+ describe CloudPayments::Namespaces::Kassa do
7
+ subject{ described_class.new(CloudPayments.client) }
8
+
9
+ describe '#receipt' do
10
+ let(:attributes) do
11
+ {
12
+ inn: '7708806666',
13
+ type: 'Income',
14
+ customer_receipt: {
15
+ items: [
16
+ {
17
+ amount: '13350.00',
18
+ label: 'Good Description',
19
+ price: '13350.00',
20
+ quantity: 1.0,
21
+ vat: 0
22
+ }
23
+ ]
24
+ }
25
+ }
26
+ end
27
+
28
+ context do
29
+ before{ attributes.delete(:inn) }
30
+ specify{ expect{subject.receipt(attributes)}.to raise_error(described_class::InnNotProvided) }
31
+ end
32
+
33
+ context do
34
+ before{ attributes.delete(:type) }
35
+ specify{ expect{subject.receipt(attributes)}.to raise_error(described_class::TypeNotProvided) }
36
+ end
37
+
38
+ context do
39
+ before{ attributes.delete(:customer_receipt) }
40
+ specify{ expect{subject.receipt(attributes)}.to raise_error(described_class::CustomerReceiptNotProvided) }
41
+ end
42
+ end
43
+ end
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  # encoding: utf-8
3
+ # frozen_string_literal: true
3
4
  require 'spec_helper'
4
5
 
5
6
  describe CloudPayments::Namespaces::Orders do
@@ -41,4 +42,16 @@ describe CloudPayments::Namespaces::Orders do
41
42
  end
42
43
  end
43
44
  end
45
+
46
+ describe '#cancel' do
47
+ context do
48
+ before{ stub_api_request('orders/cancel/successful').perform }
49
+ specify{ expect(subject.cancel('12345')).to be_truthy }
50
+ end
51
+
52
+ context do
53
+ before{ stub_api_request('orders/cancel/failed').perform }
54
+ specify{ expect{ subject.cancel('12345') }.to raise_error(CloudPayments::Client::GatewayError, 'Error message') }
55
+ end
56
+ end
44
57
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe CloudPayments::Namespaces::Payments do
@@ -93,4 +94,122 @@ describe CloudPayments::Namespaces::Payments do
93
94
  end
94
95
  end
95
96
  end
97
+
98
+ describe '#get' do
99
+ let(:transaction_id) { 12345 }
100
+
101
+ context 'config.raise_banking_errors = false' do
102
+ before { CloudPayments.config.raise_banking_errors = false }
103
+
104
+ context 'transaction not found' do
105
+ before{ stub_api_request('payments/get/failed_with_message').perform }
106
+ specify{ expect{subject.get(transaction_id)}.to raise_error(CloudPayments::Client::GatewayError, 'Not found') }
107
+ end
108
+
109
+ context 'transaction is failed' do
110
+ before{ stub_api_request('payments/get/failed').perform }
111
+ specify{ expect(subject.get(transaction_id)).to be_instance_of(CloudPayments::Transaction) }
112
+ specify{ expect(subject.get(transaction_id)).not_to be_required_secure3d }
113
+ specify{ expect(subject.get(transaction_id)).to be_declined }
114
+ specify{ expect(subject.get(transaction_id).id).to eq(transaction_id) }
115
+ specify{ expect(subject.get(transaction_id).reason).to eq('InsufficientFunds') }
116
+ end
117
+
118
+ context 'transaction is successful' do
119
+ before{ stub_api_request('payments/get/successful').perform }
120
+ specify{ expect(subject.get(transaction_id)).to be_instance_of(CloudPayments::Transaction) }
121
+ specify{ expect(subject.get(transaction_id)).not_to be_required_secure3d }
122
+ specify{ expect(subject.get(transaction_id)).to be_completed }
123
+ specify{ expect(subject.get(transaction_id).id).to eq(transaction_id) }
124
+ specify{ expect(subject.get(transaction_id).reason).to eq('Approved') }
125
+ end
126
+
127
+ context 'transaction is refunded' do
128
+ before{ stub_api_request('payments/get/refunded').perform }
129
+ specify{ expect(subject.get(transaction_id)).to be_completed }
130
+ specify{ expect(subject.get(transaction_id)).to be_refunded }
131
+ end
132
+ end
133
+
134
+ context 'config.raise_banking_errors = true' do
135
+ before { CloudPayments.config.raise_banking_errors = true}
136
+
137
+ context 'transaction not found' do
138
+ before{ stub_api_request('payments/get/failed_with_message').perform }
139
+ specify{ expect{subject.get(transaction_id)}.to raise_error(CloudPayments::Client::GatewayError, 'Not found') }
140
+ end
141
+
142
+ context 'transaction is failed' do
143
+ before{ stub_api_request('payments/get/failed').perform }
144
+ specify{ expect{subject.get(transaction_id)}.to raise_error(CloudPayments::Client::GatewayErrors::InsufficientFunds) }
145
+ end
146
+
147
+ context 'transaction is successful' do
148
+ before{ stub_api_request('payments/get/successful').perform }
149
+ specify{ expect{subject.get(transaction_id)}.to_not raise_error }
150
+ specify{ expect(subject.get(transaction_id)).to be_instance_of(CloudPayments::Transaction) }
151
+ specify{ expect(subject.get(transaction_id)).not_to be_required_secure3d }
152
+ specify{ expect(subject.get(transaction_id)).to be_completed }
153
+ specify{ expect(subject.get(transaction_id).id).to eq(transaction_id) }
154
+ specify{ expect(subject.get(transaction_id).reason).to eq('Approved') }
155
+ end
156
+ end
157
+ end
158
+
159
+ describe '#find' do
160
+ let(:invoice_id) { '1234567' }
161
+
162
+ context 'config.raise_banking_errors = false' do
163
+ before { CloudPayments.config.raise_banking_errors = false }
164
+
165
+ context 'payment is not found' do
166
+ before{ stub_api_request('payments/find/failed_with_message').perform }
167
+ specify{ expect{subject.find(invoice_id)}.to raise_error(CloudPayments::Client::GatewayError, 'Not found') }
168
+ end
169
+
170
+ context 'payment is failed' do
171
+ before{ stub_api_request('payments/find/failed').perform }
172
+ specify{ expect(subject.find(invoice_id)).to be_instance_of(CloudPayments::Transaction) }
173
+ specify{ expect(subject.find(invoice_id)).not_to be_required_secure3d }
174
+ specify{ expect(subject.find(invoice_id)).to be_declined }
175
+ specify{ expect(subject.find(invoice_id).id).to eq(12345) }
176
+ specify{ expect(subject.find(invoice_id).invoice_id).to eq(invoice_id) }
177
+ specify{ expect(subject.find(invoice_id).reason).to eq('InsufficientFunds') }
178
+ end
179
+
180
+ context 'transaction is successful' do
181
+ before{ stub_api_request('payments/find/successful').perform }
182
+ specify{ expect(subject.find(invoice_id)).to be_instance_of(CloudPayments::Transaction) }
183
+ specify{ expect(subject.find(invoice_id)).not_to be_required_secure3d }
184
+ specify{ expect(subject.find(invoice_id)).to be_completed }
185
+ specify{ expect(subject.find(invoice_id).id).to eq(12345) }
186
+ specify{ expect(subject.find(invoice_id).invoice_id).to eq(invoice_id) }
187
+ specify{ expect(subject.find(invoice_id).reason).to eq('Approved') }
188
+ end
189
+ end
190
+
191
+ context 'config.raise_banking_errors = true' do
192
+ before { CloudPayments.config.raise_banking_errors = true}
193
+
194
+ context 'payment is not found' do
195
+ before{ stub_api_request('payments/find/failed_with_message').perform }
196
+ specify{ expect{subject.find(invoice_id)}.to raise_error(CloudPayments::Client::GatewayError, 'Not found') }
197
+ end
198
+
199
+ context 'payment is failed' do
200
+ before{ stub_api_request('payments/find/failed').perform }
201
+ specify{ expect{subject.find(invoice_id)}.to raise_error(CloudPayments::Client::GatewayErrors::InsufficientFunds) }
202
+ end
203
+
204
+ context 'transaction is successful' do
205
+ before{ stub_api_request('payments/find/successful').perform }
206
+ specify{ expect(subject.find(invoice_id)).to be_instance_of(CloudPayments::Transaction) }
207
+ specify{ expect(subject.find(invoice_id)).not_to be_required_secure3d }
208
+ specify{ expect(subject.find(invoice_id)).to be_completed }
209
+ specify{ expect(subject.find(invoice_id).id).to eq(12345) }
210
+ specify{ expect(subject.find(invoice_id).invoice_id).to eq(invoice_id) }
211
+ specify{ expect(subject.find(invoice_id).reason).to eq('Approved') }
212
+ end
213
+ end
214
+ end
96
215
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe CloudPayments::Namespaces::Subscriptions do
@@ -5,7 +6,7 @@ describe CloudPayments::Namespaces::Subscriptions do
5
6
 
6
7
  describe '#find' do
7
8
  context do
8
- before{ stub_api_request('subscriptions/find/successful').perform }
9
+ before{ stub_api_request('subscriptions/get/successful').perform }
9
10
 
10
11
  specify{ expect(subject.find('sc_8cf8a9338fb')).to be_instance_of(CloudPayments::Subscription) }
11
12
 
@@ -21,6 +22,25 @@ describe CloudPayments::Namespaces::Subscriptions do
21
22
  end
22
23
  end
23
24
 
25
+ describe '#find_all' do
26
+ context do
27
+ before{ stub_api_request('subscriptions/find/successful').perform }
28
+
29
+ specify{ expect(subject.find_all("user@example.com")).to be_instance_of(Array) }
30
+ specify{ expect(subject.find_all("user@example.com").first).to be_instance_of(CloudPayments::Subscription) }
31
+
32
+ context do
33
+ let(:sub){ subject.find_all("user@example.com").first }
34
+
35
+ specify{ expect(sub.id).to eq('sc_8cf8a9338fb') }
36
+ specify{ expect(sub.account_id).to eq('user@example.com') }
37
+ specify{ expect(sub.description).to eq('Monthly subscription') }
38
+ specify{ expect(sub.started_at).to eq(DateTime.parse('2014-08-09T11:49:41')) }
39
+ specify{ expect(sub).to be_active }
40
+ end
41
+ end
42
+ end
43
+
24
44
  describe '#create' do
25
45
  let(:attributes){ {
26
46
  token: '477BBA133C182267F',
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe CloudPayments::Namespaces::Tokens do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe CloudPayments::Namespaces do
@@ -33,7 +34,7 @@ describe CloudPayments::Namespaces do
33
34
  end
34
35
 
35
36
  context 'when exception occurs while request' do
36
- before{ stub_api_request('ping/failed').to_raise(::Faraday::Error::ConnectionFailed) }
37
+ before{ stub_api_request('ping/failed').to_raise(::Faraday::ConnectionFailed) }
37
38
  specify{ expect(subject.ping).to be_falsy }
38
39
  end
39
40
 
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  # encoding: utf-8
3
+ # frozen_string_literal: true
3
4
  require 'spec_helper'
4
5
 
5
6
  describe CloudPayments::Webhooks do
@@ -226,4 +227,46 @@ describe CloudPayments::Webhooks do
226
227
  specify { expect(subject.failed_transactions).to eq 22 }
227
228
  specify { expect(subject.next_transaction_at).to eq DateTime.parse('2015-11-18 20:29:05') }
228
229
  end
230
+
231
+ describe 'on_kassa_receipt' do
232
+ let(:raw_data) do
233
+ {"Id"=>"sc_a38ca02005d40db7d32b36a0097b0",
234
+ "DocumentNumber"=>"1234",
235
+ "SessionNumber"=>"12345",
236
+ "FiscalSign"=>"signsgin",
237
+ "DeviceNumber"=>"123465",
238
+ "RegNumber"=>"12345",
239
+ "Inn"=>"0",
240
+ "Type"=>"Type",
241
+ "Ofd"=>"Ofd",
242
+ "Url"=>"http://example.com/url/",
243
+ "QrCodeUrl"=>"http://example.com/url",
244
+ "Amount"=>"11.11",
245
+ "DateTime"=>"2015-11-18 20:29:05",
246
+ "Receipt"=>"{}",
247
+ "TransactionId" => "12321123",
248
+ "InvoiceId" => "123123",
249
+ "AccountId" => "3213213"}
250
+ end
251
+
252
+ subject { CloudPayments.webhooks.kassa_receipt(raw_data) }
253
+
254
+ specify { expect(subject.id).to eq "sc_a38ca02005d40db7d32b36a0097b0" }
255
+ specify { expect(subject.document_number).to eq '1234' }
256
+ specify { expect(subject.session_number).to eq '12345' }
257
+ specify { expect(subject.fiscal_sign).to eq 'signsgin' }
258
+ specify { expect(subject.device_number).to eq '123465' }
259
+ specify { expect(subject.reg_number).to eq '12345' }
260
+ specify { expect(subject.inn).to eq '0' }
261
+ specify { expect(subject.type).to eq 'Type' }
262
+ specify { expect(subject.ofd).to eq 'Ofd' }
263
+ specify { expect(subject.url).to eq 'http://example.com/url/' }
264
+ specify { expect(subject.qr_code_url).to eq 'http://example.com/url' }
265
+ specify { expect(subject.amount).to eq 11.11 }
266
+ specify { expect(subject.date_time).to eq DateTime.parse('2015-11-18 20:29:05') }
267
+ specify { expect(subject.receipt).to eq '{}' }
268
+ specify { expect(subject.transaction_id).to eq '12321123' }
269
+ specify { expect(subject.invoice_id).to eq '123123' }
270
+ specify { expect(subject.account_id).to eq '3213213' }
271
+ end
229
272
  end
@@ -1,14 +1,37 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe CloudPayments do
4
5
  describe '#config=' do
5
- before{ @old_config = CloudPayments.config }
6
- after{ CloudPayments.config = @old_config }
6
+ before { @old_config = CloudPayments.config }
7
+ after { CloudPayments.config = @old_config }
7
8
 
8
9
  specify{ expect{ CloudPayments.config = 'config' }.to change{ CloudPayments.config }.to('config') }
9
10
  end
10
11
 
11
- describe '#config' do
12
- specify{ expect(CloudPayments.config).to be_instance_of(CloudPayments::Config) }
12
+ it 'supports global configuration' do
13
+ CloudPayments.config.secret_key = "OLD_KEY"
14
+
15
+ CloudPayments.configure do |c|
16
+ c.secret_key = "NEW_KEY"
17
+ end
18
+
19
+ expect(CloudPayments.config.secret_key).to eq "NEW_KEY"
20
+ expect(CloudPayments.client.config.secret_key).to eq "NEW_KEY"
21
+ end
22
+
23
+ it 'supports local configuration' do
24
+ CloudPayments.config.secret_key = "OLD_KEY"
25
+
26
+ config = CloudPayments::Config.new do |c|
27
+ c.secret_key = "NEW_KEY"
28
+ end
29
+ client = CloudPayments::Client.new(config)
30
+ webhooks = CloudPayments::Webhooks.new(config)
31
+
32
+ expect(CloudPayments.config.secret_key).to eq "OLD_KEY"
33
+ expect(config.secret_key).to eq "NEW_KEY"
34
+ expect(client.config.secret_key).to eq "NEW_KEY"
35
+ expect(webhooks.config.secret_key).to eq "NEW_KEY"
13
36
  end
14
37
  end
@@ -0,0 +1,45 @@
1
+ ---
2
+ :request:
3
+ :url: '/payments/cards/post3ds'
4
+ :body: '{"TransactionId":12345,"PaRes":"AQ=="}'
5
+ :response:
6
+ :body: >
7
+ {
8
+ "Model": {
9
+ "TransactionId": 12345,
10
+ "Amount": 10.0,
11
+ "Currency": "RUB",
12
+ "CurrencyCode": 0,
13
+ "PaymentAmount": 10.0,
14
+ "PaymentCurrency": "RUB",
15
+ "PaymentCurrencyCode": 0,
16
+ "InvoiceId": "1234567",
17
+ "AccountId": "user_x",
18
+ "Email": null,
19
+ "Description": "Payment for goods on example.com",
20
+ "JsonData": null,
21
+ "CreatedDate": "\/Date(1401718880000)\/",
22
+ "CreatedDateIso":"2014-08-09T11:49:41",
23
+ "TestMode": true,
24
+ "IpAddress": "195.91.194.13",
25
+ "IpCountry": "RU",
26
+ "IpCity": "Ufa",
27
+ "IpRegion": "Bashkortostan Republic",
28
+ "IpDistrict": "Volga Federal District",
29
+ "IpLatitude": 54.7355,
30
+ "IpLongitude": 55.991982,
31
+ "CardFirstSix": "411111",
32
+ "CardLastFour": "1111",
33
+ "CardType": "Visa",
34
+ "CardTypeCode": 0,
35
+ "IssuerBankCountry": "RU",
36
+ "Status": "Declined",
37
+ "StatusCode": 5,
38
+ "Reason": "InsufficientFunds",
39
+ "ReasonCode": 5051,
40
+ "CardHolderMessage": "Insufficient funds on account",
41
+ "Name": "CARDHOLDER NAME"
42
+ },
43
+ "Success": false,
44
+ "Message": null
45
+ }
@@ -0,0 +1,48 @@
1
+ ---
2
+ :request:
3
+ :url: '/payments/cards/post3ds'
4
+ :body: '{"TransactionId":12345,"PaRes":"AQ=="}'
5
+ :response:
6
+ :body: >
7
+ {
8
+ "Model":{
9
+ "TransactionId":12345,
10
+ "Amount":10.0,
11
+ "Currency":"RUB",
12
+ "CurrencyCode":0,
13
+ "InvoiceId":"1234567",
14
+ "AccountId":"user_x",
15
+ "Email":null,
16
+ "Description":"Payment for goods on example.com",
17
+ "JsonData":null,
18
+ "CreatedDate":"\/Date(1401718880000)\/",
19
+ "CreatedDateIso":"2014-08-09T11:49:41",
20
+ "AuthDate":"\/Date(1401733880523)\/",
21
+ "AuthDateIso":"2014-08-09T11:49:42",
22
+ "ConfirmDate":"\/Date(1401733880523)\/",
23
+ "ConfirmDateIso":"2014-08-09T11:49:42",
24
+ "AuthCode":"123456",
25
+ "TestMode":true,
26
+ "IpAddress":"195.91.194.13",
27
+ "IpCountry":"RU",
28
+ "IpCity":"Ufa",
29
+ "IpRegion":"Bashkortostan Republic",
30
+ "IpDistrict":"Volga Federal District",
31
+ "IpLatitude":54.7355,
32
+ "IpLongitude":55.991982,
33
+ "CardFirstSix":"411111",
34
+ "CardLastFour":"1111",
35
+ "CardType":"Visa",
36
+ "CardTypeCode":0,
37
+ "IssuerBankCountry":"RU",
38
+ "Status":"Completed",
39
+ "StatusCode":3,
40
+ "Reason":"Approved",
41
+ "ReasonCode":0,
42
+ "CardHolderMessage":"Payment successful",
43
+ "Name":"CARDHOLDER NAME",
44
+ "Token":"a4e67841-abb0-42de-a364-d1d8f9f4b3c0"
45
+ },
46
+ "Success":true,
47
+ "Message": null
48
+ }
@@ -0,0 +1,6 @@
1
+ ---
2
+ :request:
3
+ :url: '/orders/cancel'
4
+ :body: '{"Id":"12345"}'
5
+ :response:
6
+ :body: '{"Success":false,"Message":"Error message"}'