active_merchant_first_data 1.2.0 → 1.3.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 CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- MzZlZWJiMWY2MGY2YWJmZWFjM2U0MjAxMjkwNjY4MTFlM2E3MmY0Zg==
5
- data.tar.gz: !binary |-
6
- NTNiNmM3MzU2ZjEyZDIwYmFmM2FkZTE4NjU3NzdlZTIxNWU2MmEwOA==
2
+ SHA1:
3
+ metadata.gz: 7c847bdc7d68f8782735ac29421f2ad5ded03607
4
+ data.tar.gz: 552bb14ccf65b5310ebaeed6909da816d532895e
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- OGM2ODU3Y2VjMTkyZWVhMTA3NzUxNTcwOGU0ODkxYjA2YjE0N2U0OGE2ZWVl
10
- ZWQwMWZjYWZkMTY4YzczZGFmMDc1OWZkOWIwYjE1MjYwOTEzZTEwZTQ5ZTY0
11
- ZTgzZDZiZmQzMDIzYWFkZWY3YWUyM2U2ZTA1YzBmZThmNWVhMjM=
12
- data.tar.gz: !binary |-
13
- YWY1Y2JlMDBiYmQ2NTg5OTBkZDFjZGVjYTg5MWM4M2ZlYTRmYmEzMjRjZmUy
14
- ZDRjMDBjMGI4YjE2YmEzYWU5ZmZhNWZiZGRkZWY2N2MwMWVlMzhjYzRhNmE3
15
- ZGU2ZmVhMjExNWYzNWZkNDE3MjcwYjRlZmRjNzg1Y2FjNmFlNTI=
6
+ metadata.gz: 0c22fc2e61afb361f82ea6f501931d77c07d7f0187fef26899ddacf7b22d2147145fe1a77a57b5d739bc842b727cacd130e5e4585a6488d08f04124f20f48f2b
7
+ data.tar.gz: aef5468d0f9087c2c6e74acb6c49e1aa7445af9ba4a86e148dc4f9de448450d0e46c4bd9a90d2055fb25d6f91bb58c8a9af091c7dbc294713e49f2a9761ca477
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 1.3.0
2
+
3
+ * Response as an object instead of a hash (@Sacristan, #6)
4
+
1
5
  ## 1.2.0
2
6
 
3
7
  * Changed default currency from LVL to EUR
data/README.md CHANGED
@@ -13,10 +13,20 @@ $ gem install active_merchant_first_data
13
13
 
14
14
  ```ruby
15
15
  require "active_merchant_first_data"
16
- @gateway = ActiveMerchant::Billing::FirstDataGateway.new(
17
- :pem => "1234567_keystore.pem"
18
- :pem_password => "5x64jq8n234c"
16
+
17
+ gateway = ActiveMerchant::Billing::FirstDataGateway.new(
18
+ pem: "1234567_keystore.pem"
19
+ pem_password: "5x64jq8n234c"
19
20
  )
21
+
22
+ # Authorize for 10 euros (1000 euro cents)
23
+ response = gateway.authorize(1000, client_ip_addr: '127.0.0.1')
24
+
25
+ # Use this url to enter credit card data
26
+ gateway.redirect_url(response.authorization)
27
+
28
+ # Capture the money
29
+ gateway.capture(1000, response.authorization, client_ip_addr: '127.0.0.1')
20
30
  ```
21
31
 
22
32
  ## First Data test environment setup
@@ -24,7 +34,7 @@ require "active_merchant_first_data"
24
34
  1. Generate a new certificate
25
35
 
26
36
  ```bash
27
- $ openssl req -newkey rsa:1024 -keyout spec/certs/1234567_key.pem -out spec/certs/1234567_req.pem -subj "/C=lv/O=example.com/CN=1234567" -outform PEM
37
+ $ openssl req -newkey rsa:2048 -keyout spec/certs/1234567_key.pem -out spec/certs/1234567_req.pem -subj "/C=lv/O=example.com/CN=1234567" -outform PEM
28
38
  Enter PEM pass phrase: 81f174259v45
29
39
  ```
30
40
 
@@ -1,23 +1,7 @@
1
- require "active_merchant"
2
-
3
1
  module ActiveMerchant #:nodoc:
4
2
  module Billing #:nodoc:
5
3
  class FirstDataGateway < Gateway
6
- class_attribute :test_url, :live_url, :test_redirect_url, :live_redirect_url, :pem_file, :pem_password
7
-
8
- self.test_redirect_url = 'https://secureshop-test.firstdata.lv/ecomm/ClientHandler'
9
- self.live_redirect_url = 'https://secureshop.firstdata.lv/ecomm/ClientHandler'
10
-
11
- self.test_url = 'https://secureshop-test.firstdata.lv:8443/ecomm/MerchantHandler'
12
- self.live_url = 'https://secureshop.firstdata.lv:8443/ecomm/MerchantHandler'
13
-
14
- self.homepage_url = 'http://www.firstdata.lv/'
15
- self.display_name = 'First Data'
16
-
17
- self.ssl_strict = false
18
- self.default_currency = '978' # LVL (http://en.wikipedia.org/wiki/ISO_4217)
19
- self.money_format = :cents
20
-
4
+ # http://en.wikipedia.org/wiki/ISO_4217
21
5
  CURRENCY_CODES = {
22
6
  'ADP' => '020', 'AED' => '784', 'AFA' => '004', 'ALL' => '008', 'AMD' => '051',
23
7
  'ANG' => '532', 'AOA' => '973', 'ARS' => '032', 'AUD' => '036', 'AWG' => '533',
@@ -56,6 +40,21 @@ module ActiveMerchant #:nodoc:
56
40
  'ZMK' => '894', 'ZWD' => '716'
57
41
  }
58
42
 
43
+ class_attribute :test_url, :live_url, :test_redirect_url, :live_redirect_url, :pem_file, :pem_password
44
+
45
+ self.test_redirect_url = 'https://secureshop-test.firstdata.lv/ecomm/ClientHandler'
46
+ self.live_redirect_url = 'https://secureshop.firstdata.lv/ecomm/ClientHandler'
47
+
48
+ self.test_url = 'https://secureshop-test.firstdata.lv:8443/ecomm/MerchantHandler'
49
+ self.live_url = 'https://secureshop.firstdata.lv:8443/ecomm/MerchantHandler'
50
+
51
+ self.homepage_url = 'http://www.firstdata.lv/'
52
+ self.display_name = 'First Data'
53
+
54
+ self.ssl_strict = false
55
+ self.default_currency = CURRENCY_CODES['EUR']
56
+ self.money_format = :cents
57
+
59
58
  class Error < StandardError
60
59
  attr_reader :response
61
60
 
@@ -261,7 +260,6 @@ module ActiveMerchant #:nodoc:
261
260
  :command => :p,
262
261
  :amount => 0,
263
262
  :currency => default_currency,
264
- :msg_type => 'SMS',
265
263
  :msg_type => 'AUTH',
266
264
  :perspayee_gen => 1,
267
265
  :perspayee_overwrite => 1
@@ -287,7 +285,6 @@ module ActiveMerchant #:nodoc:
287
285
  end
288
286
 
289
287
  private
290
-
291
288
  def lookup_currency(params)
292
289
  params[:currency] = CURRENCY_CODES[params[:currency]] || params[:currency]
293
290
  end
@@ -307,7 +304,7 @@ module ActiveMerchant #:nodoc:
307
304
  # FIXME: test cases 17 and 19 return unnecessary error even when result and result_code are present
308
305
  # should be removed when this issue is fixed on gataway side
309
306
  raise Error.new(response) if !response[:error].blank? && response[:result_code].blank?
310
- response
307
+ ActiveMerchant::Billing::FirstDataResponse.new response
311
308
  end
312
309
 
313
310
  def post_data(params)
@@ -0,0 +1,148 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class FirstDataResponse < Response
4
+ RESPONSE_CODES = {
5
+ "000" => "Approved",
6
+ "001" => "Approved, honour with identification",
7
+ "002" => "Approved for partial amount",
8
+ "003" => "Approved for VIP",
9
+ "004" => "Approved, update track 3",
10
+ "005" => "Approved, account type specified by card issuer",
11
+ "006" => "Approved for partial amount, account type specified by card issuer",
12
+ "007" => "Approved, update ICC",
13
+ "100" => "Decline (general, no comments)",
14
+ "101" => "Decline, expired card",
15
+ "102" => "Decline, suspected fraud",
16
+ "103" => "Decline, card acceptor contact acquirer",
17
+ "104" => "Decline, restricted card",
18
+ "105" => "Decline, card acceptor call acquirer's security department",
19
+ "106" => "Decline, allowable PIN tries exceeded",
20
+ "107" => "Decline, refer to card issuer",
21
+ "108" => "Decline, refer to card issuer's special conditions",
22
+ "109" => "Decline, invalid merchant",
23
+ "110" => "Decline, invalid amount",
24
+ "111" => "Decline, invalid card number",
25
+ "112" => "Decline, PIN data required",
26
+ "113" => "Decline, unacceptable fee",
27
+ "114" => "Decline, no account of type requested",
28
+ "115" => "Decline, requested function not supported",
29
+ "116" => "Decline, not sufficient funds",
30
+ "117" => "Decline, incorrect PIN",
31
+ "118" => "Decline, no card record",
32
+ "119" => "Decline, transaction not permitted to cardholder",
33
+ "120" => "Decline, transaction not permitted to terminal",
34
+ "121" => "Decline, exceeds withdrawal amount limit",
35
+ "122" => "Decline, security violation",
36
+ "123" => "Decline, exceeds withdrawal frequency limit",
37
+ "124" => "Decline, violation of law",
38
+ "125" => "Decline, card not effective",
39
+ "126" => "Decline, invalid PIN block",
40
+ "127" => "Decline, PIN length error",
41
+ "128" => "Decline, PIN kay synch error",
42
+ "129" => "Decline, suspected counterfeit card",
43
+ "197" => "Declined, call AmEx",
44
+ "198" => "Declined, call Card Processing Centre",
45
+ "200" => "Pick-up (general, no comments)",
46
+ "201" => "Pick-up, expired card",
47
+ "202" => "Pick-up, suspected fraud",
48
+ "203" => "Pick-up, card acceptor contact card acquirer",
49
+ "204" => "Pick-up, restricted card",
50
+ "205" => "Pick-up, card acceptor call acquirer's security department",
51
+ "206" => "Pick-up, allowable PIN tries exceeded",
52
+ "207" => "Pick-up, special conditions",
53
+ "208" => "Pick-up, lost card",
54
+ "209" => "Pick-up, stolen card",
55
+ "210" => "Pick-up, suspected counterfeit card",
56
+ "300" => "Status message: file action successful",
57
+ "301" => "Status message: file action not supported by receiver",
58
+ "302" => "Status message: unable to locate record on file",
59
+ "303" => "Status message: duplicate record, old record replaced",
60
+ "304" => "Status message: file record field edit error",
61
+ "305" => "Status message: file locked out",
62
+ "306" => "Status message: file action not successful",
63
+ "307" => "Status message: file data format error",
64
+ "308" => "Status message: duplicate record, new record rejected",
65
+ "309" => "Status message: unknown file",
66
+ "400" => "Accepted (for reversal)",
67
+ "500" => "Status message: reconciled, in balance",
68
+ "501" => "Status message: reconciled, out of balance",
69
+ "502" => "Status message: amount not reconciled, totals provided",
70
+ "503" => "Status message: totals for reconciliation not available",
71
+ "504" => "Status message: not reconciled, totals provided",
72
+ "600" => "Accepted (for administrative info)",
73
+ "601" => "Status message: impossible to trace back original transaction",
74
+ "602" => "Status message: invalid transaction reference number",
75
+ "603" => "Status message: reference number/PAN incompatible",
76
+ "604" => "Status message: POS photograph is not available",
77
+ "605" => "Status message: requested item supplied",
78
+ "606" => "Status message: request cannot be fulfilled - required documentation is not available",
79
+ "700" => "Accepted (for fee collection)",
80
+ "800" => "Accepted (for network management)",
81
+ "900" => "Advice acknowledged, no financial liability accepted",
82
+ "901" => "Advice acknowledged, finansial liability accepted",
83
+ "902" => "Decline reason message: invalid transaction",
84
+ "903" => "Status message: re-enter transaction",
85
+ "904" => "Decline reason message: format error",
86
+ "905" => "Decline reason message: acqiurer not supported by switch",
87
+ "906" => "Decline reason message: cutover in process",
88
+ "907" => "Decline reason message: card issuer or switch inoperative",
89
+ "908" => "Decline reason message: transaction destination cannot be found for routing",
90
+ "909" => "Decline reason message: system malfunction",
91
+ "910" => "Decline reason message: card issuer signed off",
92
+ "911" => "Decline reason message: card issuer timed out",
93
+ "912" => "Decline reason message: card issuer unavailable",
94
+ "913" => "Decline reason message: duplicate transmission",
95
+ "914" => "Decline reason message: not able to trace back to original transaction",
96
+ "915" => "Decline reason message: reconciliation cutover or checkpoint error",
97
+ "916" => "Decline reason message: MAC incorrect",
98
+ "917" => "Decline reason message: MAC key sync error",
99
+ "918" => "Decline reason message: no communication keys available for use",
100
+ "919" => "Decline reason message: encryption key sync error",
101
+ "920" => "Decline reason message: security software/hardware error - try again",
102
+ "921" => "Decline reason message: security software/hardware error - no action",
103
+ "922" => "Decline reason message: message number out of sequence",
104
+ "923" => "Status message: request in progress",
105
+ "940" => "Decline, blocked by fraud filter",
106
+ "950" => "Decline reason message: violation of business arrangement"
107
+ }
108
+
109
+ attr_accessor :authorization, :error_code, :error_message, :success, :message
110
+
111
+ def initialize params, options={}
112
+ success = params[:result] == 'OK'
113
+ message = RESPONSE_CODES[params[:result_code]]
114
+
115
+ unless success
116
+ error_code = params[:result_code]
117
+ error_message = message
118
+ end
119
+
120
+ super success, message, params, options.merge(
121
+ authorization: params[:transaction_id]
122
+ )
123
+ end
124
+
125
+ def recurring?
126
+ recc_pmnt_id.present? && recc_pmnt_expiry.present?
127
+ end
128
+
129
+ [:recc_pmnt_expiry, :recc_pmnt_id, :result, :result_code, :transaction_id].each do |name|
130
+ define_method name do
131
+ params[name]
132
+ end
133
+ end
134
+
135
+ def _3d_secure
136
+ params[:'3dsecure']
137
+ end
138
+
139
+ def result_message
140
+ message
141
+ end
142
+
143
+ def [](value)
144
+ params[value]
145
+ end
146
+ end
147
+ end
148
+ end
@@ -1 +1,3 @@
1
+ require "active_merchant"
2
+ require "active_merchant/billing/first_data_response"
1
3
  require "active_merchant/billing/first_data_gateway"
metadata CHANGED
@@ -1,85 +1,85 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_merchant_first_data
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edgars Beigarts
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-16 00:00:00.000000000 Z
11
+ date: 2015-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- version_requirements: !ruby/object:Gem::Requirement
15
- requirements:
16
- - - ! '>='
17
- - !ruby/object:Gem::Version
18
- version: 1.15.0
19
14
  name: activemerchant
20
- type: :runtime
21
15
  requirement: !ruby/object:Gem::Requirement
22
16
  requirements:
23
- - - ! '>='
17
+ - - ">="
24
18
  - !ruby/object:Gem::Version
25
19
  version: 1.15.0
20
+ type: :runtime
26
21
  prerelease: false
27
- - !ruby/object:Gem::Dependency
28
22
  version_requirements: !ruby/object:Gem::Requirement
29
23
  requirements:
30
- - - ! '>='
24
+ - - ">="
31
25
  - !ruby/object:Gem::Version
32
- version: '0'
26
+ version: 1.15.0
27
+ - !ruby/object:Gem::Dependency
33
28
  name: rake
34
- type: :development
35
29
  requirement: !ruby/object:Gem::Requirement
36
30
  requirements:
37
- - - ! '>='
31
+ - - ">="
38
32
  - !ruby/object:Gem::Version
39
33
  version: '0'
34
+ type: :development
40
35
  prerelease: false
41
- - !ruby/object:Gem::Dependency
42
36
  version_requirements: !ruby/object:Gem::Requirement
43
37
  requirements:
44
- - - ~>
38
+ - - ">="
45
39
  - !ruby/object:Gem::Version
46
- version: '2.10'
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
47
42
  name: rspec
48
- type: :development
49
43
  requirement: !ruby/object:Gem::Requirement
50
44
  requirements:
51
- - - ~>
45
+ - - "~>"
52
46
  - !ruby/object:Gem::Version
53
- version: '2.10'
47
+ version: '3.2'
48
+ type: :development
54
49
  prerelease: false
55
- - !ruby/object:Gem::Dependency
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
51
  requirements:
58
- - - ~>
52
+ - - "~>"
59
53
  - !ruby/object:Gem::Version
60
- version: '1.11'
54
+ version: '3.2'
55
+ - !ruby/object:Gem::Dependency
61
56
  name: vcr
62
- type: :development
63
57
  requirement: !ruby/object:Gem::Requirement
64
58
  requirements:
65
- - - ~>
59
+ - - "~>"
66
60
  - !ruby/object:Gem::Version
67
61
  version: '1.11'
62
+ type: :development
68
63
  prerelease: false
69
- - !ruby/object:Gem::Dependency
70
64
  version_requirements: !ruby/object:Gem::Requirement
71
65
  requirements:
72
- - - ~>
66
+ - - "~>"
73
67
  - !ruby/object:Gem::Version
74
- version: '1.3'
68
+ version: '1.11'
69
+ - !ruby/object:Gem::Dependency
75
70
  name: fakeweb
76
- type: :development
77
71
  requirement: !ruby/object:Gem::Requirement
78
72
  requirements:
79
- - - ~>
73
+ - - "~>"
80
74
  - !ruby/object:Gem::Version
81
75
  version: '1.3'
76
+ type: :development
82
77
  prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.3'
83
83
  description: First Data Latvia gateway for Active Merchant
84
84
  email:
85
85
  - edgars.beigarts@makit.lv
@@ -87,11 +87,12 @@ executables: []
87
87
  extensions: []
88
88
  extra_rdoc_files: []
89
89
  files:
90
- - lib/active_merchant/billing/first_data_gateway.rb
91
- - lib/active_merchant_first_data.rb
92
- - README.md
93
90
  - CHANGELOG.md
94
91
  - LICENSE
92
+ - README.md
93
+ - lib/active_merchant/billing/first_data_gateway.rb
94
+ - lib/active_merchant/billing/first_data_response.rb
95
+ - lib/active_merchant_first_data.rb
95
96
  homepage: https://github.com/ebeigarts/active_merchant_first_data
96
97
  licenses: []
97
98
  metadata: {}
@@ -101,17 +102,17 @@ require_paths:
101
102
  - lib
102
103
  required_ruby_version: !ruby/object:Gem::Requirement
103
104
  requirements:
104
- - - ! '>='
105
+ - - ">="
105
106
  - !ruby/object:Gem::Version
106
107
  version: '0'
107
108
  required_rubygems_version: !ruby/object:Gem::Requirement
108
109
  requirements:
109
- - - ! '>='
110
+ - - ">="
110
111
  - !ruby/object:Gem::Version
111
112
  version: '0'
112
113
  requirements: []
113
114
  rubyforge_project:
114
- rubygems_version: 2.1.11
115
+ rubygems_version: 2.4.5
115
116
  signing_key:
116
117
  specification_version: 4
117
118
  summary: First Data Latvia gateway for Active Merchant