tns_payments 0.0.5 → 0.0.6

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.
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 0.0.6 / 2012-04-02
4
+
5
+ * 3D Secure
6
+
3
7
  ## 0.0.5 / 2012-03-29
4
8
 
5
9
  * Tokenize credit card.
@@ -4,8 +4,7 @@ module TNSPayments
4
4
  class Connection
5
5
  CREDIT_CARD_TOKEN_FORMAT = /^9\d{15}/
6
6
 
7
- attr_accessor :host
8
- attr_reader :api_key, :merchant_id
7
+ attr_accessor :api_key, :host, :merchant_id
9
8
  attr_writer :session_token
10
9
 
11
10
  def available?
@@ -13,9 +12,8 @@ module TNSPayments
13
12
  end
14
13
 
15
14
  def initialize options
16
- @api_key = options[:api_key]
17
- @merchant_id = options[:merchant_id]
18
- self.host = options.fetch(:host) { 'https://secure.ap.tnspayments.com' }
15
+ self.api_key, self.merchant_id = options[:api_key], options[:merchant_id]
16
+ self.host = options.fetch(:host) { 'https://secure.ap.tnspayments.com' }
19
17
  end
20
18
 
21
19
  def payment_form_url
@@ -65,6 +63,26 @@ module TNSPayments
65
63
  end
66
64
  end
67
65
 
66
+ def check_enrollment transaction, token, postback_url
67
+ params = {
68
+ '3DSecure' => {'authenticationRedirect' => {'pageGenerationMode' => 'CUSTOMIZED', 'responseUrl' => postback_url}},
69
+ 'apiOperation' => 'CHECK_3DS_ENROLLMENT',
70
+ 'cardDetails' => card_details(token),
71
+ 'transaction' => {'amount' => transaction.amount.to_s, 'currency' => transaction.currency}
72
+ }
73
+
74
+ request :put, "/merchant/#{merchant_id}/3DSecureId/#{transaction.three_domain_id}", params
75
+ end
76
+
77
+ def process_acs_result three_domain_id, pa_res
78
+ params = {
79
+ '3DSecure' => {'paRes' => pa_res},
80
+ 'apiOperation' => 'PROCESS_ACS_RESULT'
81
+ }
82
+
83
+ request :post, "/merchant/#{merchant_id}/3DSecureId/#{three_domain_id}", params
84
+ end
85
+
68
86
  private
69
87
 
70
88
  def card_details token
@@ -30,4 +30,4 @@ module TNSPayments
30
30
  'Basic ' + Base64.encode64(":#{connection.api_key}")
31
31
  end
32
32
  end
33
- end
33
+ end
@@ -1,3 +1,3 @@
1
1
  module TNSPayments
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
@@ -3,9 +3,7 @@ require 'webmock/minitest'
3
3
 
4
4
  class TNSPayments::ConnectionTest < MiniTest::Unit::TestCase
5
5
  def setup
6
- @api_key = '123api456'
7
- @merchant_id = 'MERCHANT'
8
- @gateway = Connection.new :api_key => @api_key, :merchant_id => @merchant_id
6
+ @gateway = Connection.new :api_key => '123api456', :merchant_id => 'MERCHANT'
9
7
  end
10
8
 
11
9
  def test_available_is_true_when_tns_gateway_is_operating
@@ -102,6 +100,27 @@ class TNSPayments::ConnectionTest < MiniTest::Unit::TestCase
102
100
  end
103
101
  end
104
102
 
103
+ def test_successful_check_enrollment_request_returns_card_enrolled
104
+ transaction = mock_transaction
105
+ transaction.expect :three_domain_id, 'randomstring'
106
+ stub_successful_session_token_request
107
+ token = @gateway.session_token
108
+ stub_successful_check_enrollment_request transaction, token, 'http://google.com/'
109
+ response = @gateway.check_enrollment transaction, token, 'http://google.com/'
110
+ assert_equal 'CARD_ENROLLED', response.response['response']['3DSecure']['gatewayCode']
111
+ end
112
+
113
+ def test_successful_process_acs_result_request_returns_authorized
114
+ # transaction = mock_transaction
115
+ # transaction.expect :three_domain_id, 'randomstring'
116
+ # stub_successful_session_token_request
117
+ # token = @gateway.session_token
118
+
119
+ stub_successful_process_acs_result_request 'three_domain_id', 'pa_res'
120
+ response = @gateway.process_acs_result 'three_domain_id', 'pa_res'
121
+ assert_equal 'AUTHENTICATION_SUCCESSFUL', response.response['response']['3DSecure']['gatewayCode']
122
+ end
123
+
105
124
  private
106
125
 
107
126
  def stub_availability_request
@@ -112,7 +131,7 @@ private
112
131
  def stub_successful_refund_request transaction
113
132
  stub_refund_request(transaction).
114
133
  to_return :status => 200, :headers => {}, :body => <<-EOS
115
- {"merchant":"#{@merchant_id}","order":{"id":#{transaction.order_id},"totalAuthorizedAmount":0.00,"totalCapturedAmount":0.00,"totalRefundedAmount":0.00},
134
+ {"merchant":"#{@gateway.merchant_id}","order":{"id":#{transaction.order_id},"totalAuthorizedAmount":0.00,"totalCapturedAmount":0.00,"totalRefundedAmount":0.00},
116
135
  "response":{"acquirerCode":"00","gatewayCode":"APPROVED"},"result":"SUCCESS","transaction":{"acquirer":{"id":"STGEORGE"},
117
136
  "amount":#{transaction.amount},"authorizationCode":"000582","batch":20110707,"currency":"AUD","id":"#{transaction.transaction_id}",
118
137
  "receipt":"110707000582","source":"INTERNET","terminal":"08845778","type":"REFUND"}}
@@ -170,7 +189,7 @@ private
170
189
  end
171
190
 
172
191
  def stub_session_token_request
173
- stub_request(:post, /https:\/\/:#{@api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@merchant_id}\/session/).
192
+ stub_request(:post, /https:\/\/:#{@gateway.api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@gateway.merchant_id}\/session/).
174
193
  with :headers => {
175
194
  'Accept' => '*/*',
176
195
  'Accept-Encoding' => 'gzip, deflate',
@@ -180,7 +199,7 @@ private
180
199
  end
181
200
 
182
201
  def stub_session_token_purchase_request transaction, token
183
- stub_request(:put, /https:\/\/:#{@api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@merchant_id}\/order\/#{transaction.order_id}\/transaction\/#{transaction.transaction_id}/).
202
+ stub_request(:put, /https:\/\/:#{@gateway.api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@gateway.merchant_id}\/order\/#{transaction.order_id}\/transaction\/#{transaction.transaction_id}/).
184
203
  with :body => JSON.generate({
185
204
  'apiOperation' => 'PAY',
186
205
  'order' => {'reference' => transaction.reference.to_s},
@@ -196,7 +215,7 @@ private
196
215
  end
197
216
 
198
217
  def stub_credit_card_token_purchase_request transaction, token
199
- stub_request(:put, /https:\/\/:#{@api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@merchant_id}\/order\/#{transaction.order_id}\/transaction\/#{transaction.transaction_id}/).
218
+ stub_request(:put, /https:\/\/:#{@gateway.api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@gateway.merchant_id}\/order\/#{transaction.order_id}\/transaction\/#{transaction.transaction_id}/).
200
219
  with :body => JSON.generate({
201
220
  'apiOperation' => 'PAY',
202
221
  'order' => {'reference' => transaction.reference.to_s},
@@ -212,7 +231,7 @@ private
212
231
  end
213
232
 
214
233
  def stub_refund_request transaction
215
- stub_request(:put, /https:\/\/:#{@api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@merchant_id}\/order\/#{transaction.order_id}\/transaction\/#{transaction.transaction_id}/).
234
+ stub_request(:put, /https:\/\/:#{@gateway.api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@gateway.merchant_id}\/order\/#{transaction.order_id}\/transaction\/#{transaction.transaction_id}/).
216
235
  with :body => JSON.generate({
217
236
  'apiOperation' => 'REFUND',
218
237
  'transaction' => {'amount' => transaction.amount.to_s, 'currency' => transaction.currency, 'reference' => transaction.transaction_id.to_s}
@@ -226,7 +245,7 @@ private
226
245
  end
227
246
 
228
247
  def stub_create_credit_card_token_request token
229
- stub_request(:post, /https:\/\/:#{@api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@merchant_id}\/token/).
248
+ stub_request(:post, /https:\/\/:#{@gateway.api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@gateway.merchant_id}\/token/).
230
249
  with :body => JSON.generate({
231
250
  'cardDetails' => {'session' => token}
232
251
  }),
@@ -237,7 +256,7 @@ private
237
256
  end
238
257
 
239
258
  def stub_delete_credit_card_token_request token
240
- stub_request(:delete, /https:\/\/:#{@api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@merchant_id}\/token\/#{token}/).
259
+ stub_request(:delete, /https:\/\/:#{@gateway.api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@gateway.merchant_id}\/token\/#{token}/).
241
260
  with :body => {},
242
261
  :headers => {
243
262
  'Accept' => '*/*',
@@ -245,6 +264,38 @@ private
245
264
  }
246
265
  end
247
266
 
267
+ def stub_successful_check_enrollment_request transaction, token, postback_url
268
+ stub_request(:put, /https:\/\/:#{@gateway.api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@gateway.merchant_id}\/3DSecureId\/#{transaction.three_domain_id}/).
269
+ with(:body => JSON.generate({
270
+ '3DSecure' => {'authenticationRedirect' => {'pageGenerationMode' => 'CUSTOMIZED', 'responseUrl' => postback_url}},
271
+ 'apiOperation' => 'CHECK_3DS_ENROLLMENT',
272
+ 'cardDetails' => {'session' => token},
273
+ 'transaction' => {'amount' => transaction.amount.to_s, 'currency' => transaction.currency}
274
+ }),
275
+ :headers => {
276
+ 'Accept' => '*/*',
277
+ 'Accept-Encoding' => 'gzip, deflate',
278
+ 'Content-Length' => '237',
279
+ 'Content-Type' => 'Application/json;charset=UTF-8'
280
+ }).
281
+ to_return :status => 200, :headers => {}, :body => "{\"3DSecure\":{\"authenticationRedirect\":{\"customized\":{\"acsUrl\":\"https://secure.ap.tnspayments.com:443/acs/MastercardACS/4272b87b-2cc0-4232-a96e-e678ecbe7455\",\"paReq\":\"eAFVkd1ugkAQhe9NfAfCfV1ghVIzrNFq1aY/pNqY9I7AKCQCukILfZ2+SZ+sswq1vePMcGbPfAPDKt1p7yiPSZ55utkzdA2zMI+SbOvpr6u7K1cfim4HVrFEnCwxLCUKeMTjMdiilkSezrlpmJbh6gL80QseBDTjBE3rWcBaSS4ZxkFWCAjCw3jxJGyLG44NrJGQolxMhGnxvu1cu8DOGrIgRTGlMXUU1NocZa49FBGwUx3CvMwKWQvXcoC1Akq5E3FR7AeMITnJGJOvF+YpMNUDdknjlyrXkfaqkkg8R9HmrZotNx8pn8b17HNdGfexX64nfQ+Y+gOioEBhqa25aWsWH3BnYFPeUx2CVCUSs7GvfX8RA4MWPJdgr14anYWpGn8LQGwlwW9XaRVgtc8zpJEE8/cb2CX27VwhDQuCZ7f0bige7xOSpqGmJITJ5AYRbwQwZWXN3QjJ6axU+XfubucHAPGz0w==\"}},\"summaryStatus\":\"CARD_ENROLLED\",\"xid\":\"OddfZxGSfwm3EhyGzWx0JhPuWD4=\"},\"3DSecureId\":\"#{transaction.three_domain_id}\",\"merchant\":\"#{@gateway.merchant_id}\",\"response\":{\"3DSecure\":{\"gatewayCode\":\"CARD_ENROLLED\"}}}"
282
+ end
283
+
284
+ def stub_successful_process_acs_result_request three_domain_id, pa_res
285
+ stub_request(:post, /https:\/\/:#{@gateway.api_key}@secure\.ap\.tnspayments\.com\/api\/rest\/version\/4\/merchant\/#{@gateway.merchant_id}\/3DSecureId\/#{three_domain_id}/).
286
+ with(:body => JSON.generate({
287
+ '3DSecure' => {'paRes' => pa_res},
288
+ 'apiOperation' => 'PROCESS_ACS_RESULT'
289
+ }),
290
+ :headers => {
291
+ 'Accept' => '*/*',
292
+ 'Accept-Encoding' => 'gzip, deflate',
293
+ 'Content-Length' => '67',
294
+ 'Content-Type' => 'Application/json;charset=UTF-8'
295
+ }).
296
+ to_return :status => 200, :headers => {}, :body => "{\"response\":{\"3DSecure\":{\"gatewayCode\":\"AUTHENTICATION_SUCCESSFUL\"}}}"
297
+ end
298
+
248
299
  def mock_transaction
249
300
  mock = MiniTest::Mock.new
250
301
  mock.expect :amount, 100
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tns_payments
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 5
10
- version: 0.0.5
9
+ - 6
10
+ version: 0.0.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Tim Cooper
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-03-29 00:00:00 +10:00
18
+ date: 2012-04-02 00:00:00 +10:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency