activemerchant 1.27.0 → 1.28.0
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +3 -0
- data/CHANGELOG +13 -0
- data/README.md +4 -1
- data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +3 -1
- data/lib/active_merchant/billing/gateways/banwire.rb +92 -0
- data/lib/active_merchant/billing/gateways/bogus.rb +35 -35
- data/lib/active_merchant/billing/gateways/elavon.rb +192 -23
- data/lib/active_merchant/billing/gateways/litle.rb +7 -2
- data/lib/active_merchant/billing/gateways/orbital.rb +229 -88
- data/lib/active_merchant/billing/gateways/paypal_express.rb +22 -2
- data/lib/active_merchant/billing/integrations/easy_pay/common.rb +1 -1
- data/lib/active_merchant/billing/integrations/easy_pay/helper.rb +1 -5
- data/lib/active_merchant/billing/integrations/easy_pay/notification.rb +10 -2
- data/lib/active_merchant/billing/integrations/paysbuy.rb +36 -0
- data/lib/active_merchant/billing/integrations/paysbuy/helper.rb +15 -0
- data/lib/active_merchant/billing/integrations/paysbuy/notification.rb +28 -0
- data/lib/active_merchant/billing/integrations/webmoney.rb +43 -0
- data/lib/active_merchant/billing/integrations/webmoney/common.rb +17 -0
- data/lib/active_merchant/billing/integrations/webmoney/helper.rb +39 -0
- data/lib/active_merchant/billing/integrations/webmoney/notification.rb +31 -0
- data/lib/active_merchant/version.rb +1 -1
- metadata +60 -25
- metadata.gz.sig +0 -0
@@ -101,6 +101,10 @@ module ActiveMerchant #:nodoc:
|
|
101
101
|
build_response(:registerToken, @litle.register_token_request(to_pass), %w(801 802))
|
102
102
|
end
|
103
103
|
|
104
|
+
def test?
|
105
|
+
super || @options[:test]
|
106
|
+
end
|
107
|
+
|
104
108
|
private
|
105
109
|
|
106
110
|
CARD_TYPE = {
|
@@ -148,10 +152,11 @@ module ActiveMerchant #:nodoc:
|
|
148
152
|
{:litleOnlineResponse => response},
|
149
153
|
:authorization => detail['litleTxnId'],
|
150
154
|
:avs_result => {:code => fraud['avs']},
|
151
|
-
:cvv_result => fraud['cvv']
|
155
|
+
:cvv_result => fraud['cvv'],
|
156
|
+
:test => test?
|
152
157
|
)
|
153
158
|
else
|
154
|
-
Response.new(false, response['message'], :litleOnlineResponse => response)
|
159
|
+
Response.new(false, response['message'], :litleOnlineResponse => response, :test => test?)
|
155
160
|
end
|
156
161
|
end
|
157
162
|
|
@@ -4,32 +4,32 @@ require "rexml/document"
|
|
4
4
|
module ActiveMerchant #:nodoc:
|
5
5
|
module Billing #:nodoc:
|
6
6
|
# For more information on Orbital, visit the {integration center}[http://download.chasepaymentech.com]
|
7
|
-
#
|
7
|
+
#
|
8
8
|
# ==== Authentication Options
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# The Orbital Gateway supports two methods of authenticating incoming requests:
|
11
11
|
# Source IP authentication and Connection Username/Password authentication
|
12
|
-
#
|
13
|
-
# In addition, these IP addresses/Connection Usernames must be affiliated with the Merchant IDs
|
12
|
+
#
|
13
|
+
# In addition, these IP addresses/Connection Usernames must be affiliated with the Merchant IDs
|
14
14
|
# for which the client should be submitting transactions.
|
15
|
-
#
|
16
|
-
# This does allow Third Party Hosting service organizations presenting on behalf of other
|
17
|
-
# merchants to submit transactions. However, each time a new customer is added, the
|
18
|
-
# merchant or Third-Party hosting organization needs to ensure that the new Merchant IDs
|
15
|
+
#
|
16
|
+
# This does allow Third Party Hosting service organizations presenting on behalf of other
|
17
|
+
# merchants to submit transactions. However, each time a new customer is added, the
|
18
|
+
# merchant or Third-Party hosting organization needs to ensure that the new Merchant IDs
|
19
19
|
# or Chain IDs are affiliated with the hosting companies IPs or Connection Usernames.
|
20
|
-
#
|
21
|
-
# If the merchant expects to have more than one merchant account with the Orbital
|
22
|
-
# Gateway, it should have its IP addresses/Connection Usernames affiliated at the Chain
|
20
|
+
#
|
21
|
+
# If the merchant expects to have more than one merchant account with the Orbital
|
22
|
+
# Gateway, it should have its IP addresses/Connection Usernames affiliated at the Chain
|
23
23
|
# level hierarchy within the Orbital Gateway. Each time a new merchant ID is added, as
|
24
|
-
# long as it is placed within the same Chain, it will simply work. Otherwise, the additional
|
24
|
+
# long as it is placed within the same Chain, it will simply work. Otherwise, the additional
|
25
25
|
# MIDs will need to be affiliated with the merchant IPs or Connection Usernames respectively.
|
26
|
-
# For example, we generally affiliate all Salem accounts [BIN 000001] with
|
27
|
-
# their Company Number [formerly called MA #] number so all MIDs or Divisions under that
|
26
|
+
# For example, we generally affiliate all Salem accounts [BIN 000001] with
|
27
|
+
# their Company Number [formerly called MA #] number so all MIDs or Divisions under that
|
28
28
|
# Company will automatically be affiliated.
|
29
|
-
|
29
|
+
|
30
30
|
class OrbitalGateway < Gateway
|
31
|
-
API_VERSION = "
|
32
|
-
|
31
|
+
API_VERSION = "5.6"
|
32
|
+
|
33
33
|
POST_HEADERS = {
|
34
34
|
"MIME-Version" => "1.0",
|
35
35
|
"Content-Type" => "Application/PTI46",
|
@@ -38,27 +38,29 @@ module ActiveMerchant #:nodoc:
|
|
38
38
|
"Document-type" => "Request",
|
39
39
|
"Interface-Version" => "Ruby|ActiveMerchant|Proprietary Gateway"
|
40
40
|
}
|
41
|
-
|
41
|
+
|
42
42
|
SUCCESS, APPROVED = '0', '00'
|
43
|
-
|
43
|
+
|
44
44
|
class_attribute :secondary_test_url, :secondary_live_url
|
45
|
-
|
45
|
+
|
46
46
|
self.test_url = "https://orbitalvar1.paymentech.net/authorize"
|
47
47
|
self.secondary_test_url = "https://orbitalvar2.paymentech.net/authorize"
|
48
|
-
|
48
|
+
|
49
49
|
self.live_url = "https://orbital1.paymentech.net/authorize"
|
50
50
|
self.secondary_live_url = "https://orbital2.paymentech.net/authorize"
|
51
|
-
|
51
|
+
|
52
52
|
self.supported_countries = ["US", "CA"]
|
53
53
|
self.default_currency = "CAD"
|
54
54
|
self.supported_cardtypes = [:visa, :master, :american_express, :discover, :diners_club, :jcb]
|
55
|
-
|
55
|
+
|
56
56
|
self.display_name = 'Orbital Paymentech'
|
57
57
|
self.homepage_url = 'http://chasepaymentech.com/'
|
58
|
-
|
58
|
+
|
59
59
|
self.money_format = :cents
|
60
|
-
|
61
|
-
|
60
|
+
|
61
|
+
AVS_SUPPORTED_COUNTRIES = ['US', 'CA', 'UK', 'GB']
|
62
|
+
|
63
|
+
CURRENCY_CODES = {
|
62
64
|
"AUD" => '036',
|
63
65
|
"CAD" => '124',
|
64
66
|
"CZK" => '203',
|
@@ -77,42 +79,43 @@ module ActiveMerchant #:nodoc:
|
|
77
79
|
"EUR" => '978'
|
78
80
|
}
|
79
81
|
|
80
|
-
AVS_SUPPORTED_COUNTRIES = ['US', 'CA', 'UK', 'GB']
|
81
|
-
|
82
82
|
def initialize(options = {})
|
83
83
|
requires!(options, :merchant_id)
|
84
84
|
requires!(options, :login, :password) unless options[:ip_authentication]
|
85
85
|
@options = options
|
86
86
|
super
|
87
87
|
end
|
88
|
-
|
88
|
+
|
89
89
|
# A – Authorization request
|
90
90
|
def authorize(money, creditcard, options = {})
|
91
91
|
order = build_new_order_xml('A', money, options) do |xml|
|
92
|
-
add_creditcard(xml, creditcard, options[:currency])
|
93
|
-
add_address(xml, creditcard, options)
|
92
|
+
add_creditcard(xml, creditcard, options[:currency]) unless creditcard.nil? && options[:profile_txn]
|
93
|
+
add_address(xml, creditcard, options)
|
94
|
+
add_customer_data(xml, options) if @options[:customer_profiles]
|
94
95
|
end
|
95
96
|
commit(order)
|
96
97
|
end
|
97
|
-
|
98
|
+
|
98
99
|
# AC – Authorization and Capture
|
99
100
|
def purchase(money, creditcard, options = {})
|
100
101
|
order = build_new_order_xml('AC', money, options) do |xml|
|
101
|
-
add_creditcard(xml, creditcard, options[:currency])
|
102
|
-
add_address(xml, creditcard, options)
|
102
|
+
add_creditcard(xml, creditcard, options[:currency]) unless creditcard.nil? && options[:profile_txn]
|
103
|
+
add_address(xml, creditcard, options)
|
104
|
+
add_customer_data(xml, options) if @options[:customer_profiles]
|
103
105
|
end
|
104
106
|
commit(order)
|
105
|
-
end
|
106
|
-
|
107
|
+
end
|
108
|
+
|
107
109
|
# MFC - Mark For Capture
|
108
110
|
def capture(money, authorization, options = {})
|
109
111
|
commit(build_mark_for_capture_xml(money, authorization, options))
|
110
112
|
end
|
111
|
-
|
113
|
+
|
112
114
|
# R – Refund request
|
113
115
|
def refund(money, authorization, options = {})
|
114
116
|
order = build_new_order_xml('R', money, options.merge(:authorization => authorization)) do |xml|
|
115
117
|
add_refund(xml, options[:currency])
|
118
|
+
xml.tag! :CustomerRefNum, options[:customer_ref_num] if @options[:customer_profiles] && options[:profile_txn]
|
116
119
|
end
|
117
120
|
commit(order)
|
118
121
|
end
|
@@ -121,31 +124,90 @@ module ActiveMerchant #:nodoc:
|
|
121
124
|
deprecated CREDIT_DEPRECATION_MESSAGE
|
122
125
|
refund(money, authorization, options)
|
123
126
|
end
|
124
|
-
|
127
|
+
|
125
128
|
# setting money to nil will perform a full void
|
126
|
-
def void(authorization, options = {})
|
127
|
-
order = build_void_request_xml(authorization, options)
|
129
|
+
def void(money, authorization, options = {})
|
130
|
+
order = build_void_request_xml(money, authorization, options)
|
131
|
+
commit(order)
|
132
|
+
end
|
133
|
+
|
134
|
+
|
135
|
+
# ==== Customer Profiles
|
136
|
+
# :customer_ref_num should be set unless your happy with Orbital providing one
|
137
|
+
#
|
138
|
+
# :customer_profile_order_override_ind can be set to map
|
139
|
+
# the CustomerRefNum to OrderID or Comments. Defaults to 'NO' - no mapping
|
140
|
+
#
|
141
|
+
# 'NO' - No mapping to order data
|
142
|
+
# 'OI' - Use <CustomerRefNum> for <OrderID>
|
143
|
+
# 'OD' - Use <CustomerRefNum> for <Comments>
|
144
|
+
# 'OA' - Use <CustomerRefNum> for <OrderID> and <Comments>
|
145
|
+
#
|
146
|
+
# :order_default_description can be set optionally. 64 char max.
|
147
|
+
#
|
148
|
+
# :order_default_amount can be set optionally. integer as cents.
|
149
|
+
#
|
150
|
+
# :status defaults to Active
|
151
|
+
#
|
152
|
+
# 'A' - Active
|
153
|
+
# 'I' - Inactive
|
154
|
+
# 'MS' - Manual Suspend
|
155
|
+
|
156
|
+
def add_customer_profile(creditcard, options = {})
|
157
|
+
options.merge!(:customer_profile_action => 'C')
|
158
|
+
order = build_customer_request_xml(creditcard, options)
|
159
|
+
commit(order)
|
160
|
+
end
|
161
|
+
|
162
|
+
def update_customer_profile(creditcard, options = {})
|
163
|
+
options.merge!(:customer_profile_action => 'U')
|
164
|
+
order = build_customer_request_xml(creditcard, options)
|
165
|
+
commit(order)
|
166
|
+
end
|
167
|
+
|
168
|
+
def retrieve_customer_profile(customer_ref_num)
|
169
|
+
options = {:customer_profile_action => 'R', :customer_ref_num => customer_ref_num}
|
170
|
+
order = build_customer_request_xml(nil, options)
|
171
|
+
commit(order)
|
172
|
+
end
|
173
|
+
|
174
|
+
def delete_customer_profile(customer_ref_num)
|
175
|
+
options = {:customer_profile_action => 'D', :customer_ref_num => customer_ref_num}
|
176
|
+
order = build_customer_request_xml(nil, options)
|
128
177
|
commit(order)
|
129
178
|
end
|
130
|
-
|
131
|
-
private
|
132
|
-
|
179
|
+
|
180
|
+
private
|
181
|
+
|
182
|
+
def authorization_string(*args)
|
183
|
+
args.compact.join(";")
|
184
|
+
end
|
185
|
+
|
186
|
+
def split_authorization(authorization)
|
187
|
+
authorization.split(';')
|
188
|
+
end
|
189
|
+
|
133
190
|
def add_customer_data(xml, options)
|
134
|
-
if options[:
|
135
|
-
xml.tag! :CustomerProfileFromOrderInd, 'S'
|
191
|
+
if options[:profile_txn]
|
136
192
|
xml.tag! :CustomerRefNum, options[:customer_ref_num]
|
137
193
|
else
|
138
|
-
|
194
|
+
if options[:customer_ref_num]
|
195
|
+
xml.tag! :CustomerProfileFromOrderInd, 'S'
|
196
|
+
xml.tag! :CustomerRefNum, options[:customer_ref_num]
|
197
|
+
else
|
198
|
+
xml.tag! :CustomerProfileFromOrderInd, 'A'
|
199
|
+
end
|
200
|
+
xml.tag! :CustomerProfileOrderOverrideInd, options[:customer_profile_order_override_ind] || 'NO'
|
139
201
|
end
|
140
202
|
end
|
141
|
-
|
203
|
+
|
142
204
|
def add_soft_descriptors(xml, soft_desc)
|
143
|
-
xml.tag! :SDMerchantName, soft_desc.merchant_name
|
144
|
-
xml.tag! :SDProductDescription, soft_desc.product_description
|
145
|
-
xml.tag! :SDMerchantCity, soft_desc.merchant_city
|
146
|
-
xml.tag! :SDMerchantPhone, soft_desc.merchant_phone
|
147
|
-
xml.tag! :SDMerchantURL, soft_desc.merchant_url
|
148
|
-
xml.tag! :SDMerchantEmail, soft_desc.merchant_email
|
205
|
+
xml.tag! :SDMerchantName, soft_desc.merchant_name if soft_desc.merchant_name
|
206
|
+
xml.tag! :SDProductDescription, soft_desc.product_description if soft_desc.product_description
|
207
|
+
xml.tag! :SDMerchantCity, soft_desc.merchant_city if soft_desc.merchant_city
|
208
|
+
xml.tag! :SDMerchantPhone, soft_desc.merchant_phone if soft_desc.merchant_phone
|
209
|
+
xml.tag! :SDMerchantURL, soft_desc.merchant_url if soft_desc.merchant_url
|
210
|
+
xml.tag! :SDMerchantEmail, soft_desc.merchant_email if soft_desc.merchant_email
|
149
211
|
end
|
150
212
|
|
151
213
|
def add_address(xml, creditcard, options)
|
@@ -165,24 +227,48 @@ module ActiveMerchant #:nodoc:
|
|
165
227
|
end
|
166
228
|
end
|
167
229
|
|
230
|
+
# For Profile requests
|
231
|
+
def add_customer_address(xml, options)
|
232
|
+
if address = options[:billing_address] || options[:address]
|
233
|
+
xml.tag! :CustomerAddress1, address[:address1]
|
234
|
+
xml.tag! :CustomerAddress2, address[:address2]
|
235
|
+
xml.tag! :CustomerCity, address[:city]
|
236
|
+
xml.tag! :CustomerState, address[:state]
|
237
|
+
xml.tag! :CustomerZIP, address[:zip]
|
238
|
+
xml.tag! :CustomerPhone, address[:phone] ? address[:phone].scan(/\d/).to_s : nil
|
239
|
+
xml.tag! :CustomerCountryCode, address[:country]
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
168
243
|
def add_creditcard(xml, creditcard, currency=nil)
|
169
244
|
xml.tag! :AccountNum, creditcard.number
|
170
245
|
xml.tag! :Exp, expiry_date(creditcard)
|
171
|
-
|
246
|
+
|
172
247
|
xml.tag! :CurrencyCode, currency_code(currency)
|
173
248
|
xml.tag! :CurrencyExponent, '2' # Will need updating to support currencies such as the Yen.
|
174
|
-
|
175
|
-
|
249
|
+
|
250
|
+
# If you are trying to collect a Card Verification Number
|
251
|
+
# (CardSecVal) for a Visa or Discover transaction, pass one of these values:
|
252
|
+
# 1 Value is Present
|
253
|
+
# 2 Value on card but illegible
|
254
|
+
# 9 Cardholder states data not available
|
255
|
+
# If the transaction is not a Visa or Discover transaction:
|
256
|
+
# Null-fill this attribute OR
|
257
|
+
# Do not submit the attribute at all.
|
258
|
+
# - http://download.chasepaymentech.com/docs/orbital/orbital_gateway_xml_specification.pdf
|
259
|
+
if %w( visa discover ).include?(creditcard.brand)
|
260
|
+
xml.tag! :CardSecValInd, creditcard.verification_value? ? '1' : '9'
|
261
|
+
end
|
176
262
|
xml.tag! :CardSecVal, creditcard.verification_value if creditcard.verification_value?
|
177
263
|
end
|
178
|
-
|
264
|
+
|
179
265
|
def add_refund(xml, currency=nil)
|
180
266
|
xml.tag! :AccountNum, nil
|
181
|
-
|
267
|
+
|
182
268
|
xml.tag! :CurrencyCode, currency_code(currency)
|
183
269
|
xml.tag! :CurrencyExponent, '2' # Will need updating to support currencies such as the Yen.
|
184
270
|
end
|
185
|
-
|
271
|
+
|
186
272
|
|
187
273
|
def parse(body)
|
188
274
|
response = {}
|
@@ -195,8 +281,8 @@ module ActiveMerchant #:nodoc:
|
|
195
281
|
end
|
196
282
|
end
|
197
283
|
response
|
198
|
-
end
|
199
|
-
|
284
|
+
end
|
285
|
+
|
200
286
|
def recurring_parse_element(response, node)
|
201
287
|
if node.has_elements?
|
202
288
|
node.elements.each{|e| recurring_parse_element(response, e) }
|
@@ -204,23 +290,24 @@ module ActiveMerchant #:nodoc:
|
|
204
290
|
response[node.name.underscore.to_sym] = node.text
|
205
291
|
end
|
206
292
|
end
|
207
|
-
|
293
|
+
|
208
294
|
def commit(order)
|
209
295
|
headers = POST_HEADERS.merge("Content-length" => order.size.to_s)
|
210
296
|
request = lambda {return parse(ssl_post(remote_url, order, headers))}
|
211
|
-
|
297
|
+
|
212
298
|
# Failover URL will be used in the event of a connection error
|
213
299
|
begin response = request.call; rescue ConnectionError; retry end
|
214
|
-
|
300
|
+
|
215
301
|
Response.new(success?(response), message_from(response), response,
|
216
|
-
{
|
217
|
-
|
218
|
-
|
219
|
-
|
302
|
+
{
|
303
|
+
:authorization => authorization_string(response[:tx_ref_num], response[:order_id]),
|
304
|
+
:test => self.test?,
|
305
|
+
:avs_result => {:code => response[:avs_resp_code]},
|
306
|
+
:cvv_result => response[:cvv2_resp_code]
|
220
307
|
}
|
221
308
|
)
|
222
309
|
end
|
223
|
-
|
310
|
+
|
224
311
|
def remote_url
|
225
312
|
unless $!.class == ActiveMerchant::ConnectionError
|
226
313
|
self.test? ? self.test_url : self.live_url
|
@@ -230,18 +317,20 @@ module ActiveMerchant #:nodoc:
|
|
230
317
|
end
|
231
318
|
|
232
319
|
def success?(response)
|
233
|
-
if response[:message_type]
|
320
|
+
if response[:message_type] == "R"
|
234
321
|
response[:proc_status] == SUCCESS
|
322
|
+
elsif response[:customer_profile_action]
|
323
|
+
response[:profile_proc_status] == SUCCESS
|
235
324
|
else
|
236
325
|
response[:proc_status] == SUCCESS &&
|
237
|
-
|
326
|
+
response[:resp_code] == APPROVED
|
238
327
|
end
|
239
328
|
end
|
240
|
-
|
329
|
+
|
241
330
|
def message_from(response)
|
242
|
-
|
331
|
+
response[:resp_msg] || response[:status_msg] || response[:customer_profile_message]
|
243
332
|
end
|
244
|
-
|
333
|
+
|
245
334
|
def ip_authentication?
|
246
335
|
@options[:ip_authentication] == true
|
247
336
|
end
|
@@ -255,30 +344,46 @@ module ActiveMerchant #:nodoc:
|
|
255
344
|
xml.tag! :IndustryType, parameters[:industry_type] || "EC"
|
256
345
|
xml.tag! :MessageType, action
|
257
346
|
add_bin_merchant_and_terminal(xml, parameters)
|
258
|
-
|
347
|
+
|
259
348
|
yield xml if block_given?
|
260
|
-
|
261
|
-
xml.tag! :Comments, parameters[:comments] if parameters[:comments]
|
349
|
+
|
262
350
|
xml.tag! :OrderID, format_order_id(parameters[:order_id])
|
263
351
|
xml.tag! :Amount, amount(money)
|
264
|
-
|
352
|
+
xml.tag! :Comments, parameters[:comments] if parameters[:comments]
|
353
|
+
|
354
|
+
if parameters[:soft_descriptors].is_a?(OrbitalSoftDescriptors)
|
355
|
+
add_soft_descriptors(xml, parameters[:soft_descriptors])
|
356
|
+
end
|
357
|
+
|
358
|
+
set_recurring_ind(xml, parameters)
|
359
|
+
|
265
360
|
# Append Transaction Reference Number at the end for Refund transactions
|
266
361
|
if action == "R"
|
267
|
-
tx_ref_num, _ = parameters[:authorization]
|
362
|
+
tx_ref_num, _ = split_authorization(parameters[:authorization])
|
268
363
|
xml.tag! :TxRefNum, tx_ref_num
|
269
364
|
end
|
270
365
|
end
|
271
366
|
end
|
272
367
|
xml.target!
|
273
368
|
end
|
274
|
-
|
369
|
+
|
370
|
+
# For Canadian transactions on PNS Tampa on New Order
|
371
|
+
# RF - First Recurring Transaction
|
372
|
+
# RS - Subsequent Recurring Transactions
|
373
|
+
def set_recurring_ind(xml, parameters)
|
374
|
+
if parameters[:recurring_ind]
|
375
|
+
raise "RecurringInd must be set to either \"RF\" or \"RS\"" unless %w(RF RS).include?(parameters[:recurring_ind])
|
376
|
+
xml.tag! :RecurringInd, parameters[:recurring_ind]
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
275
380
|
def build_mark_for_capture_xml(money, authorization, parameters = {})
|
276
|
-
tx_ref_num, order_id = authorization
|
381
|
+
tx_ref_num, order_id = split_authorization(authorization)
|
277
382
|
xml = xml_envelope
|
278
383
|
xml.tag! :Request do
|
279
384
|
xml.tag! :MarkForCapture do
|
280
385
|
add_xml_credentials(xml)
|
281
|
-
xml.tag! :OrderID, order_id
|
386
|
+
xml.tag! :OrderID, format_order_id(order_id)
|
282
387
|
xml.tag! :Amount, amount(money)
|
283
388
|
add_bin_merchant_and_terminal(xml, parameters)
|
284
389
|
xml.tag! :TxRefNum, tx_ref_num
|
@@ -286,26 +391,27 @@ module ActiveMerchant #:nodoc:
|
|
286
391
|
end
|
287
392
|
xml.target!
|
288
393
|
end
|
289
|
-
|
290
|
-
def build_void_request_xml(authorization, parameters = {})
|
291
|
-
tx_ref_num, order_id = authorization
|
394
|
+
|
395
|
+
def build_void_request_xml(money, authorization, parameters = {})
|
396
|
+
tx_ref_num, order_id = split_authorization(authorization)
|
292
397
|
xml = xml_envelope
|
293
398
|
xml.tag! :Request do
|
294
399
|
xml.tag! :Reversal do
|
295
400
|
add_xml_credentials(xml)
|
296
401
|
xml.tag! :TxRefNum, tx_ref_num
|
297
402
|
xml.tag! :TxRefIdx, parameters[:transaction_index]
|
298
|
-
xml.tag! :
|
403
|
+
xml.tag! :AdjustedAmt, amount(money)
|
404
|
+
xml.tag! :OrderID, format_order_id(order_id || parameters[:order_id])
|
299
405
|
add_bin_merchant_and_terminal(xml, parameters)
|
300
406
|
end
|
301
407
|
end
|
302
408
|
xml.target!
|
303
409
|
end
|
304
|
-
|
410
|
+
|
305
411
|
def currency_code(currency)
|
306
412
|
CURRENCY_CODES[(currency || self.default_currency)].to_s
|
307
413
|
end
|
308
|
-
|
414
|
+
|
309
415
|
def expiry_date(credit_card)
|
310
416
|
"#{format(credit_card.month, :two_digits)}#{format(credit_card.year, :two_digits)}"
|
311
417
|
end
|
@@ -346,6 +452,41 @@ module ActiveMerchant #:nodoc:
|
|
346
452
|
order_id.gsub!(illegal_characters, '')
|
347
453
|
order_id[0...22]
|
348
454
|
end
|
455
|
+
|
456
|
+
def build_customer_request_xml(creditcard, options = {})
|
457
|
+
xml = xml_envelope
|
458
|
+
xml.tag! :Request do
|
459
|
+
xml.tag! :Profile do
|
460
|
+
xml.tag! :OrbitalConnectionUsername, @options[:login] unless ip_authentication?
|
461
|
+
xml.tag! :OrbitalConnectionPassword, @options[:password] unless ip_authentication?
|
462
|
+
xml.tag! :CustomerBin, bin
|
463
|
+
xml.tag! :CustomerMerchantID, @options[:merchant_id]
|
464
|
+
xml.tag! :CustomerName, creditcard.name if creditcard
|
465
|
+
xml.tag! :CustomerRefNum, options[:customer_ref_num] if options[:customer_ref_num]
|
466
|
+
|
467
|
+
add_customer_address(xml, options)
|
468
|
+
|
469
|
+
xml.tag! :CustomerProfileAction, options[:customer_profile_action] # C, R, U, D
|
470
|
+
xml.tag! :CustomerProfileOrderOverrideInd, options[:customer_profile_order_override_ind] || 'NO'
|
471
|
+
|
472
|
+
if options[:customer_profile_action] == 'C'
|
473
|
+
xml.tag! :CustomerProfileFromOrderInd, options[:customer_ref_num] ? 'S' : 'A'
|
474
|
+
end
|
475
|
+
|
476
|
+
xml.tag! :OrderDefaultDescription, options[:order_default_description][0..63] if options[:order_default_description]
|
477
|
+
xml.tag! :OrderDefaultAmount, options[:order_default_amount] if options[:order_default_amount]
|
478
|
+
|
479
|
+
if ['C', 'U'].include? options[:customer_profile_action]
|
480
|
+
xml.tag! :CustomerAccountType, 'CC' # Only credit card supported
|
481
|
+
xml.tag! :Status, options[:status] || 'A' # Active
|
482
|
+
end
|
483
|
+
|
484
|
+
xml.tag! :CCAccountNum, creditcard.number if creditcard
|
485
|
+
xml.tag! :CCExpireDate, creditcard.expiry_date.expiration.strftime("%m%y") if creditcard
|
486
|
+
end
|
487
|
+
end
|
488
|
+
xml.target!
|
489
|
+
end
|
349
490
|
end
|
350
491
|
end
|
351
492
|
end
|