activemerchant 1.13.0 → 1.14.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.
- data.tar.gz.sig +0 -0
- data/CHANGELOG +19 -0
- data/CONTRIBUTORS +14 -2
- data/README.rdoc +2 -0
- data/lib/active_merchant/billing/credit_card.rb +4 -4
- data/lib/active_merchant/billing/gateway.rb +1 -1
- data/lib/active_merchant/billing/gateways/authorize_net.rb +10 -5
- data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +133 -11
- data/lib/active_merchant/billing/gateways/barclays_epdq.rb +1 -1
- data/lib/active_merchant/billing/gateways/beanstream.rb +39 -2
- data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +64 -26
- data/lib/active_merchant/billing/gateways/bogus.rb +21 -3
- data/lib/active_merchant/billing/gateways/cyber_source.rb +5 -1
- data/lib/active_merchant/billing/gateways/data_cash.rb +1 -1
- data/lib/active_merchant/billing/gateways/efsnet.rb +1 -1
- data/lib/active_merchant/billing/gateways/epay.rb +5 -1
- data/lib/active_merchant/billing/gateways/eway.rb +4 -0
- data/lib/active_merchant/billing/gateways/eway_managed.rb +231 -0
- data/lib/active_merchant/billing/gateways/federated_canada.rb +6 -7
- data/lib/active_merchant/billing/gateways/first_pay.rb +7 -2
- data/lib/active_merchant/billing/gateways/iridium.rb +1 -1
- data/lib/active_merchant/billing/gateways/jetpay.rb +5 -2
- data/lib/active_merchant/billing/gateways/linkpoint.rb +6 -1
- data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +6 -4
- data/lib/active_merchant/billing/gateways/merchant_ware.rb +1 -1
- data/lib/active_merchant/billing/gateways/moneris.rb +1 -1
- data/lib/active_merchant/billing/gateways/netaxept.rb +6 -1
- data/lib/active_merchant/billing/gateways/ogone.rb +1 -1
- data/lib/active_merchant/billing/gateways/orbital.rb +317 -0
- data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +46 -0
- data/lib/active_merchant/billing/gateways/paybox_direct.rb +1 -1
- data/lib/active_merchant/billing/gateways/payflow.rb +1 -1
- data/lib/active_merchant/billing/gateways/payflow_express.rb +6 -1
- data/lib/active_merchant/billing/gateways/payment_express.rb +6 -1
- data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +7 -2
- data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +11 -7
- data/lib/active_merchant/billing/gateways/plugnpay.rb +1 -1
- data/lib/active_merchant/billing/gateways/psigate.rb +1 -1
- data/lib/active_merchant/billing/gateways/qbms.rb +1 -1
- data/lib/active_merchant/billing/gateways/quantum.rb +6 -1
- data/lib/active_merchant/billing/gateways/quickpay.rb +6 -1
- data/lib/active_merchant/billing/gateways/realex.rb +196 -72
- data/lib/active_merchant/billing/gateways/sage_pay.rb +7 -2
- data/lib/active_merchant/billing/gateways/secure_pay_au.rb +38 -2
- data/lib/active_merchant/billing/gateways/smart_ps.rb +2 -2
- data/lib/active_merchant/billing/gateways/trust_commerce.rb +7 -2
- data/lib/active_merchant/billing/gateways/verifi.rb +1 -1
- data/lib/active_merchant/billing/gateways/worldpay.rb +280 -0
- data/lib/active_merchant/billing/integrations/moneybookers/helper.rb +0 -1
- data/lib/active_merchant/billing/integrations/return.rb +6 -1
- data/lib/active_merchant/billing/integrations/sage_pay_form/notification.rb +6 -0
- data/lib/active_merchant/billing/integrations/sage_pay_form/return.rb +5 -1
- data/lib/active_merchant/common/connection.rb +15 -0
- data/lib/active_merchant/common/posts_data.rb +2 -0
- data/lib/active_merchant/common/utils.rb +4 -0
- data/lib/active_merchant/version.rb +1 -1
- metadata +8 -4
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/CHANGELOG
CHANGED
@@ -1,5 +1,24 @@
|
|
1
1
|
= ActiveMerchant CHANGELOG
|
2
2
|
|
3
|
+
== Version 1.14.0 (Apr 29, 2011)
|
4
|
+
|
5
|
+
* SagePayForm: Implement #cancelled? for Return. [wisq]
|
6
|
+
* Add #cancelled? to Integrations::Return [wisq]
|
7
|
+
* Bogus gateway: Add refund support and better tests [wisq]
|
8
|
+
* Beanstream: Add support for storing cards [duffomelia]
|
9
|
+
* eWay: Add support for storing cards [duffomelia]
|
10
|
+
* Add validation mode to update profile request [Ken Miller]
|
11
|
+
* Authorize.net CIM: Add oldLiveMode [ntalbott]
|
12
|
+
* Authorize.net CIM: Add extra transaction types [Ken Miller]
|
13
|
+
* JetPay: gateway tweaks [ntalbott]
|
14
|
+
* Deprecate a bunch more #credit methods [ntalbott]
|
15
|
+
* RealEx: Add authorize/capture/credit/void [ntalbott]
|
16
|
+
* SecurePay AU: Add authorize/capture/credit/void [ntalbott]
|
17
|
+
* PayPal Express: Make response parsing more robust [ntalbott]
|
18
|
+
* Test deprecation warnings; add deprecation line numbers [ntabott]
|
19
|
+
* Add Orbital direct gateway [ntalbott]
|
20
|
+
* Add WorldPay direct gateway [ntalbott]
|
21
|
+
|
3
22
|
== Version 1.13.0 (Apr 19, 2011)
|
4
23
|
|
5
24
|
* Add a Gemfile for optional bundler support [ssoroka]
|
data/CONTRIBUTORS
CHANGED
@@ -26,6 +26,7 @@ Linkpoint Gateway
|
|
26
26
|
eWay Gateway
|
27
27
|
|
28
28
|
* Originally contributed by Lucas Carlson (mailto:lucas@rufy.com)
|
29
|
+
* Managed Payments support by Jason Stirk with improvements by Keith Pitt
|
29
30
|
|
30
31
|
CardStream Gateway
|
31
32
|
|
@@ -83,6 +84,7 @@ PaypalNVGateway (Apr 12, 2008)
|
|
83
84
|
Beanstream (May 13, 2008)
|
84
85
|
|
85
86
|
* Created by xiaobozz ( xiaobozzz at gmail dot com )
|
87
|
+
* Secure Profiles support by Forrest Zeisler (http://github.com/forrest)
|
86
88
|
|
87
89
|
Sage (June, 2008)
|
88
90
|
|
@@ -211,7 +213,17 @@ NMI
|
|
211
213
|
QBMS
|
212
214
|
|
213
215
|
* Will Glozer (wg)
|
214
|
-
|
216
|
+
|
217
|
+
WorldPay Integration (Feb 17, 2011)
|
215
218
|
|
216
219
|
* Original code by Unknown from this patch: https://jadedpixel.lighthouseapp.com/projects/11599/tickets/3-patch-integration-support-for-worldpay-uk
|
217
|
-
* Refactored by Soleone
|
220
|
+
* Refactored by Soleone
|
221
|
+
|
222
|
+
WorldPay Gateway
|
223
|
+
|
224
|
+
* Original code by Amit kumar (ask4amit@gmail.com)
|
225
|
+
* Refactored by Nathaniel Talbott (ntalbott)
|
226
|
+
|
227
|
+
Orbital Paymentech Gateway (July, 2009)
|
228
|
+
|
229
|
+
* Sam Vincent - http://ecommerce.versapay.com
|
data/README.rdoc
CHANGED
@@ -43,6 +43,7 @@ The {ActiveMerchant Wiki}[http://github.com/Shopify/active_merchant/wikis] conta
|
|
43
43
|
* {NETbilling}[http://www.netbilling.com] - US
|
44
44
|
* {NMI}[http://nmi.com/] - US
|
45
45
|
* {Ogone DirectLink}[http://www.ogone.com] - BE, DE, FR, NL, AT, CH
|
46
|
+
* {Orbital Paymentech}[http://chasepaymentech.com/] - CA, US
|
46
47
|
* {PayBox Direct}[http://www.paybox.com] - FR
|
47
48
|
* {PayJunction}[http://www.payjunction.com/] - US
|
48
49
|
* {PaySecure}[http://www.commsecure.com.au/paysecure.shtml] - AU
|
@@ -75,6 +76,7 @@ The {ActiveMerchant Wiki}[http://github.com/Shopify/active_merchant/wikis] conta
|
|
75
76
|
* {Verifi}[http://www.verifi.com/] - US
|
76
77
|
* {ViaKLIX}[http://viaklix.com] - US
|
77
78
|
* {Wirecard}[http://www.wirecard.com] - DE
|
79
|
+
* {WorldPay}[http://www.worldpay.com] - AU, HK, GB, US
|
78
80
|
|
79
81
|
== Supported Offsite Payment Gateways
|
80
82
|
|
@@ -65,19 +65,19 @@ module ActiveMerchant #:nodoc:
|
|
65
65
|
end
|
66
66
|
|
67
67
|
def name?
|
68
|
-
first_name?
|
68
|
+
first_name? || last_name?
|
69
69
|
end
|
70
70
|
|
71
71
|
def first_name?
|
72
|
-
|
72
|
+
@first_name.present?
|
73
73
|
end
|
74
74
|
|
75
75
|
def last_name?
|
76
|
-
|
76
|
+
@last_name.present?
|
77
77
|
end
|
78
78
|
|
79
79
|
def name
|
80
|
-
|
80
|
+
[@first_name, @last_name].compact.join(' ')
|
81
81
|
end
|
82
82
|
|
83
83
|
def verification_value?
|
@@ -135,7 +135,7 @@ module ActiveMerchant #:nodoc:
|
|
135
135
|
def amount(money)
|
136
136
|
return nil if money.nil?
|
137
137
|
cents = if money.respond_to?(:cents)
|
138
|
-
|
138
|
+
deprecated "Support for Money objects is deprecated and will be removed from a future release of ActiveMerchant. Please use an Integer value in cents"
|
139
139
|
money.cents
|
140
140
|
else
|
141
141
|
money
|
@@ -134,21 +134,21 @@ module ActiveMerchant #:nodoc:
|
|
134
134
|
commit('VOID', nil, post)
|
135
135
|
end
|
136
136
|
|
137
|
-
#
|
137
|
+
# Refund a transaction.
|
138
138
|
#
|
139
|
-
# This transaction
|
139
|
+
# This transaction indicates to the gateway that
|
140
140
|
# money should flow from the merchant to the customer.
|
141
141
|
#
|
142
142
|
# ==== Parameters
|
143
143
|
#
|
144
144
|
# * <tt>money</tt> -- The amount to be credited to the customer as an Integer value in cents.
|
145
|
-
# * <tt>identification</tt> -- The ID of the original transaction against which the
|
145
|
+
# * <tt>identification</tt> -- The ID of the original transaction against which the refund is being issued.
|
146
146
|
# * <tt>options</tt> -- A hash of parameters.
|
147
147
|
#
|
148
148
|
# ==== Options
|
149
149
|
#
|
150
|
-
# * <tt>:card_number</tt> -- The credit card number the
|
151
|
-
def
|
150
|
+
# * <tt>:card_number</tt> -- The credit card number the refund is being issued to. (REQUIRED)
|
151
|
+
def refund(money, identification, options = {})
|
152
152
|
requires!(options, :card_number)
|
153
153
|
|
154
154
|
post = { :trans_id => identification,
|
@@ -159,6 +159,11 @@ module ActiveMerchant #:nodoc:
|
|
159
159
|
commit('CREDIT', money, post)
|
160
160
|
end
|
161
161
|
|
162
|
+
def credit(money, identification, options = {})
|
163
|
+
deprecated CREDIT_DEPRECATION_MESSAGE
|
164
|
+
refund(money, identification, options)
|
165
|
+
end
|
166
|
+
|
162
167
|
# Create a recurring payment.
|
163
168
|
#
|
164
169
|
# This transaction creates a new Automated Recurring Billing (ARB) subscription. Your account must have ARB enabled.
|
@@ -54,13 +54,17 @@ module ActiveMerchant #:nodoc:
|
|
54
54
|
CIM_TRANSACTION_TYPES = {
|
55
55
|
:auth_capture => 'profileTransAuthCapture',
|
56
56
|
:auth_only => 'profileTransAuthOnly',
|
57
|
-
:capture_only => 'profileTransCaptureOnly'
|
57
|
+
:capture_only => 'profileTransCaptureOnly',
|
58
|
+
:prior_auth_capture => 'profileTransPriorAuthCapture',
|
59
|
+
:refund => 'profileTransRefund',
|
60
|
+
:void => 'profileTransVoid'
|
58
61
|
}
|
59
62
|
|
60
63
|
CIM_VALIDATION_MODES = {
|
61
64
|
:none => 'none',
|
62
65
|
:test => 'testMode',
|
63
|
-
:live => 'liveMode'
|
66
|
+
:live => 'liveMode',
|
67
|
+
:old => 'oldLiveMode'
|
64
68
|
}
|
65
69
|
|
66
70
|
BANK_ACCOUNT_TYPES = {
|
@@ -309,14 +313,105 @@ module ActiveMerchant #:nodoc:
|
|
309
313
|
#
|
310
314
|
# ==== Transaction
|
311
315
|
#
|
312
|
-
# * <tt>:type</tt> -- The type of transaction. Can be either <tt>:auth_only</tt>, <tt>:capture_only</tt>, or <tt>:
|
313
|
-
# * <tt>:amount</tt> -- The amount for the tranaction. Formatted with a decimal. For example "4.95" (
|
314
|
-
#
|
315
|
-
#
|
316
|
+
# * <tt>:type</tt> -- The type of transaction. Can be either <tt>:auth_only</tt>, <tt>:capture_only</tt>, <tt>:auth_capture</tt>, <tt>:prior_auth_capture</tt>, <tt>:refund</tt> or <tt>:void</tt>. (REQUIRED)
|
317
|
+
# * <tt>:amount</tt> -- The amount for the tranaction. Formatted with a decimal. For example "4.95" (CONDITIONAL)
|
318
|
+
# - :type == :void (NOT USED)
|
319
|
+
# - :type == (:refund, :auth_only, :capture_only, :auth_capture, :prior_auth_capture) (REQUIRED)
|
320
|
+
#
|
321
|
+
# * <tt>:customer_profile_id</tt> -- The Customer Profile ID of the customer to use in this transaction. (CONDITIONAL)
|
322
|
+
# - :type == (:void, :prior_auth_capture) (OPTIONAL)
|
323
|
+
# - :type == :refund (CONDITIONAL - required if masked information is not being submitted [see below])
|
324
|
+
# - :type == (:auth_only, :capture_only, :auth_capture) (REQUIRED)
|
325
|
+
#
|
326
|
+
# * <tt>:customer_payment_profile_id</tt> -- The Customer Payment Profile ID of the Customer Payment Profile to use in this transaction. (CONDITIONAL)
|
327
|
+
# - :type == (:void, :prior_auth_capture) (OPTIONAL)
|
328
|
+
# - :type == :refund (CONDITIONAL - required if masked information is not being submitted [see below])
|
329
|
+
# - :type == (:auth_only, :capture_only, :auth_capture) (REQUIRED)
|
330
|
+
#
|
331
|
+
# * <tt>:trans_id</tt> -- The payment gateway assigned transaction ID of the original transaction (CONDITIONAL):
|
332
|
+
# - :type = (:void, :refund, :prior_auth_capture) (REQUIRED)
|
333
|
+
# - :type = (:auth_only, :capture_only, :auth_capture) (NOT USED)
|
334
|
+
#
|
335
|
+
# * <tt>customer_shipping_address_id</tt> -- Payment gateway assigned ID associated with the customer shipping address (CONDITIONAL)
|
336
|
+
# - :type = (:void, :refund) (OPTIONAL)
|
337
|
+
# - :type = (:auth_only, :capture_only, :auth_capture) (NOT USED)
|
338
|
+
# - :type = (:prior_auth_capture) (OPTIONAL)
|
339
|
+
#
|
340
|
+
# ==== For :type == :refund only
|
341
|
+
# * <tt>:credit_card_number_masked</tt> -- (CONDITIONAL - requied for credit card refunds is :customer_profile_id AND :customer_payment_profile_id are missing)
|
342
|
+
# * <tt>:bank_routing_number_masked && :bank_account_number_masked</tt> -- (CONDITIONAL - requied for electronic check refunds is :customer_profile_id AND :customer_payment_profile_id are missing) (NOT ABLE TO TEST - I keep getting "ACH transactions are not accepted by this merchant." when trying to make a payment and, until that's possible I can't refund (wiseleyb@gmail.com))
|
316
343
|
def create_customer_profile_transaction(options)
|
317
344
|
requires!(options, :transaction)
|
318
|
-
requires!(options[:transaction], :type
|
345
|
+
requires!(options[:transaction], :type)
|
346
|
+
case options[:transaction][:type]
|
347
|
+
when :void
|
348
|
+
requires!(options[:transaction], :trans_id)
|
349
|
+
when :refund
|
350
|
+
requires!(options[:transaction], :trans_id) &&
|
351
|
+
(
|
352
|
+
(options[:transaction][:customer_profile_id] && options[:transaction][:customer_payment_profile_id]) ||
|
353
|
+
options[:transaction][:credit_card_number_masked] ||
|
354
|
+
(options[:transaction][:bank_routing_number_masked] && options[:transaction][:bank_account_number_masked])
|
355
|
+
)
|
356
|
+
when :prior_auth_capture
|
357
|
+
requires!(options[:transaction], :amount, :trans_id)
|
358
|
+
else
|
359
|
+
requires!(options[:transaction], :amount, :customer_profile_id, :customer_payment_profile_id)
|
360
|
+
end
|
361
|
+
request = build_request(:create_customer_profile_transaction, options)
|
362
|
+
commit(:create_customer_profile_transaction, request)
|
363
|
+
end
|
319
364
|
|
365
|
+
# Creates a new payment transaction for refund from an existing customer profile
|
366
|
+
#
|
367
|
+
# This is what is used to refund a transaction you have stored in a Customer Profile.
|
368
|
+
#
|
369
|
+
# Returns a Response object that contains the result of the transaction in <tt>params['direct_response']</tt>
|
370
|
+
#
|
371
|
+
# ==== Options
|
372
|
+
#
|
373
|
+
# * <tt>:transaction</tt> -- A hash containing information on the transaction that is being requested. (REQUIRED)
|
374
|
+
#
|
375
|
+
# ==== Transaction
|
376
|
+
#
|
377
|
+
# * <tt>:amount</tt> -- The total amount to be refunded (REQUIRED)
|
378
|
+
#
|
379
|
+
# * <tt>:customer_profile_id</tt> -- The Customer Profile ID of the customer to use in this transaction. (CONDITIONAL :customer_payment_profile_id must be included if used)
|
380
|
+
# * <tt>:customer_payment_profile_id</tt> -- The Customer Payment Profile ID of the Customer Payment Profile to use in this transaction. (CONDITIONAL :customer_profile_id must be included if used)
|
381
|
+
#
|
382
|
+
# * <tt>:credit_card_number_masked</tt> -- Four Xs follwed by the last four digits of the credit card (CONDITIONAL - used if customer_profile_id and customer_payment_profile_id aren't given)
|
383
|
+
#
|
384
|
+
# * <tt>:bank_routing_number_masked</tt> -- The last four gidits of the routing number to be refunded (CONDITIONAL - must be used with :bank_account_number_masked)
|
385
|
+
# * <tt>:bank_account_number_masked</tt> -- The last four digis of the bank account number to be refunded, Ex. XXXX1234 (CONDITIONAL - must be used with :bank_routing_number_masked)
|
386
|
+
def create_customer_profile_transaction_for_refund(options)
|
387
|
+
requires!(options, :transaction)
|
388
|
+
options[:transaction][:type] = :refund
|
389
|
+
requires!(options[:transaction], :trans_id)
|
390
|
+
requires!(options[:transaction], :amount)
|
391
|
+
request = build_request(:create_customer_profile_transaction, options)
|
392
|
+
commit(:create_customer_profile_transaction, request)
|
393
|
+
end
|
394
|
+
|
395
|
+
# Creates a new payment transaction for void from an existing customer profile
|
396
|
+
#
|
397
|
+
# This is what is used to void a transaction you have stored in a Customer Profile.
|
398
|
+
#
|
399
|
+
# Returns a Response object that contains the result of the transaction in <tt>params['direct_response']</tt>
|
400
|
+
#
|
401
|
+
# ==== Options
|
402
|
+
#
|
403
|
+
# * <tt>:transaction</tt> -- A hash containing information on the transaction that is being requested. (REQUIRED)
|
404
|
+
#
|
405
|
+
# ==== Transaction
|
406
|
+
#
|
407
|
+
# * <tt>:trans_id</tt> -- The payment gateway assigned transaction id of the original transaction. (REQUIRED)
|
408
|
+
# * <tt>:customer_profile_id</tt> -- The Customer Profile ID of the customer to use in this transaction.
|
409
|
+
# * <tt>:customer_payment_profile_id</tt> -- The Customer Payment Profile ID of the Customer Payment Profile to use in this transaction.
|
410
|
+
# * <tt>:customer_shipping_address_id</tt> -- Payment gateway assigned ID associated with the customer shipping address.
|
411
|
+
def create_customer_profile_transaction_for_void(options)
|
412
|
+
requires!(options, :transaction)
|
413
|
+
options[:transaction][:type] = :void
|
414
|
+
requires!(options[:transaction], :trans_id)
|
320
415
|
request = build_request(:create_customer_profile_transaction, options)
|
321
416
|
commit(:create_customer_profile_transaction, request)
|
322
417
|
end
|
@@ -443,6 +538,8 @@ module ActiveMerchant #:nodoc:
|
|
443
538
|
add_payment_profile(xml, options[:payment_profile])
|
444
539
|
end
|
445
540
|
|
541
|
+
xml.tag!('validationMode', CIM_VALIDATION_MODES[options[:validation_mode]]) if options[:validation_mode]
|
542
|
+
|
446
543
|
xml.target!
|
447
544
|
end
|
448
545
|
|
@@ -502,10 +599,31 @@ module ActiveMerchant #:nodoc:
|
|
502
599
|
xml.tag!('transaction') do
|
503
600
|
xml.tag!(CIM_TRANSACTION_TYPES[transaction[:type]]) do
|
504
601
|
# The amount to be billed to the customer
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
602
|
+
case transaction[:type]
|
603
|
+
when :void
|
604
|
+
tag_unless_blank(xml,'customerProfileId', transaction[:customer_profile_id])
|
605
|
+
tag_unless_blank(xml,'customerPaymentProfileId', transaction[:customer_payment_profile_id])
|
606
|
+
tag_unless_blank(xml,'customerShippingAddressId', transaction[:customer_shipping_address_id])
|
607
|
+
xml.tag!('transId', transaction[:trans_id])
|
608
|
+
when :refund
|
609
|
+
#TODO - add support for all the other options fields
|
610
|
+
xml.tag!('amount', transaction[:amount])
|
611
|
+
tag_unless_blank(xml, 'customerProfileId', transaction[:customer_profile_id])
|
612
|
+
tag_unless_blank(xml, 'customerPaymentProfileId', transaction[:customer_payment_profile_id])
|
613
|
+
tag_unless_blank(xml, 'customerShippingAddressId', transaction[:customer_shipping_address_id])
|
614
|
+
tag_unless_blank(xml, 'creditCardNumberMasked', transaction[:credit_card_number_masked])
|
615
|
+
tag_unless_blank(xml, 'bankRoutingNumberMasked', transaction[:bank_routing_number_masked])
|
616
|
+
tag_unless_blank(xml, 'bankAccountNumberMasked', transaction[:bank_account_number_masked])
|
617
|
+
xml.tag!('transId', transaction[:trans_id])
|
618
|
+
when :prior_auth_capture
|
619
|
+
xml.tag!('amount', transaction[:amount])
|
620
|
+
xml.tag!('transId', transaction[:trans_id])
|
621
|
+
else
|
622
|
+
xml.tag!('amount', transaction[:amount])
|
623
|
+
xml.tag!('customerProfileId', transaction[:customer_profile_id])
|
624
|
+
xml.tag!('customerPaymentProfileId', transaction[:customer_payment_profile_id])
|
625
|
+
xml.tag!('approvalCode', transaction[:approval_code]) if transaction[:type] == :capture_only
|
626
|
+
end
|
509
627
|
add_order(xml, transaction[:order]) if transaction[:order]
|
510
628
|
end
|
511
629
|
end
|
@@ -648,6 +766,10 @@ module ActiveMerchant #:nodoc:
|
|
648
766
|
response
|
649
767
|
end
|
650
768
|
|
769
|
+
def tag_unless_blank(xml, tag_name, data)
|
770
|
+
xml.tag!(tag_name, data) unless data.blank? || data.nil?
|
771
|
+
end
|
772
|
+
|
651
773
|
def parse_direct_response(response)
|
652
774
|
direct_response = {'raw' => response.params['direct_response']}
|
653
775
|
direct_response_fields = response.params['direct_response'].split(',')
|
@@ -64,7 +64,7 @@ module ActiveMerchant #:nodoc:
|
|
64
64
|
# code returned by ePDQ
|
65
65
|
def credit(money, creditcard_or_authorization, options = {})
|
66
66
|
if creditcard_or_authorization.is_a?(String)
|
67
|
-
|
67
|
+
deprecated CREDIT_DEPRECATION_MESSAGE
|
68
68
|
refund(money, creditcard_or_authorization, options)
|
69
69
|
else
|
70
70
|
credit_new_order(money, creditcard_or_authorization, options)
|
@@ -12,12 +12,19 @@ module ActiveMerchant #:nodoc:
|
|
12
12
|
# * +PA+ - Pre Authorization
|
13
13
|
# * +PAC+ - Pre Authorization Completion
|
14
14
|
#
|
15
|
+
# == Secure Payment Profiles:
|
16
|
+
# BeanStream supports payment profiles (vaults). This allows you to store cc information with BeanStream and process subsequent transactions with a customer id.
|
17
|
+
# Secure Payment Profiles must be enabled on your account (must be done over the phone).
|
18
|
+
# Your API Access Passcode must be set in Administration => account settings => order settings.
|
19
|
+
# To learn more about storing credit cards with the Beanstream gateway, please read the BEAN_Payment_Profiles.pdf (I had to phone BeanStream to request it.)
|
20
|
+
#
|
15
21
|
# == Notes
|
16
22
|
# * Recurring billing is not yet implemented.
|
17
23
|
# * Adding of order products information is not implemented.
|
18
24
|
# * Ensure that country and province data is provided as a code such as "CA", "US", "QC".
|
19
25
|
# * login is the Beanstream merchant ID, username and password should be enabled in your Beanstream account and passed in using the <tt>:user</tt> and <tt>:password</tt> options.
|
20
26
|
# * Test your app with your true merchant id and test credit card information provided in the api pdf document.
|
27
|
+
# * Beanstream does not allow Payment Profiles to be deleted with their API. The accounts are 'closed', but have to be deleted manually.
|
21
28
|
#
|
22
29
|
# Example authorization (Beanstream PA transaction type):
|
23
30
|
#
|
@@ -58,11 +65,11 @@ module ActiveMerchant #:nodoc:
|
|
58
65
|
class BeanstreamGateway < Gateway
|
59
66
|
include BeanstreamCore
|
60
67
|
|
61
|
-
def authorize(money,
|
68
|
+
def authorize(money, source, options = {})
|
62
69
|
post = {}
|
63
70
|
add_amount(post, money)
|
64
71
|
add_invoice(post, options)
|
65
|
-
|
72
|
+
add_source(post, source)
|
66
73
|
add_address(post, options)
|
67
74
|
add_transaction_type(post, :authorization)
|
68
75
|
commit(post)
|
@@ -91,6 +98,36 @@ module ActiveMerchant #:nodoc:
|
|
91
98
|
def interac
|
92
99
|
@interac ||= BeanstreamInteracGateway.new(@options)
|
93
100
|
end
|
101
|
+
|
102
|
+
# To match the other stored-value gateways, like TrustCommerce,
|
103
|
+
# store and unstore need to be defined
|
104
|
+
def store(credit_card, options = {})
|
105
|
+
post = {}
|
106
|
+
add_address(post, options)
|
107
|
+
add_credit_card(post, credit_card)
|
108
|
+
add_secure_profile_variables(post,options)
|
109
|
+
commit(post, true)
|
110
|
+
end
|
111
|
+
|
112
|
+
#can't actually delete a secure profile with the supplicaed API. This function sets the status of the profile to closed (C).
|
113
|
+
#Closed profiles will have to removed manually.
|
114
|
+
def delete(vault_id)
|
115
|
+
update(vault_id, false, {:status => "C"})
|
116
|
+
end
|
117
|
+
|
118
|
+
alias_method :unstore, :delete
|
119
|
+
|
120
|
+
# Update the values (such as CC expiration) stored at
|
121
|
+
# the gateway. The CC number must be supplied in the
|
122
|
+
# CreditCard object.
|
123
|
+
def update(vault_id, credit_card, options = {})
|
124
|
+
post = {}
|
125
|
+
add_address(post, options)
|
126
|
+
add_credit_card(post, credit_card)
|
127
|
+
options.merge!({:vault_id => vault_id, :operation => secure_profile_action(:modify)})
|
128
|
+
add_secure_profile_variables(post,options)
|
129
|
+
commit(post, true)
|
130
|
+
end
|
94
131
|
|
95
132
|
private
|
96
133
|
def build_response(*args)
|
@@ -2,17 +2,24 @@ module ActiveMerchant #:nodoc:
|
|
2
2
|
module Billing #:nodoc:
|
3
3
|
module BeanstreamCore
|
4
4
|
URL = 'https://www.beanstream.com/scripts/process_transaction.asp'
|
5
|
+
SECURE_PROFILE_URL = 'https://www.beanstream.com/scripts/payment_profile.asp'
|
6
|
+
SP_SERVICE_VERSION = '1.1'
|
5
7
|
|
6
8
|
TRANSACTIONS = {
|
7
9
|
:authorization => 'PA',
|
8
10
|
:purchase => 'P',
|
9
11
|
:capture => 'PAC',
|
10
|
-
:
|
12
|
+
:refund => 'R',
|
11
13
|
:void => 'VP',
|
12
14
|
:check_purchase => 'D',
|
13
|
-
:
|
15
|
+
:check_refund => 'C',
|
14
16
|
:void_purchase => 'VP',
|
15
|
-
:
|
17
|
+
:void_refund => 'VR'
|
18
|
+
}
|
19
|
+
|
20
|
+
PROFILE_OPERATIONS = {
|
21
|
+
:new => 'N',
|
22
|
+
:modify => 'M'
|
16
23
|
}
|
17
24
|
|
18
25
|
CVD_CODES = {
|
@@ -48,7 +55,7 @@ module ActiveMerchant #:nodoc:
|
|
48
55
|
|
49
56
|
# Only <tt>:login</tt> is required by default,
|
50
57
|
# which is the merchant's merchant ID. If you'd like to perform void,
|
51
|
-
# capture or
|
58
|
+
# capture or refund transactions then you'll also need to add a username
|
52
59
|
# and password to your account under administration -> account settings ->
|
53
60
|
# order settings -> Use username/password validation
|
54
61
|
def initialize(options = {})
|
@@ -67,26 +74,35 @@ module ActiveMerchant #:nodoc:
|
|
67
74
|
commit(post)
|
68
75
|
end
|
69
76
|
|
70
|
-
def
|
77
|
+
def refund(money, source, options = {})
|
71
78
|
post = {}
|
72
79
|
reference, amount, type = split_auth(source)
|
73
80
|
add_reference(post, reference)
|
74
|
-
add_transaction_type(post,
|
81
|
+
add_transaction_type(post, refund_action(type))
|
75
82
|
add_amount(post, money)
|
76
83
|
commit(post)
|
77
84
|
end
|
85
|
+
|
86
|
+
def credit(money, source, options = {})
|
87
|
+
deprecated CREDIT_DEPRECATION_MESSAGE
|
88
|
+
refund(money, source, options)
|
89
|
+
end
|
78
90
|
|
79
91
|
private
|
80
92
|
def purchase_action(source)
|
81
|
-
card_brand(source) == "check" ? :check_purchase : :purchase
|
93
|
+
(card_brand(source) == "check") ? :check_purchase : :purchase
|
82
94
|
end
|
83
95
|
|
84
96
|
def void_action(original_transaction_type)
|
85
|
-
original_transaction_type == TRANSACTIONS[:
|
97
|
+
(original_transaction_type == TRANSACTIONS[:refund]) ? :void_refund : :void_purchase
|
98
|
+
end
|
99
|
+
|
100
|
+
def refund_action(type)
|
101
|
+
(type == TRANSACTIONS[:check_purchase]) ? :check_refund : :refund
|
86
102
|
end
|
87
103
|
|
88
|
-
def
|
89
|
-
type
|
104
|
+
def secure_profile_action(type)
|
105
|
+
PROFILE_OPERATIONS[type] || PROFILE_OPERATIONS[:new]
|
90
106
|
end
|
91
107
|
|
92
108
|
def split_auth(string)
|
@@ -154,11 +170,13 @@ module ActiveMerchant #:nodoc:
|
|
154
170
|
end
|
155
171
|
|
156
172
|
def add_credit_card(post, credit_card)
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
173
|
+
if credit_card
|
174
|
+
post[:trnCardOwner] = credit_card.name
|
175
|
+
post[:trnCardNumber] = credit_card.number
|
176
|
+
post[:trnExpMonth] = format(credit_card.month, :two_digits)
|
177
|
+
post[:trnExpYear] = format(credit_card.year, :two_digits)
|
178
|
+
post[:trnCardCvd] = credit_card.verification_value
|
179
|
+
end
|
162
180
|
end
|
163
181
|
|
164
182
|
def add_check(post, check)
|
@@ -175,6 +193,16 @@ module ActiveMerchant #:nodoc:
|
|
175
193
|
post[:accountNumber] = check.account_number
|
176
194
|
end
|
177
195
|
|
196
|
+
def add_secure_profile_variables(post, options = {})
|
197
|
+
post[:serviceVersion] = SP_SERVICE_VERSION
|
198
|
+
post[:responseFormat] = 'QS'
|
199
|
+
post[:cardValidation] = (options[:cardValidation].to_i == 1) || '0'
|
200
|
+
|
201
|
+
post[:operationType] = options[:operationType] || options[:operation] || secure_profile_action(:new)
|
202
|
+
post[:customerCode] = options[:billing_id] || options[:vault_id] || false
|
203
|
+
post[:status] = options[:status]
|
204
|
+
end
|
205
|
+
|
178
206
|
def parse(body)
|
179
207
|
results = {}
|
180
208
|
if !body.nil?
|
@@ -194,12 +222,13 @@ module ActiveMerchant #:nodoc:
|
|
194
222
|
results
|
195
223
|
end
|
196
224
|
|
197
|
-
def commit(params)
|
198
|
-
post(post_data(params))
|
225
|
+
def commit(params, use_profile_api = false)
|
226
|
+
post(post_data(params,use_profile_api),use_profile_api)
|
199
227
|
end
|
200
228
|
|
201
|
-
def post(data)
|
202
|
-
response = parse(ssl_post(URL, data))
|
229
|
+
def post(data, use_profile_api=nil)
|
230
|
+
response = parse(ssl_post((use_profile_api ? SECURE_PROFILE_URL : URL), data))
|
231
|
+
response[:customer_vault_id] = response[:customerCode] if response[:customerCode]
|
203
232
|
build_response(success?(response), message_from(response), response,
|
204
233
|
:test => test? || response[:authCode] == "TEST",
|
205
234
|
:authorization => authorization_from(response),
|
@@ -213,26 +242,35 @@ module ActiveMerchant #:nodoc:
|
|
213
242
|
end
|
214
243
|
|
215
244
|
def message_from(response)
|
216
|
-
response[:messageText]
|
245
|
+
response[:messageText] || response[:responseMessage]
|
217
246
|
end
|
218
247
|
|
219
248
|
def success?(response)
|
220
|
-
response[:responseType] == 'R' || response[:trnApproved] == '1'
|
249
|
+
response[:responseType] == 'R' || response[:trnApproved] == '1' || response[:responseCode] == '1'
|
221
250
|
end
|
222
251
|
|
223
252
|
def add_source(post, source)
|
224
|
-
|
253
|
+
if source.is_a?(String) or source.is_a?(Integer)
|
254
|
+
post[:customerCode] = source
|
255
|
+
else
|
256
|
+
card_brand(source) == "check" ? add_check(post, source) : add_credit_card(post, source)
|
257
|
+
end
|
225
258
|
end
|
226
259
|
|
227
260
|
def add_transaction_type(post, action)
|
228
261
|
post[:trnType] = TRANSACTIONS[action]
|
229
262
|
end
|
230
263
|
|
231
|
-
def post_data(params)
|
264
|
+
def post_data(params, use_profile_api)
|
232
265
|
params[:requestType] = 'BACKEND'
|
233
|
-
|
234
|
-
|
235
|
-
|
266
|
+
if use_profile_api
|
267
|
+
params[:merchantId] = @options[:login]
|
268
|
+
params[:passCode] = @options[:secure_profile_api_key]
|
269
|
+
else
|
270
|
+
params[:username] = @options[:user] if @options[:user]
|
271
|
+
params[:password] = @options[:password] if @options[:password]
|
272
|
+
params[:merchant_id] = @options[:login]
|
273
|
+
end
|
236
274
|
params[:vbvEnabled] = '0'
|
237
275
|
params[:scEnabled] = '0'
|
238
276
|
|