tns_payments 0.0.11 → 0.0.12
Sign up to get free protection for your applications and to get access to all the features.
- data/.env.example +4 -0
- data/.gitignore +1 -0
- data/lib/tns_payments/connection.rb +74 -52
- data/lib/tns_payments/request.rb +8 -10
- data/lib/tns_payments/response.rb +27 -7
- data/lib/tns_payments/test_support/card_session.rb +77 -0
- data/lib/tns_payments/version.rb +1 -1
- data/test/cassettes/test_amex_successful_purchase.yml +112 -0
- data/test/cassettes/test_available.yml +38 -0
- data/test/cassettes/test_card_enrolled_for_3ds.yml +112 -0
- data/test/cassettes/test_card_not_enrolled_for_3ds.yml +112 -0
- data/test/cassettes/test_deleting_tokenised_card.yml +223 -0
- data/test/cassettes/test_mastercard_successful_purchase.yml +112 -0
- data/test/cassettes/test_refund_successful_purchase.yml +149 -0
- data/test/cassettes/test_tokenise_creditcard_from_session_for_later_purchase.yml +149 -0
- data/test/cassettes/test_unsuccessful_purchase.yml +42 -0
- data/test/cassettes/test_unsupported_3ds_gateway.yml +114 -0
- data/test/cassettes/test_visa_successful_purchase.yml +112 -0
- data/test/helper.rb +48 -0
- data/test/integration/operations_test.rb +187 -0
- data/test/unit/response_test.rb +0 -4
- data/test/unit/transaction_test.rb +2 -0
- data/tns_payments.gemspec +11 -5
- metadata +218 -89
- data/test/unit/conntection_test.rb +0 -311
data/.env.example
ADDED
data/.gitignore
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'base64'
|
2
|
+
require 'active_support/ordered_hash'
|
2
3
|
|
3
4
|
module TNSPayments
|
4
5
|
class Connection
|
@@ -11,7 +12,7 @@ module TNSPayments
|
|
11
12
|
#
|
12
13
|
# Returns a boolean.
|
13
14
|
def available?
|
14
|
-
request(:get, '/information'
|
15
|
+
AvailableResponse.new(request(:get, '/information')).success?
|
15
16
|
end
|
16
17
|
|
17
18
|
def initialize options
|
@@ -34,16 +35,17 @@ module TNSPayments
|
|
34
35
|
transaction = Transaction.new transaction
|
35
36
|
order_id = transaction.order_id
|
36
37
|
transaction_id = transaction.transaction_id
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
38
|
+
order_params = ActiveSupport::OrderedHash.new
|
39
|
+
order_params['amount'] = transaction.amount.to_s
|
40
|
+
order_params['currency'] = transaction.currency
|
41
|
+
order_params['reference'] = transaction.reference
|
42
|
+
transaction_params = ActiveSupport::OrderedHash.new
|
43
|
+
transaction_params['reference'] = transaction.reference.to_s
|
44
|
+
params = ActiveSupport::OrderedHash.new
|
45
|
+
params['apiOperation'] = 'PAY'
|
46
|
+
params['order'] = order_params
|
47
|
+
params['transaction'] = transaction_params
|
48
|
+
params.merge!(source_of_funds(token))
|
47
49
|
|
48
50
|
request :put, "/merchant/#{merchant_id}/order/#{order_id}/transaction/#{transaction_id}", params
|
49
51
|
end
|
@@ -52,17 +54,16 @@ module TNSPayments
|
|
52
54
|
#
|
53
55
|
# Returns a Response object.
|
54
56
|
def refund transaction
|
55
|
-
transaction
|
56
|
-
order_id
|
57
|
+
transaction = Transaction.new transaction
|
58
|
+
order_id = transaction.order_id.to_i
|
57
59
|
transaction_id = transaction.transaction_id
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
}
|
60
|
+
transaction_params = ActiveSupport::OrderedHash.new
|
61
|
+
transaction_params['amount'] = transaction.amount.to_s
|
62
|
+
transaction_params['currency'] = transaction.currency
|
63
|
+
transaction_params['reference'] = transaction.reference.to_s
|
64
|
+
params = ActiveSupport::OrderedHash.new
|
65
|
+
params['apiOperation'] = 'REFUND'
|
66
|
+
params['transaction'] = transaction_params
|
66
67
|
|
67
68
|
request :put, "/merchant/#{merchant_id}/order/#{order_id}/transaction/#{transaction_id}", params
|
68
69
|
end
|
@@ -71,9 +72,13 @@ module TNSPayments
|
|
71
72
|
#
|
72
73
|
# Returns a Response object.
|
73
74
|
def create_credit_card_token token
|
74
|
-
|
75
|
-
|
76
|
-
|
75
|
+
source_of_funds_params = ActiveSupport::OrderedHash.new
|
76
|
+
source_of_funds_params['type'] = 'CARD'
|
77
|
+
session_params = ActiveSupport::OrderedHash.new
|
78
|
+
session_params['id'] = token
|
79
|
+
params = ActiveSupport::OrderedHash.new
|
80
|
+
params['session'] = session_params
|
81
|
+
params['sourceOfFunds'] = source_of_funds_params
|
77
82
|
|
78
83
|
request :post, "/merchant/#{merchant_id}/token", params
|
79
84
|
end
|
@@ -92,35 +97,44 @@ module TNSPayments
|
|
92
97
|
# Returns a Response object.
|
93
98
|
def session_token
|
94
99
|
@session_token ||= begin
|
95
|
-
|
96
|
-
if
|
97
|
-
|
100
|
+
result = request :post, "/merchant/#{merchant_id}/session"
|
101
|
+
if result.success?
|
102
|
+
result.response['session']['id']
|
98
103
|
else
|
99
|
-
raise SessionTokenException.new,
|
104
|
+
raise SessionTokenException.new, result.explanation
|
100
105
|
end
|
101
106
|
end
|
102
107
|
end
|
103
108
|
|
109
|
+
# Public: Request to update a session token with card data.
|
110
|
+
#
|
111
|
+
# Returns a response object.
|
112
|
+
def update_session_with_card(token, card)
|
113
|
+
source_of_funds_params = ActiveSupport::OrderedHash.new
|
114
|
+
source_of_funds_params['type'] = 'CARD'
|
115
|
+
source_of_funds_params['provided'] = {'card' => card}
|
116
|
+
params = {'sourceOfFunds' => source_of_funds_params}
|
117
|
+
|
118
|
+
UpdateSessionResponse.new(request(:put, "/merchant/#{merchant_id}/session/#{token}", params))
|
119
|
+
end
|
120
|
+
|
104
121
|
# Public: Request to check a cardholder's enrollment in the 3DSecure scheme.
|
105
122
|
#
|
106
123
|
# Returns a Response object.
|
107
124
|
def check_enrollment transaction, token, postback_url
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
}
|
122
|
-
|
123
|
-
request :put, "/merchant/#{merchant_id}/3DSecureId/#{transaction.three_domain_id}", params
|
125
|
+
redirect_params = ActiveSupport::OrderedHash.new
|
126
|
+
redirect_params['pageGenerationMode'] = 'CUSTOMIZED'
|
127
|
+
redirect_params['responseUrl'] = postback_url
|
128
|
+
order_params = ActiveSupport::OrderedHash.new
|
129
|
+
order_params['amount'] = transaction.amount.to_s
|
130
|
+
order_params['currency'] = transaction.currency
|
131
|
+
params = ActiveSupport::OrderedHash.new
|
132
|
+
params['apiOperation'] = 'CHECK_3DS_ENROLLMENT'
|
133
|
+
params['3DSecure'] = {'authenticationRedirect' => redirect_params}
|
134
|
+
params['session'] = {'id' => token}
|
135
|
+
params['order'] = order_params
|
136
|
+
|
137
|
+
ThreeDomainSecureResponse.new(request(:put, "/merchant/#{merchant_id}/3DSecureId/#{transaction.three_domain_id}", params))
|
124
138
|
end
|
125
139
|
|
126
140
|
# Public: Interprets the authentication response returned from the card
|
@@ -134,21 +148,29 @@ module TNSPayments
|
|
134
148
|
'apiOperation' => 'PROCESS_ACS_RESULT'
|
135
149
|
}
|
136
150
|
|
137
|
-
request
|
151
|
+
ThreeDomainSecureResponse.new(request(:post, "/merchant/#{merchant_id}/3DSecureId/#{three_domain_id}", params))
|
138
152
|
end
|
139
153
|
|
140
154
|
private
|
141
155
|
|
142
|
-
def
|
143
|
-
|
144
|
-
|
156
|
+
def source_of_funds(token)
|
157
|
+
params = ActiveSupport::OrderedHash.new
|
158
|
+
funds = ActiveSupport::OrderedHash.new
|
159
|
+
funds['type'] = 'CARD'
|
160
|
+
|
161
|
+
if token =~ CREDIT_CARD_TOKEN_FORMAT
|
162
|
+
funds['token'] = token
|
163
|
+
params['sourceOfFunds'] = funds
|
164
|
+
else
|
165
|
+
params['sourceOfFunds'] = funds
|
166
|
+
params['session'] = {'id' => token}
|
167
|
+
end
|
145
168
|
|
146
|
-
|
147
|
-
token =~ CREDIT_CARD_TOKEN_FORMAT ? 'cardToken' : 'session'
|
169
|
+
params
|
148
170
|
end
|
149
171
|
|
150
|
-
def request
|
151
|
-
Request.new(self,
|
172
|
+
def request(*args)
|
173
|
+
Request.new(self, *args).perform
|
152
174
|
end
|
153
175
|
end
|
154
176
|
end
|
data/lib/tns_payments/request.rb
CHANGED
@@ -5,7 +5,7 @@ module TNSPayments
|
|
5
5
|
class Request
|
6
6
|
attr_accessor :connection, :method, :path, :payload
|
7
7
|
|
8
|
-
def initialize connection, method, path, payload =
|
8
|
+
def initialize connection, method, path, payload = nil
|
9
9
|
self.connection = connection
|
10
10
|
self.method = method
|
11
11
|
self.path = path
|
@@ -19,7 +19,7 @@ module TNSPayments
|
|
19
19
|
headers = {}
|
20
20
|
headers[:accept] = '*/*'
|
21
21
|
headers[:content_type] = 'Application/json;charset=UTF-8'
|
22
|
-
headers[:Authorization] = encode_credentials
|
22
|
+
headers[:Authorization] = encode_credentials
|
23
23
|
headers
|
24
24
|
end
|
25
25
|
|
@@ -30,17 +30,17 @@ module TNSPayments
|
|
30
30
|
args = {
|
31
31
|
:method => method,
|
32
32
|
:url => url,
|
33
|
-
:payload => payload.to_json,
|
34
33
|
:headers => headers,
|
35
34
|
:timeout => 120,
|
36
35
|
:open_timeout => 30
|
37
36
|
}
|
37
|
+
args[:payload] = payload.to_json if payload
|
38
38
|
|
39
39
|
Response.new RestClient::Request.execute(args)
|
40
40
|
rescue RestClient::Exception => e
|
41
41
|
response = e.response
|
42
42
|
|
43
|
-
if
|
43
|
+
if e.is_a?(RestClient::RequestTimeout)
|
44
44
|
response = JSON.generate({:error => {:cause => 'REQUEST_TIMEDOUT'}})
|
45
45
|
end
|
46
46
|
|
@@ -49,16 +49,14 @@ module TNSPayments
|
|
49
49
|
|
50
50
|
private
|
51
51
|
|
52
|
-
def authorization
|
53
|
-
payload.fetch(:authorization) { true }
|
54
|
-
end
|
55
|
-
|
56
52
|
def encode_credentials
|
57
|
-
|
53
|
+
credentials = ["merchant.#{connection.merchant_id}:#{connection.api_key}"].pack("m*").delete("\n")
|
54
|
+
|
55
|
+
"Basic #{credentials}"
|
58
56
|
end
|
59
57
|
|
60
58
|
def url
|
61
|
-
"#{connection.host}/api/rest/version/
|
59
|
+
"#{connection.host}/api/rest/version/32#{path}"
|
62
60
|
end
|
63
61
|
end
|
64
62
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'delegate'
|
2
|
+
|
1
3
|
module TNSPayments
|
2
4
|
class Response
|
3
5
|
attr_reader :raw_response
|
@@ -17,13 +19,7 @@ module TNSPayments
|
|
17
19
|
#
|
18
20
|
# Returns a string.
|
19
21
|
def result
|
20
|
-
|
21
|
-
response['status'] == 'OPERATING' ? 'SUCCESS' : 'ERROR'
|
22
|
-
elsif response.has_key?('3DSecure')
|
23
|
-
'SUCCESS'
|
24
|
-
else
|
25
|
-
response['result']
|
26
|
-
end
|
22
|
+
response.fetch('result') { 'UNKNOWN' }
|
27
23
|
end
|
28
24
|
|
29
25
|
# Public: Check if the request was successful.
|
@@ -44,4 +40,28 @@ module TNSPayments
|
|
44
40
|
end
|
45
41
|
end
|
46
42
|
end
|
43
|
+
|
44
|
+
class UpdateSessionResponse < SimpleDelegator
|
45
|
+
def success?
|
46
|
+
update_status == 'SUCCESS'
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def update_status
|
52
|
+
response['session']['updateStatus']
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
class AvailableResponse < SimpleDelegator
|
57
|
+
def success?
|
58
|
+
response['status'] == 'OPERATING'
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
class ThreeDomainSecureResponse < SimpleDelegator
|
63
|
+
def success?
|
64
|
+
response.has_key?("3DSecure")
|
65
|
+
end
|
66
|
+
end
|
47
67
|
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# https://secure.ap.tnspayments.com/api/documentation/integrationGuidelines/supportedFeatures/testAndGoLive.html?locale=en_US
|
2
|
+
module TNSPayments
|
3
|
+
module TestSupport
|
4
|
+
class CardSession
|
5
|
+
SAMPLE_CARDS = {
|
6
|
+
:mastercard => {
|
7
|
+
:number => "5123456789012346",
|
8
|
+
:expiry => {
|
9
|
+
:month => "5",
|
10
|
+
:year => "17",
|
11
|
+
},
|
12
|
+
:securityCode => "123",
|
13
|
+
},
|
14
|
+
:amex => {
|
15
|
+
:number => "345678901234564",
|
16
|
+
:expiry => {
|
17
|
+
:month => "5",
|
18
|
+
:year => "17",
|
19
|
+
},
|
20
|
+
:securityCode => "1234",
|
21
|
+
},
|
22
|
+
:visa => {
|
23
|
+
:number => "4005550000000001",
|
24
|
+
:expiry => {
|
25
|
+
:month => "5",
|
26
|
+
:year => "17",
|
27
|
+
},
|
28
|
+
:securityCode => "123",
|
29
|
+
},
|
30
|
+
:visa_enrolled_3ds => {
|
31
|
+
:number => "4508750015741019",
|
32
|
+
:expiry => {
|
33
|
+
:month => "05",
|
34
|
+
:year => "17",
|
35
|
+
},
|
36
|
+
:securityCode => "123",
|
37
|
+
},
|
38
|
+
:visa_not_enrolled_3ds => {
|
39
|
+
:number => "4005550000000001",
|
40
|
+
:expiry => {
|
41
|
+
:month => "05",
|
42
|
+
:year => "17",
|
43
|
+
},
|
44
|
+
:securityCode => "123",
|
45
|
+
},
|
46
|
+
}
|
47
|
+
|
48
|
+
def self.sample_card(card_type = :visa)
|
49
|
+
SAMPLE_CARDS.fetch(card_type)
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.sample(card_type = :visa, *args)
|
53
|
+
sessionize(sample_card(card_type), *args)
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.sessionize(card, *args)
|
57
|
+
session = new(*args)
|
58
|
+
session.store(card)
|
59
|
+
session.token
|
60
|
+
end
|
61
|
+
|
62
|
+
def initialize(tns)
|
63
|
+
@tns = tns
|
64
|
+
end
|
65
|
+
|
66
|
+
def token
|
67
|
+
@token ||= @tns.session_token
|
68
|
+
end
|
69
|
+
|
70
|
+
def store(card)
|
71
|
+
response = @tns.update_session_with_card(token, card)
|
72
|
+
raise response.response.inspect unless response.success?
|
73
|
+
response
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
data/lib/tns_payments/version.rb
CHANGED
@@ -0,0 +1,112 @@
|
|
1
|
+
---
|
2
|
+
recorded_with: VCR 2.9.3
|
3
|
+
http_interactions:
|
4
|
+
- request:
|
5
|
+
method: post
|
6
|
+
uri: https://merchant.<TNS_MERCHANT_ID>:<TNS_API_KEY>@secure.ap.tnspayments.com/api/rest/version/32/merchant/<TNS_MERCHANT_ID>/session
|
7
|
+
body:
|
8
|
+
string: ""
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- "*/*"
|
12
|
+
Content-Type:
|
13
|
+
- Application/json;charset=UTF-8
|
14
|
+
Accept-Encoding:
|
15
|
+
- gzip, deflate
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 201
|
19
|
+
message: Created
|
20
|
+
headers:
|
21
|
+
Content-Length:
|
22
|
+
- "149"
|
23
|
+
Content-Type:
|
24
|
+
- application/json;charset=UTF-8
|
25
|
+
Date:
|
26
|
+
- Mon, 11 Jan 2016 23:51:04 GMT
|
27
|
+
Pragma:
|
28
|
+
- no-cache
|
29
|
+
Expires:
|
30
|
+
- "0"
|
31
|
+
Set-Cookie:
|
32
|
+
- TS018aacab=01c9ad79a0777676190757f71bce1b77e026c4ec88a6e8088ae37b951e999fdf69ef2438b0; Path=/
|
33
|
+
Cache-Control:
|
34
|
+
- no-cache, no-store, must-revalidate
|
35
|
+
body:
|
36
|
+
string: "{\"merchant\":\"<TNS_MERCHANT_ID>\",\"result\":\"SUCCESS\",\"session\":{\"id\":\"SESSION0002414369440E9534413G26\",\"updateStatus\":\"NO_UPDATE\",\"version\":\"c1669f4301\"}}"
|
37
|
+
http_version:
|
38
|
+
recorded_at: Mon, 11 Jan 2016 23:51:05 GMT
|
39
|
+
- request:
|
40
|
+
method: put
|
41
|
+
uri: https://merchant.<TNS_MERCHANT_ID>:<TNS_API_KEY>@secure.ap.tnspayments.com/api/rest/version/32/merchant/<TNS_MERCHANT_ID>/session/SESSION0002414369440E9534413G26
|
42
|
+
body:
|
43
|
+
string: "{\"sourceOfFunds\":{\"type\":\"CARD\",\"provided\":{\"card\":{\"number\":\"345678901234564\",\"expiry\":{\"month\":\"5\",\"year\":\"17\"},\"securityCode\":\"1234\"}}}}"
|
44
|
+
headers:
|
45
|
+
Accept:
|
46
|
+
- "*/*"
|
47
|
+
Content-Length:
|
48
|
+
- "139"
|
49
|
+
Content-Type:
|
50
|
+
- Application/json;charset=UTF-8
|
51
|
+
Accept-Encoding:
|
52
|
+
- gzip, deflate
|
53
|
+
response:
|
54
|
+
status:
|
55
|
+
code: 200
|
56
|
+
message: OK
|
57
|
+
headers:
|
58
|
+
Content-Length:
|
59
|
+
- "337"
|
60
|
+
Content-Type:
|
61
|
+
- application/json;charset=UTF-8
|
62
|
+
Date:
|
63
|
+
- Mon, 11 Jan 2016 23:51:04 GMT
|
64
|
+
Pragma:
|
65
|
+
- no-cache
|
66
|
+
Expires:
|
67
|
+
- "0"
|
68
|
+
Set-Cookie:
|
69
|
+
- TS018aacab=01c9ad79a00b36c4299550473029df7107a8073c81d7d5bcee01337bec979dba1ac9e1adff; Path=/
|
70
|
+
Cache-Control:
|
71
|
+
- no-cache, no-store, must-revalidate
|
72
|
+
body:
|
73
|
+
string: "{\"merchant\":\"<TNS_MERCHANT_ID>\",\"session\":{\"id\":\"SESSION0002414369440E9534413G26\",\"updateStatus\":\"SUCCESS\",\"version\":\"1b64e1a902\"},\"sourceOfFunds\":{\"provided\":{\"card\":{\"brand\":\"AMEX\",\"expiry\":{\"month\":\"5\",\"year\":\"17\"},\"fundingMethod\":\"CREDIT\",\"number\":\"345678xxxxx4564\",\"scheme\":\"AMEX\",\"securityCode\":\"xxxx\"}},\"type\":\"CARD\"},\"version\":\"32\"}"
|
74
|
+
http_version:
|
75
|
+
recorded_at: Mon, 11 Jan 2016 23:51:05 GMT
|
76
|
+
- request:
|
77
|
+
method: put
|
78
|
+
uri: https://merchant.<TNS_MERCHANT_ID>:<TNS_API_KEY>@secure.ap.tnspayments.com/api/rest/version/32/merchant/<TNS_MERCHANT_ID>/order/10000001603/transaction/PAY
|
79
|
+
body:
|
80
|
+
string: "{\"apiOperation\":\"PAY\",\"order\":{\"amount\":\"100.00\",\"currency\":\"EUR\",\"reference\":\"PAY\"},\"transaction\":{\"reference\":\"PAY\"},\"sourceOfFunds\":{\"type\":\"CARD\"},\"session\":{\"id\":\"SESSION0002414369440E9534413G26\"}}"
|
81
|
+
headers:
|
82
|
+
Accept:
|
83
|
+
- "*/*"
|
84
|
+
Content-Length:
|
85
|
+
- "202"
|
86
|
+
Content-Type:
|
87
|
+
- Application/json;charset=UTF-8
|
88
|
+
Accept-Encoding:
|
89
|
+
- gzip, deflate
|
90
|
+
response:
|
91
|
+
status:
|
92
|
+
code: 201
|
93
|
+
message: Created
|
94
|
+
headers:
|
95
|
+
Content-Length:
|
96
|
+
- "1658"
|
97
|
+
Content-Type:
|
98
|
+
- application/json;charset=UTF-8
|
99
|
+
Date:
|
100
|
+
- Mon, 11 Jan 2016 23:51:05 GMT
|
101
|
+
Pragma:
|
102
|
+
- no-cache
|
103
|
+
Expires:
|
104
|
+
- "0"
|
105
|
+
Set-Cookie:
|
106
|
+
- TS018aacab=01c9ad79a05005d6ce0661f0ff61ffd29ca1e182415e883508eb3c057212ebcb105ce187bc; Path=/
|
107
|
+
Cache-Control:
|
108
|
+
- no-cache, no-store, must-revalidate
|
109
|
+
body:
|
110
|
+
string: "{\"authorizationResponse\":{\"posData\":\"1605S0100130\",\"transactionIdentifier\":\"AmexTidTest\"},\"gatewayEntryPoint\":\"AUTO\",\"merchant\":\"<TNS_MERCHANT_ID>\",\"order\":{\"amount\":100.00,\"creationTime\":\"2016-01-11T23:51:05.330Z\",\"currency\":\"EUR\",\"id\":\"10000001603\",\"reference\":\"PAY\",\"status\":\"CAPTURED\",\"totalAuthorizedAmount\":100.00,\"totalCapturedAmount\":100.00,\"totalRefundedAmount\":0.00},\"response\":{\"acquirerCode\":\"000\",\"acquirerMessage\":\"Successful request\",\"cardSecurityCode\":{\"acquirerCode\":\"N\",\"gatewayCode\":\"NO_MATCH\"},\"gatewayCode\":\"APPROVED\"},\"result\":\"SUCCESS\",\"risk\":{\"response\":{\"gatewayCode\":\"ACCEPTED\",\"review\":{\"decision\":\"NOT_REQUIRED\"},\"rule\":[{\"data\":\"345678\",\"name\":\"MERCHANT_BIN_RANGE\",\"recommendation\":\"NO_ACTION\",\"type\":\"MERCHANT_RULE\"},{\"data\":\"N\",\"name\":\"MERCHANT_CSC\",\"recommendation\":\"NO_ACTION\",\"type\":\"MERCHANT_RULE\"},{\"name\":\"SUSPECT_CARD_LIST\",\"recommendation\":\"NO_ACTION\",\"type\":\"MERCHANT_RULE\"},{\"name\":\"TRUSTED_CARD_LIST\",\"recommendation\":\"NO_ACTION\",\"type\":\"MERCHANT_RULE\"},{\"data\":\"345678\",\"name\":\"MSO_BIN_RANGE\",\"recommendation\":\"NO_ACTION\",\"type\":\"MSO_RULE\"},{\"data\":\"N\",\"name\":\"MSO_CSC\",\"recommendation\":\"NO_ACTION\",\"type\":\"MSO_RULE\"}]}},\"sourceOfFunds\":{\"provided\":{\"card\":{\"brand\":\"AMEX\",\"expiry\":{\"month\":\"5\",\"year\":\"17\"},\"fundingMethod\":\"CREDIT\",\"number\":\"345678xxxxx4564\",\"scheme\":\"AMEX\"}},\"type\":\"CARD\"},\"timeOfRecord\":\"2016-01-11T23:51:05.376Z\",\"transaction\":{\"acquirer\":{\"batch\":1,\"id\":\"AMEXGWS\",\"merchantId\":\"9442891578\"},\"amount\":100.00,\"authorizationCode\":\"029328\",\"currency\":\"EUR\",\"frequency\":\"SINGLE\",\"id\":\"PAY\",\"receipt\":\"16011171\",\"reference\":\"PAY\",\"source\":\"MOTO\",\"terminal\":\"31208585\",\"type\":\"CAPTURE\"},\"version\":\"32\"}"
|
111
|
+
http_version:
|
112
|
+
recorded_at: Mon, 11 Jan 2016 23:51:06 GMT
|