activemerchant 1.50.0 → 1.51.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.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +39 -0
  3. data/README.md +6 -5
  4. data/lib/active_merchant/billing/credit_card.rb +22 -6
  5. data/lib/active_merchant/billing/gateway.rb +15 -1
  6. data/lib/active_merchant/billing/gateways/authorize_net.rb +413 -127
  7. data/lib/active_merchant/billing/gateways/banwire.rb +2 -2
  8. data/lib/active_merchant/billing/gateways/braintree_blue.rb +4 -0
  9. data/lib/active_merchant/billing/gateways/card_stream.rb +18 -0
  10. data/lib/active_merchant/billing/gateways/cenpos.rb +6 -2
  11. data/lib/active_merchant/billing/gateways/checkout.rb +4 -6
  12. data/lib/active_merchant/billing/gateways/checkout_v2.rb +200 -0
  13. data/lib/active_merchant/billing/gateways/cyber_source.rb +19 -1
  14. data/lib/active_merchant/billing/gateways/dibs.rb +1 -1
  15. data/lib/active_merchant/billing/gateways/epay.rb +1 -1
  16. data/lib/active_merchant/billing/gateways/eway_rapid.rb +5 -5
  17. data/lib/active_merchant/billing/gateways/firstdata_e4.rb +4 -1
  18. data/lib/active_merchant/billing/gateways/garanti.rb +5 -1
  19. data/lib/active_merchant/billing/gateways/iats_payments.rb +29 -3
  20. data/lib/active_merchant/billing/gateways/litle.rb +12 -0
  21. data/lib/active_merchant/billing/gateways/paystation.rb +19 -23
  22. data/lib/active_merchant/billing/gateways/payu_in.rb +4 -0
  23. data/lib/active_merchant/billing/gateways/redsys.rb +4 -3
  24. data/lib/active_merchant/billing/gateways/s5.rb +3 -3
  25. data/lib/active_merchant/billing/gateways/sage.rb +8 -10
  26. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +7 -5
  27. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +3 -2
  28. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +0 -5
  29. data/lib/active_merchant/billing/gateways/stripe.rb +33 -4
  30. data/lib/active_merchant/billing/gateways/wepay.rb +13 -6
  31. data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +1 -2
  32. data/lib/active_merchant/version.rb +1 -1
  33. metadata +3 -2
@@ -35,11 +35,11 @@ module ActiveMerchant #:nodoc:
35
35
  def add_customer_data(post, options)
36
36
  post[:user] = @options[:login]
37
37
  post[:phone] = options[:billing_address][:phone]
38
- post[:mail] = options[:email]
38
+ post[:mail] = options[:email] || "unspecified@email.com"
39
39
  end
40
40
 
41
41
  def add_order_data(post, options)
42
- post[:reference] = options[:order_id]
42
+ post[:reference] = options[:order_id] || generate_unique_id
43
43
  post[:concept] = options[:description]
44
44
  end
45
45
 
@@ -169,6 +169,10 @@ module ActiveMerchant #:nodoc:
169
169
  end
170
170
  alias_method :delete, :unstore
171
171
 
172
+ def supports_network_tokenization?
173
+ true
174
+ end
175
+
172
176
  private
173
177
 
174
178
  def check_customer_exists(customer_vault_id)
@@ -109,6 +109,24 @@ module ActiveMerchant #:nodoc:
109
109
  commit('REFUND', post)
110
110
  end
111
111
 
112
+ def verify(creditcard, options={})
113
+ MultiResponse.run(:use_first_response) do |r|
114
+ r.process { authorize(100, creditcard, options) }
115
+ r.process(:ignore_result) { void(r.authorization, options) }
116
+ end
117
+ end
118
+
119
+ def supports_scrubbing?
120
+ true
121
+ end
122
+
123
+ def scrub(transcript)
124
+ transcript.
125
+ gsub(%r((Authorization: Basic )\w+), '\1[FILTERED]').
126
+ gsub(%r((cardNumber=)\d+), '\1[FILTERED]').
127
+ gsub(%r((CVV=)\d+), '\1[FILTERED]')
128
+ end
129
+
112
130
  private
113
131
 
114
132
  def add_amount(post, money, options)
@@ -49,6 +49,7 @@ module ActiveMerchant #:nodoc:
49
49
  post = {}
50
50
  add_void_required_elements(post)
51
51
  add_reference(post, authorization)
52
+ add_remembered_amount(post, authorization)
52
53
  add_tax(post, options)
53
54
 
54
55
  commit("Void", post)
@@ -130,10 +131,13 @@ module ActiveMerchant #:nodoc:
130
131
  end
131
132
 
132
133
  def add_reference(post, authorization)
133
- reference_number, last_four_digits, original_amount = split_authorization(authorization)
134
+ reference_number, last_four_digits = split_authorization(authorization)
134
135
  post[:ReferenceNumber] = reference_number
135
136
  post[:CardLastFourDigits] = last_four_digits
136
- post[:Amount] = original_amount
137
+ end
138
+
139
+ def add_remembered_amount(post, authorization)
140
+ post[:Amount] = split_authorization(authorization).last
137
141
  end
138
142
 
139
143
  def commit(action, post)
@@ -31,12 +31,10 @@ module ActiveMerchant #:nodoc:
31
31
  end
32
32
 
33
33
  def purchase(amount, payment_method, options)
34
- requires!(options, :order_id)
35
-
36
34
  commit('purchase', amount, options) do |xml|
37
35
  add_credentials(xml, options)
38
36
  add_invoice(xml, amount, options)
39
- add_track_id(xml, options[:order_id])
37
+ add_track_id(xml, options[:order_id] || generate_unique_id)
40
38
  add_payment_method(xml, payment_method)
41
39
  add_billing_info(xml, options)
42
40
  add_shipping_info(xml, options)
@@ -46,12 +44,10 @@ module ActiveMerchant #:nodoc:
46
44
  end
47
45
 
48
46
  def authorize(amount, payment_method, options)
49
- requires!(options, :order_id)
50
-
51
47
  commit('authorize', amount, options) do |xml|
52
48
  add_credentials(xml, options)
53
49
  add_invoice(xml, amount, options)
54
- add_track_id(xml, options[:order_id])
50
+ add_track_id(xml, options[:order_id] || generate_unique_id)
55
51
  add_payment_method(xml, payment_method)
56
52
  add_billing_info(xml, options)
57
53
  add_shipping_info(xml, options)
@@ -151,6 +147,8 @@ module ActiveMerchant #:nodoc:
151
147
  xml.bill_email_ options[:email]
152
148
  xml.bill_customerip_ options[:ip]
153
149
  xml.merchantcustomerid_ options[:customer]
150
+ xml.descriptor_name options[:descriptor_name]
151
+ xml.descriptor_city options[:descriptor_city]
154
152
  end
155
153
 
156
154
  def add_reference(xml, authorization)
@@ -0,0 +1,200 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class CheckoutV2Gateway < Gateway
4
+ self.display_name = "Checkout.com V2 Gateway"
5
+ self.homepage_url = "https://www.checkout.com/"
6
+ self.test_url = "https://api2.checkout.com/v2"
7
+ self.live_url = "http://sandbox.checkout.com/api2/v2"
8
+
9
+ self.supported_countries = ['AT', 'BE', 'BG', 'CY', 'CZ', 'DE', 'DK', 'EE', 'ES', 'FI', 'FR', 'GR', 'HR', 'HU', 'IE', 'IS', 'IT', 'LI', 'LT', 'LU', 'LV', 'MT', 'MU', 'NL', 'NO', 'PL', 'PT', 'RO', 'SE', 'SI', 'SK', 'US']
10
+ self.default_currency = "USD"
11
+ self.money_format = :cents
12
+ self.supported_cardtypes = [:visa, :master, :american_express, :diners_club]
13
+
14
+ def initialize(options={})
15
+ requires!(options, :secret_key)
16
+ super
17
+ end
18
+
19
+ def purchase(amount, payment_method, options={})
20
+ MultiResponse.run do |r|
21
+ r.process { authorize(amount, payment_method, options) }
22
+ r.process { capture(amount, r.authorization, options) }
23
+ end
24
+ end
25
+
26
+ def authorize(amount, payment_method, options={})
27
+ post = {}
28
+ post[:autoCapture] = "n"
29
+ add_invoice(post, amount, options)
30
+ add_payment_method(post, payment_method)
31
+ add_customer_data(post, options)
32
+
33
+ commit(:authorize, post)
34
+ end
35
+
36
+ def capture(amount, authorization, options={})
37
+ post = {}
38
+ add_invoice(post, amount, options)
39
+ add_customer_data(post, options)
40
+
41
+ commit(:capture, post, authorization)
42
+ end
43
+
44
+ def void(authorization, options={})
45
+ post = {}
46
+ commit(:void, post, authorization)
47
+ end
48
+
49
+ def refund(amount, authorization, options={})
50
+ post = {}
51
+ add_invoice(post, amount, options)
52
+ add_customer_data(post, options)
53
+
54
+ commit(:refund, post, authorization)
55
+ end
56
+
57
+ def verify(credit_card, options={})
58
+ MultiResponse.run(:use_first_response) do |r|
59
+ r.process { authorize(100, credit_card, options) }
60
+ r.process(:ignore_result) { void(r.authorization, options) }
61
+ end
62
+ end
63
+
64
+ def supports_scrubbing?
65
+ true
66
+ end
67
+
68
+ def scrub(transcript)
69
+ transcript.
70
+ gsub(%r((Authorization: )[^\\]*)i, '\1[FILTERED]').
71
+ gsub(%r(("number\\":\\")\d+), '\1[FILTERED]').
72
+ gsub(%r(("cvv\\":\\")\d+), '\1[FILTERED]')
73
+ end
74
+
75
+ private
76
+
77
+ def add_invoice(post, money, options)
78
+ post[:value] = amount(money)
79
+ post[:trackId] = options[:order_id]
80
+ post[:currency] = options[:currency] || currency(money)
81
+ end
82
+
83
+ def add_payment_method(post, payment_method)
84
+ post[:card] = {}
85
+ post[:card][:name] = payment_method.name
86
+ post[:card][:number] = payment_method.number
87
+ post[:card][:cvv] = payment_method.verification_value
88
+ post[:card][:expiryYear] = format(payment_method.year, :four_digits)
89
+ post[:card][:expiryMonth] = format(payment_method.month, :two_digits)
90
+ end
91
+
92
+ def add_customer_data(post, options)
93
+ post[:email] = options[:email] || "unspecified@example.com"
94
+ address = options[:billing_address]
95
+ if(address && post[:card])
96
+ post[:card][:billingDetails] = {}
97
+ post[:card][:billingDetails][:address1] = address[:address1]
98
+ post[:card][:billingDetails][:address2] = address[:address2]
99
+ post[:card][:billingDetails][:city] = address[:city]
100
+ post[:card][:billingDetails][:state] = address[:state]
101
+ post[:card][:billingDetails][:country] = address[:country]
102
+ post[:card][:billingDetails][:postcode] = address[:zip]
103
+ post[:card][:billingDetails][:phone] = { number: address[:phone] }
104
+ end
105
+ end
106
+
107
+ def commit(action, post, authorization = nil)
108
+ begin
109
+ raw_response = ssl_post(url(post, action, authorization), post.to_json, headers)
110
+ response = parse(raw_response)
111
+ rescue ResponseError => e
112
+ raise unless(e.response.code.to_s =~ /4\d\d/)
113
+ response = parse(e.response.body)
114
+ end
115
+
116
+ succeeded = success_from(response)
117
+ Response.new(
118
+ succeeded,
119
+ message_from(succeeded, response),
120
+ response,
121
+ authorization: authorization_from(response),
122
+ error_code: error_code_from(succeeded, response),
123
+ test: test?,
124
+ avs_result: avs_result(action, response),
125
+ cvv_result: cvv_result(action, response))
126
+ end
127
+
128
+ def headers
129
+ {
130
+ "Authorization" => @options[:secret_key],
131
+ "Content-Type" => "application/json;charset=UTF-8"
132
+ }
133
+ end
134
+
135
+ def url(post, action, authorization)
136
+ if action == :authorize
137
+ "#{base_url}/charges/card"
138
+ else
139
+ "#{base_url}/charges/#{authorization}/#{action}"
140
+ end
141
+ end
142
+
143
+ def base_url
144
+ test? ? test_url : live_url
145
+ end
146
+
147
+ def avs_result(action, response)
148
+ action == :purchase ? AVSResult.new(code: response["card"]["avsCheck"]) : nil
149
+ end
150
+
151
+ def cvv_result(action, response)
152
+ action == :purchase ? CVVResult.new(response["card"]["cvvCheck"]) : nil
153
+ end
154
+
155
+ def parse(body)
156
+ JSON.parse(body)
157
+ rescue JSON::ParserError
158
+ {
159
+ "message" => "Invalid JSON response received from CheckoutV2Gateway. Please contact CheckoutV2Gateway if you continue to receive this message.",
160
+ "raw_response" => scrub(body)
161
+ }
162
+ end
163
+
164
+ def success_from(response)
165
+ response["responseCode"] == ("10000" || "10100")
166
+ end
167
+
168
+ def message_from(succeeded, response)
169
+ if succeeded
170
+ "Succeeded"
171
+ elsif response["errors"]
172
+ response["message"] + ": " + response["errors"].first
173
+ else
174
+ response["responseMessage"] || response["message"] || "Unable to read error message"
175
+ end
176
+ end
177
+
178
+ STANDARD_ERROR_CODE_MAPPING = {
179
+ "20014" => STANDARD_ERROR_CODE[:invalid_number],
180
+ "20100" => STANDARD_ERROR_CODE[:invalid_expiry_date],
181
+ "20054" => STANDARD_ERROR_CODE[:expired_card],
182
+ "40104" => STANDARD_ERROR_CODE[:incorrect_cvc],
183
+ "40108" => STANDARD_ERROR_CODE[:incorrect_zip],
184
+ "40111" => STANDARD_ERROR_CODE[:incorrect_address],
185
+ "20005" => STANDARD_ERROR_CODE[:card_declined],
186
+ "20088" => STANDARD_ERROR_CODE[:processing_error],
187
+ "20001" => STANDARD_ERROR_CODE[:call_issuer],
188
+ "30004" => STANDARD_ERROR_CODE[:pickup_card]
189
+ }
190
+
191
+ def authorization_from(raw)
192
+ raw["id"]
193
+ end
194
+
195
+ def error_code_from(succeeded, response)
196
+ succeeded ? nil : STANDARD_ERROR_CODE_MAPPING[response["responseCode"]]
197
+ end
198
+ end
199
+ end
200
+ end
@@ -27,7 +27,7 @@ module ActiveMerchant #:nodoc:
27
27
  # * To process pinless debit cards through the pinless debit card
28
28
  # network, your Cybersource merchant account must accept pinless
29
29
  # debit card payments.
30
- # * The order of the XML elements does matter, make sure to follow the order in
30
+ # * The order of the XML elements does matter, make sure to follow the order in
31
31
  # the documentation exactly.
32
32
  class CyberSourceGateway < Gateway
33
33
  self.test_url = 'https://ics2wstest.ic3.com/commerce/1.x/transactionProcessor'
@@ -231,6 +231,24 @@ module ActiveMerchant #:nodoc:
231
231
  commit(build_validate_pinless_debit_request(creditcard,options), options)
232
232
  end
233
233
 
234
+ def supports_scrubbing?
235
+ true
236
+ end
237
+
238
+ def scrub(transcript)
239
+ transcript.
240
+ gsub(%r((<wsse:Password [^>]*>)[^<]*(</wsse:Password>))i, '\1[FILTERED]\2').
241
+ gsub(%r((<accountNumber>)[^<]*(</accountNumber>))i, '\1[FILTERED]\2').
242
+ gsub(%r((<cvNumber>)[^<]*(</cvNumber>))i, '\1[FILTERED]\2').
243
+ gsub(%r((<cavv>)[^<]*(</cavv>))i, '\1[FILTERED]\2').
244
+ gsub(%r((<xid>)[^<]*(</xid>))i, '\1[FILTERED]\2').
245
+ gsub(%r((<authenticationData>)[^<]*(</authenticationData>))i, '\1[FILTERED]\2')
246
+ end
247
+
248
+ def supports_network_tokenization?
249
+ true
250
+ end
251
+
234
252
  private
235
253
 
236
254
  # Create all address hash key value pairs so that we still function if we
@@ -108,7 +108,7 @@ module ActiveMerchant #:nodoc:
108
108
 
109
109
  def add_payment_method(post, payment_method, options)
110
110
  post[:cardNumber] = payment_method.number
111
- post[:cvc] = payment_method.verification_value
111
+ post[:cvc] = payment_method.verification_value if payment_method.verification_value
112
112
  post[:expYear] = format(payment_method.year, :two_digits)
113
113
  post[:expMonth] = payment_method.month
114
114
 
@@ -186,7 +186,7 @@ module ActiveMerchant #:nodoc:
186
186
  # Authorize gives the response back by redirecting with the values in
187
187
  # the URL query
188
188
  if location = response['Location']
189
- query = CGI::parse(URI.parse(location.gsub(' ', '%20')).query)
189
+ query = CGI::parse(URI.parse(location.gsub(' ', '%20').gsub('<', '%3C').gsub('>', '%3E')).query)
190
190
  else
191
191
  return {
192
192
  'accept' => '0',
@@ -7,7 +7,7 @@ module ActiveMerchant #:nodoc:
7
7
  self.live_url = "https://api.ewaypayments.com/"
8
8
 
9
9
  self.money_format = :cents
10
- self.supported_countries = ['AU', 'NZ', 'GB', 'SG']
10
+ self.supported_countries = ['AU', 'NZ', 'GB', 'SG', 'MY', 'HK']
11
11
  self.supported_cardtypes = [:visa, :master, :american_express, :diners_club, :jcb]
12
12
  self.homepage_url = "http://www.eway.com.au/"
13
13
  self.display_name = "eWAY Rapid 3.1"
@@ -42,7 +42,7 @@ module ActiveMerchant #:nodoc:
42
42
  # transaction (optional).
43
43
  # :application_id - A string identifying the application
44
44
  # submitting the transaction
45
- # (default: "https://github.com/Shopify/active_merchant")
45
+ # (default: "https://github.com/activemerchant/active_merchant")
46
46
  #
47
47
  # Returns an ActiveMerchant::Billing::Response object where authorization is the Transaction ID on success
48
48
  def purchase(amount, payment_method, options={})
@@ -99,7 +99,7 @@ module ActiveMerchant #:nodoc:
99
99
  # transaction (optional).
100
100
  # :application_id - A string identifying the application
101
101
  # submitting the transaction
102
- # (default: "https://github.com/Shopify/active_merchant")
102
+ # (default: "https://github.com/activemerchant/active_merchant")
103
103
  #
104
104
  # Returns an ActiveMerchant::Billing::Response object
105
105
  def refund(amount, identification, options = {})
@@ -125,7 +125,7 @@ module ActiveMerchant #:nodoc:
125
125
  # transaction (optional).
126
126
  # :application_id - A string identifying the application
127
127
  # submitting the transaction
128
- # (default: "https://github.com/Shopify/active_merchant")
128
+ # (default: "https://github.com/activemerchant/active_merchant")
129
129
  #
130
130
  # Returns an ActiveMerchant::Billing::Response object where the authorization is the customer_token on success
131
131
  def store(payment_method, options = {})
@@ -155,7 +155,7 @@ module ActiveMerchant #:nodoc:
155
155
  # transaction (optional).
156
156
  # :application_id - A string identifying the application
157
157
  # submitting the transaction
158
- # (default: "https://github.com/Shopify/active_merchant")
158
+ # (default: "https://github.com/activemerchant/active_merchant")
159
159
  #
160
160
  # Returns an ActiveMerchant::Billing::Response object where the authorization is the customer_token on success
161
161
  def update(customer_token, payment_method, options = {})
@@ -139,6 +139,10 @@ module ActiveMerchant #:nodoc:
139
139
  gsub(%r((<VerificationStr2>).+(</VerificationStr2>)), '\1[FILTERED]\2')
140
140
  end
141
141
 
142
+ def supports_network_tokenization?
143
+ true
144
+ end
145
+
142
146
  private
143
147
 
144
148
  def build_request(action, body)
@@ -410,4 +414,3 @@ module ActiveMerchant #:nodoc:
410
414
  end
411
415
  end
412
416
  end
413
-
@@ -230,7 +230,7 @@ module ActiveMerchant #:nodoc:
230
230
  end
231
231
 
232
232
  def parse(body)
233
- xml = REXML::Document.new(body)
233
+ xml = REXML::Document.new(strip_invalid_xml_chars(body))
234
234
 
235
235
  response = {}
236
236
  xml.root.elements.to_a.each do |node|
@@ -251,6 +251,10 @@ module ActiveMerchant #:nodoc:
251
251
  response[:message] == "Approved"
252
252
  end
253
253
 
254
+ def strip_invalid_xml_chars(xml)
255
+ xml.gsub(/&(?!(?:[a-z]+|#[0-9]+|x[a-zA-Z0-9]+);)/, '&amp;')
256
+ end
257
+
254
258
  end
255
259
  end
256
260
  end
@@ -15,7 +15,9 @@ module ActiveMerchant #:nodoc:
15
15
 
16
16
  ACTIONS = {
17
17
  purchase: "ProcessCreditCardV1",
18
+ purchase_check: "ProcessACHEFTV1",
18
19
  refund: "ProcessCreditCardRefundWithTransactionIdV1",
20
+ refund_check: "ProcessACHEFTRefundWithTransactionIdV1",
19
21
  store: "CreateCreditCardCustomerCodeV1",
20
22
  unstore: "DeleteCustomerCodeV1"
21
23
  }
@@ -40,17 +42,18 @@ module ActiveMerchant #:nodoc:
40
42
  add_ip(post, options)
41
43
  add_description(post, options)
42
44
 
43
- commit(:purchase, post)
45
+ commit((payment.is_a?(Check) ? :purchase_check : :purchase), post)
44
46
  end
45
47
 
46
48
  def refund(money, authorization, options={})
47
49
  post = {}
48
- post[:transaction_id] = authorization
50
+ transaction_id, payment_type = split_authorization(authorization)
51
+ post[:transaction_id] = transaction_id
49
52
  add_invoice(post, -money, options)
50
53
  add_ip(post, options)
51
54
  add_description(post, options)
52
55
 
53
- commit(:refund, post)
56
+ commit((payment_type == 'check' ? :refund_check : :refund), post)
54
57
  end
55
58
 
56
59
  def store(credit_card, options = {})
@@ -98,6 +101,14 @@ module ActiveMerchant #:nodoc:
98
101
  end
99
102
 
100
103
  def add_payment(post, payment)
104
+ if payment.is_a?(Check)
105
+ add_check(post, payment)
106
+ else
107
+ add_credit_card(post, payment)
108
+ end
109
+ end
110
+
111
+ def add_credit_card(post, payment)
101
112
  post[:first_name] = payment.first_name
102
113
  post[:last_name] = payment.last_name
103
114
  post[:credit_card_num] = payment.number
@@ -106,6 +117,13 @@ module ActiveMerchant #:nodoc:
106
117
  post[:mop] = creditcard_brand(payment.brand)
107
118
  end
108
119
 
120
+ def add_check(post, payment)
121
+ post[:first_name] = payment.first_name
122
+ post[:last_name] = payment.last_name
123
+ post[:account_num] = "#{payment.routing_number}#{payment.account_number}"
124
+ post[:account_type] = payment.account_type.upcase
125
+ end
126
+
109
127
  def add_store_defaults(post)
110
128
  post[:recurring] = false
111
129
  post[:begin_date] = Time.now.xmlschema
@@ -148,7 +166,9 @@ module ActiveMerchant #:nodoc:
148
166
  def endpoints
149
167
  {
150
168
  purchase: "ProcessLink.asmx",
169
+ purchase_check: "ProcessLink.asmx",
151
170
  refund: "ProcessLink.asmx",
171
+ refund_check: "ProcessLink.asmx",
152
172
  store: "CustomerLink.asmx",
153
173
  unstore: "CustomerLink.asmx"
154
174
  }
@@ -212,11 +232,17 @@ module ActiveMerchant #:nodoc:
212
232
  def authorization_from(action, response)
213
233
  if [:store, :unstore].include?(action)
214
234
  response[:customercode]
235
+ elsif [:purchase_check].include?(action)
236
+ response[:transaction_id] ? "#{response[:transaction_id]}|check" : nil
215
237
  else
216
238
  response[:transaction_id]
217
239
  end
218
240
  end
219
241
 
242
+ def split_authorization(authorization)
243
+ authorization.split("|")
244
+ end
245
+
220
246
  def envelope_namespaces
221
247
  {
222
248
  "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",