tns_payments 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
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