gonow-activemerchant 1.15.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/CHANGELOG +690 -0
- data/CONTRIBUTORS +237 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +165 -0
- data/gem-public_cert.pem +20 -0
- data/lib/active_merchant.rb +47 -0
- data/lib/active_merchant/billing.rb +9 -0
- data/lib/active_merchant/billing/avs_result.rb +98 -0
- data/lib/active_merchant/billing/base.rb +57 -0
- data/lib/active_merchant/billing/check.rb +68 -0
- data/lib/active_merchant/billing/credit_card.rb +178 -0
- data/lib/active_merchant/billing/credit_card_formatting.rb +21 -0
- data/lib/active_merchant/billing/credit_card_methods.rb +125 -0
- data/lib/active_merchant/billing/cvv_result.rb +38 -0
- data/lib/active_merchant/billing/expiry_date.rb +34 -0
- data/lib/active_merchant/billing/gateway.rb +170 -0
- data/lib/active_merchant/billing/gateways.rb +18 -0
- data/lib/active_merchant/billing/gateways/authorize_net.rb +664 -0
- data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +858 -0
- data/lib/active_merchant/billing/gateways/barclays_epdq.rb +308 -0
- data/lib/active_merchant/billing/gateways/beanstream.rb +139 -0
- data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +282 -0
- data/lib/active_merchant/billing/gateways/beanstream_interac.rb +54 -0
- data/lib/active_merchant/billing/gateways/blue_pay.rb +11 -0
- data/lib/active_merchant/billing/gateways/bogus.rb +132 -0
- data/lib/active_merchant/billing/gateways/braintree.rb +17 -0
- data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +9 -0
- data/lib/active_merchant/billing/gateways/braintree_blue.rb +293 -0
- data/lib/active_merchant/billing/gateways/braintree_orange.rb +17 -0
- data/lib/active_merchant/billing/gateways/braspag.rb +188 -0
- data/lib/active_merchant/billing/gateways/card_stream.rb +230 -0
- data/lib/active_merchant/billing/gateways/cyber_source.rb +430 -0
- data/lib/active_merchant/billing/gateways/data_cash.rb +597 -0
- data/lib/active_merchant/billing/gateways/efsnet.rb +235 -0
- data/lib/active_merchant/billing/gateways/elavon.rb +134 -0
- data/lib/active_merchant/billing/gateways/epay.rb +268 -0
- data/lib/active_merchant/billing/gateways/eway.rb +277 -0
- data/lib/active_merchant/billing/gateways/eway_managed.rb +231 -0
- data/lib/active_merchant/billing/gateways/exact.rb +222 -0
- data/lib/active_merchant/billing/gateways/federated_canada.rb +168 -0
- data/lib/active_merchant/billing/gateways/first_pay.rb +177 -0
- data/lib/active_merchant/billing/gateways/garanti.rb +262 -0
- data/lib/active_merchant/billing/gateways/ideal/ideal_base.rb +250 -0
- data/lib/active_merchant/billing/gateways/ideal/ideal_rabobank.pem +13 -0
- data/lib/active_merchant/billing/gateways/ideal/ideal_response.rb +29 -0
- data/lib/active_merchant/billing/gateways/ideal_rabobank.rb +55 -0
- data/lib/active_merchant/billing/gateways/inspire.rb +221 -0
- data/lib/active_merchant/billing/gateways/instapay.rb +164 -0
- data/lib/active_merchant/billing/gateways/iridium.rb +258 -0
- data/lib/active_merchant/billing/gateways/jetpay.rb +276 -0
- data/lib/active_merchant/billing/gateways/linkpoint.rb +454 -0
- data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +156 -0
- data/lib/active_merchant/billing/gateways/merchant_ware.rb +289 -0
- data/lib/active_merchant/billing/gateways/modern_payments.rb +36 -0
- data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +220 -0
- data/lib/active_merchant/billing/gateways/moneris.rb +209 -0
- data/lib/active_merchant/billing/gateways/net_registry.rb +189 -0
- data/lib/active_merchant/billing/gateways/netaxept.rb +239 -0
- data/lib/active_merchant/billing/gateways/netbilling.rb +168 -0
- data/lib/active_merchant/billing/gateways/nmi.rb +13 -0
- data/lib/active_merchant/billing/gateways/ogone.rb +292 -0
- data/lib/active_merchant/billing/gateways/orbital.rb +321 -0
- data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +46 -0
- data/lib/active_merchant/billing/gateways/pay_junction.rb +392 -0
- data/lib/active_merchant/billing/gateways/pay_secure.rb +120 -0
- data/lib/active_merchant/billing/gateways/paybox_direct.rb +207 -0
- data/lib/active_merchant/billing/gateways/payflow.rb +253 -0
- data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +207 -0
- data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +39 -0
- data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
- data/lib/active_merchant/billing/gateways/payflow_express.rb +222 -0
- data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +15 -0
- data/lib/active_merchant/billing/gateways/payflow_uk.rb +21 -0
- data/lib/active_merchant/billing/gateways/payment_express.rb +235 -0
- data/lib/active_merchant/billing/gateways/paypal.rb +121 -0
- data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +351 -0
- data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +49 -0
- data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
- data/lib/active_merchant/billing/gateways/paypal_express.rb +177 -0
- data/lib/active_merchant/billing/gateways/paypal_express_common.rb +25 -0
- data/lib/active_merchant/billing/gateways/plugnpay.rb +298 -0
- data/lib/active_merchant/billing/gateways/psigate.rb +219 -0
- data/lib/active_merchant/billing/gateways/psl_card.rb +304 -0
- data/lib/active_merchant/billing/gateways/qbms.rb +295 -0
- data/lib/active_merchant/billing/gateways/quantum.rb +282 -0
- data/lib/active_merchant/billing/gateways/quickpay.rb +218 -0
- data/lib/active_merchant/billing/gateways/realex.rb +311 -0
- data/lib/active_merchant/billing/gateways/sage.rb +146 -0
- data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +88 -0
- data/lib/active_merchant/billing/gateways/sage/sage_core.rb +116 -0
- data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +97 -0
- data/lib/active_merchant/billing/gateways/sage_pay.rb +320 -0
- data/lib/active_merchant/billing/gateways/sallie_mae.rb +144 -0
- data/lib/active_merchant/billing/gateways/secure_net.rb +330 -0
- data/lib/active_merchant/billing/gateways/secure_pay.rb +31 -0
- data/lib/active_merchant/billing/gateways/secure_pay_au.rb +193 -0
- data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +113 -0
- data/lib/active_merchant/billing/gateways/skip_jack.rb +453 -0
- data/lib/active_merchant/billing/gateways/smart_ps.rb +271 -0
- data/lib/active_merchant/billing/gateways/stripe.rb +212 -0
- data/lib/active_merchant/billing/gateways/trans_first.rb +127 -0
- data/lib/active_merchant/billing/gateways/transax.rb +25 -0
- data/lib/active_merchant/billing/gateways/trust_commerce.rb +423 -0
- data/lib/active_merchant/billing/gateways/usa_epay.rb +194 -0
- data/lib/active_merchant/billing/gateways/verifi.rb +233 -0
- data/lib/active_merchant/billing/gateways/viaklix.rb +189 -0
- data/lib/active_merchant/billing/gateways/wirecard.rb +318 -0
- data/lib/active_merchant/billing/gateways/worldpay.rb +280 -0
- data/lib/active_merchant/billing/integrations.rb +17 -0
- data/lib/active_merchant/billing/integrations/action_view_helper.rb +68 -0
- data/lib/active_merchant/billing/integrations/bogus.rb +23 -0
- data/lib/active_merchant/billing/integrations/bogus/helper.rb +17 -0
- data/lib/active_merchant/billing/integrations/bogus/notification.rb +11 -0
- data/lib/active_merchant/billing/integrations/bogus/return.rb +10 -0
- data/lib/active_merchant/billing/integrations/chronopay.rb +23 -0
- data/lib/active_merchant/billing/integrations/chronopay/helper.rb +120 -0
- data/lib/active_merchant/billing/integrations/chronopay/notification.rb +158 -0
- data/lib/active_merchant/billing/integrations/chronopay/return.rb +10 -0
- data/lib/active_merchant/billing/integrations/direc_pay.rb +41 -0
- data/lib/active_merchant/billing/integrations/direc_pay/helper.rb +200 -0
- data/lib/active_merchant/billing/integrations/direc_pay/notification.rb +76 -0
- data/lib/active_merchant/billing/integrations/direc_pay/return.rb +32 -0
- data/lib/active_merchant/billing/integrations/direc_pay/status.rb +37 -0
- data/lib/active_merchant/billing/integrations/directebanking.rb +47 -0
- data/lib/active_merchant/billing/integrations/directebanking/helper.rb +90 -0
- data/lib/active_merchant/billing/integrations/directebanking/notification.rb +120 -0
- data/lib/active_merchant/billing/integrations/directebanking/return.rb +11 -0
- data/lib/active_merchant/billing/integrations/e_payment_plans.rb +48 -0
- data/lib/active_merchant/billing/integrations/e_payment_plans/helper.rb +34 -0
- data/lib/active_merchant/billing/integrations/e_payment_plans/notification.rb +84 -0
- data/lib/active_merchant/billing/integrations/gestpay.rb +25 -0
- data/lib/active_merchant/billing/integrations/gestpay/common.rb +42 -0
- data/lib/active_merchant/billing/integrations/gestpay/helper.rb +70 -0
- data/lib/active_merchant/billing/integrations/gestpay/notification.rb +85 -0
- data/lib/active_merchant/billing/integrations/gestpay/return.rb +10 -0
- data/lib/active_merchant/billing/integrations/helper.rb +96 -0
- data/lib/active_merchant/billing/integrations/hi_trust.rb +27 -0
- data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +58 -0
- data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +59 -0
- data/lib/active_merchant/billing/integrations/hi_trust/return.rb +67 -0
- data/lib/active_merchant/billing/integrations/moneybookers.rb +26 -0
- data/lib/active_merchant/billing/integrations/moneybookers/helper.rb +59 -0
- data/lib/active_merchant/billing/integrations/moneybookers/notification.rb +129 -0
- data/lib/active_merchant/billing/integrations/nochex.rb +88 -0
- data/lib/active_merchant/billing/integrations/nochex/helper.rb +68 -0
- data/lib/active_merchant/billing/integrations/nochex/notification.rb +94 -0
- data/lib/active_merchant/billing/integrations/nochex/return.rb +10 -0
- data/lib/active_merchant/billing/integrations/notification.rb +62 -0
- data/lib/active_merchant/billing/integrations/paypal.rb +39 -0
- data/lib/active_merchant/billing/integrations/paypal/helper.rb +119 -0
- data/lib/active_merchant/billing/integrations/paypal/notification.rb +154 -0
- data/lib/active_merchant/billing/integrations/paypal/return.rb +10 -0
- data/lib/active_merchant/billing/integrations/quickpay.rb +21 -0
- data/lib/active_merchant/billing/integrations/quickpay/helper.rb +72 -0
- data/lib/active_merchant/billing/integrations/quickpay/notification.rb +74 -0
- data/lib/active_merchant/billing/integrations/return.rb +42 -0
- data/lib/active_merchant/billing/integrations/sage_pay_form.rb +37 -0
- data/lib/active_merchant/billing/integrations/sage_pay_form/encryption.rb +33 -0
- data/lib/active_merchant/billing/integrations/sage_pay_form/helper.rb +111 -0
- data/lib/active_merchant/billing/integrations/sage_pay_form/notification.rb +210 -0
- data/lib/active_merchant/billing/integrations/sage_pay_form/return.rb +31 -0
- data/lib/active_merchant/billing/integrations/two_checkout.rb +23 -0
- data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +59 -0
- data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +114 -0
- data/lib/active_merchant/billing/integrations/two_checkout/return.rb +17 -0
- data/lib/active_merchant/billing/integrations/valitor.rb +33 -0
- data/lib/active_merchant/billing/integrations/valitor/helper.rb +86 -0
- data/lib/active_merchant/billing/integrations/valitor/notification.rb +13 -0
- data/lib/active_merchant/billing/integrations/valitor/response_fields.rb +97 -0
- data/lib/active_merchant/billing/integrations/valitor/return.rb +13 -0
- data/lib/active_merchant/billing/integrations/world_pay.rb +27 -0
- data/lib/active_merchant/billing/integrations/world_pay/helper.rb +100 -0
- data/lib/active_merchant/billing/integrations/world_pay/notification.rb +160 -0
- data/lib/active_merchant/billing/response.rb +32 -0
- data/lib/active_merchant/common.rb +14 -0
- data/lib/active_merchant/common/connection.rb +177 -0
- data/lib/active_merchant/common/country.rb +328 -0
- data/lib/active_merchant/common/error.rb +26 -0
- data/lib/active_merchant/common/post_data.rb +24 -0
- data/lib/active_merchant/common/posts_data.rb +63 -0
- data/lib/active_merchant/common/requires_parameters.rb +16 -0
- data/lib/active_merchant/common/utils.rb +22 -0
- data/lib/active_merchant/common/validateable.rb +81 -0
- data/lib/active_merchant/version.rb +3 -0
- data/lib/activemerchant.rb +1 -0
- data/lib/certs/cacert.pem +7815 -0
- data/lib/support/gateway_support.rb +58 -0
- data/lib/support/outbound_hosts.rb +25 -0
- metadata +276 -0
@@ -0,0 +1,146 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/sage/sage_bankcard'
|
2
|
+
require File.dirname(__FILE__) + '/sage/sage_virtual_check'
|
3
|
+
|
4
|
+
module ActiveMerchant #:nodoc:
|
5
|
+
module Billing #:nodoc:
|
6
|
+
class SageGateway < Gateway
|
7
|
+
self.supported_countries = SageBankcardGateway.supported_countries
|
8
|
+
self.supported_cardtypes = SageBankcardGateway.supported_cardtypes
|
9
|
+
|
10
|
+
# Creates a new SageGateway
|
11
|
+
#
|
12
|
+
# The gateway requires that a valid login and password be passed
|
13
|
+
# in the +options+ hash.
|
14
|
+
#
|
15
|
+
# ==== Options
|
16
|
+
#
|
17
|
+
# * <tt>:login</tt> - The Sage Payment Solutions Merchant ID Number.
|
18
|
+
# * <tt>:password</tt> - The Sage Payment Solutions Merchant Key Number.
|
19
|
+
def initialize(options = {})
|
20
|
+
requires!(options, :login, :password)
|
21
|
+
@options = options
|
22
|
+
super
|
23
|
+
end
|
24
|
+
|
25
|
+
# Performs an authorization transaction
|
26
|
+
#
|
27
|
+
# ==== Parameters
|
28
|
+
# * <tt>money</tt> - The amount to be authorized as an integer value in cents.
|
29
|
+
# * <tt>credit_card</tt> - The CreditCard object to be used as the funding source for the transaction.
|
30
|
+
# * <tt>options</tt> - A hash of optional parameters.
|
31
|
+
# * <tt>:order_id</tt> - A unique reference for this order. (maximum of 20 characters).
|
32
|
+
# * <tt>:email</tt> - The customer's email address
|
33
|
+
# * <tt>:customer</tt> - The Customer Number for Purchase Card Level II Transactions
|
34
|
+
# * <tt>:billing_address</tt> - The customer's billing address as a hash of address information.
|
35
|
+
# * <tt>:address1</tt> - The billing address street
|
36
|
+
# * <tt>:city</tt> - The billing address city
|
37
|
+
# * <tt>:state</tt> - The billing address state
|
38
|
+
# * <tt>:country</tt> - The 2 digit ISO billing address country code
|
39
|
+
# * <tt>:zip</tt> - The billing address zip code
|
40
|
+
# * <tt>:phone</tt> - The billing address phone number
|
41
|
+
# * <tt>:fax</tt> - The billing address fax number
|
42
|
+
# * <tt>:shipping_address</tt> - The customer's shipping address as a hash of address information.
|
43
|
+
# * <tt>:name</tt> - The name at the shipping address
|
44
|
+
# * <tt>:address1</tt> - The shipping address street
|
45
|
+
# * <tt>:city</tt> - The shipping address city
|
46
|
+
# * <tt>:state</tt> - The shipping address state code
|
47
|
+
# * <tt>:country</tt> - The 2 digit ISO shipping address country code
|
48
|
+
# * <tt>:zip</tt> - The shipping address zip code
|
49
|
+
# * <tt>:tax</tt> - The tax amount for the transaction as an Integer value in cents. Maps to Sage <tt>T_tax</tt>.
|
50
|
+
# * <tt>:shipping</tt> - The shipping amount for the transaction as an Integer value in cents. Maps to Sage <tt>T_shipping</tt>.
|
51
|
+
def authorize(money, credit_card, options = {})
|
52
|
+
bankcard.authorize(money, credit_card, options)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Performs a purchase, which is essentially an authorization and capture in a single operation.
|
56
|
+
#
|
57
|
+
# ==== Parameters
|
58
|
+
#
|
59
|
+
# * <tt>money</tt> - The amount to be authorized as an integer value in cents.
|
60
|
+
# * <tt>source</tt> - The CreditCard or Check object to be used as the funding source for the transaction.
|
61
|
+
# * <tt>options</tt> - A hash of optional parameters.
|
62
|
+
# * <tt>:order_id</tt> - A unique reference for this order. (maximum of 20 characters).
|
63
|
+
# * <tt>:email</tt> - The customer's email address
|
64
|
+
# * <tt>:customer</tt> - The Customer Number for Purchase Card Level II Transactions
|
65
|
+
# * <tt>:billing_address</tt> - The customer's billing address as a hash of address information.
|
66
|
+
# * <tt>:address1</tt> - The billing address street
|
67
|
+
# * <tt>:city</tt> - The billing address city
|
68
|
+
# * <tt>:state</tt> - The billing address state
|
69
|
+
# * <tt>:country</tt> - The 2 digit ISO billing address country code
|
70
|
+
# * <tt>:zip</tt> - The billing address zip code
|
71
|
+
# * <tt>:phone</tt> - The billing address phone number
|
72
|
+
# * <tt>:fax</tt> - The billing address fax number
|
73
|
+
# * <tt>:shipping_address</tt> - The customer's shipping address as a hash of address information.
|
74
|
+
# * <tt>:name</tt> - The name at the shipping address
|
75
|
+
# * <tt>:address1</tt> - The shipping address street
|
76
|
+
# * <tt>:city</tt> - The shipping address city
|
77
|
+
# * <tt>:state</tt> - The shipping address state code
|
78
|
+
# * <tt>:country</tt> - The 2 digit ISO shipping address country code
|
79
|
+
# * <tt>:zip</tt> - The shipping address zip code
|
80
|
+
# * <tt>:tax</tt> - The tax amount for the transaction as an integer value in cents. Maps to Sage <tt>T_tax</tt>.
|
81
|
+
# * <tt>:shipping</tt> - The shipping amount for the transaction as an integer value in cents. Maps to Sage <tt>T_shipping</tt>.
|
82
|
+
#
|
83
|
+
# ==== Additional options in the +options+ hash for when using a Check as the funding source
|
84
|
+
# * <tt>:originator_id</tt> - 10 digit originator. If not provided, Sage will use the default Originator ID for the specific customer type.
|
85
|
+
# * <tt>:addenda</tt> - Transaction addenda.
|
86
|
+
# * <tt>:ssn</tt> - The customer's Social Security Number.
|
87
|
+
# * <tt>:drivers_license_state</tt> - The customer's drivers license state code.
|
88
|
+
# * <tt>:drivers_license_number</tt> - The customer's drivers license number.
|
89
|
+
# * <tt>:date_of_birth</tt> - The customer's date of birth as a Time or Date object or a string in the format <tt>mm/dd/yyyy</tt>.
|
90
|
+
def purchase(money, source, options = {})
|
91
|
+
if card_brand(source) == "check"
|
92
|
+
virtual_check.purchase(money, source, options)
|
93
|
+
else
|
94
|
+
bankcard.purchase(money, source, options)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# Captures authorized funds.
|
99
|
+
#
|
100
|
+
# ==== Parameters
|
101
|
+
#
|
102
|
+
# * <tt>money</tt> - The amount to be authorized as an integer value in cents. Sage doesn't support changing the capture amount, so the full amount of the initial transaction will be captured.
|
103
|
+
# * <tt>reference</tt> - The authorization reference string returned by the original transaction's Response#authorization.
|
104
|
+
def capture(money, reference, options = {})
|
105
|
+
bankcard.capture(money, reference, options)
|
106
|
+
end
|
107
|
+
|
108
|
+
# Voids a prior transaction. Works for both CreditCard and Check transactions.
|
109
|
+
#
|
110
|
+
# ==== Parameters
|
111
|
+
#
|
112
|
+
# * <tt>reference</tt> - The authorization reference string returned by the original transaction's Response#authorization.
|
113
|
+
def void(reference, options = {})
|
114
|
+
if reference.split(";").last == "virtual_check"
|
115
|
+
virtual_check.void(reference, options)
|
116
|
+
else
|
117
|
+
bankcard.void(reference, options)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# Performs a credit transaction. (Sage +Credit+ transaction).
|
122
|
+
#
|
123
|
+
# ==== Parameters
|
124
|
+
#
|
125
|
+
# * <tt>money</tt> - The amount to be authorized as an integer value in cents.
|
126
|
+
# * <tt>source</tt> - The CreditCard or Check object to be used as the target for the credit.
|
127
|
+
def credit(money, source, options = {})
|
128
|
+
if card_brand(source) == "check"
|
129
|
+
virtual_check.credit(money, source, options)
|
130
|
+
else
|
131
|
+
bankcard.credit(money, source, options)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
private
|
136
|
+
def bankcard
|
137
|
+
@bankcard ||= SageBankcardGateway.new(@options)
|
138
|
+
end
|
139
|
+
|
140
|
+
def virtual_check
|
141
|
+
@virtual_check ||= SageVirtualCheckGateway.new(@options)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/sage_core'
|
2
|
+
|
3
|
+
module ActiveMerchant #:nodoc:
|
4
|
+
module Billing #:nodoc:
|
5
|
+
class SageBankcardGateway < Gateway #:nodoc:
|
6
|
+
include SageCore
|
7
|
+
self.url = 'https://www.sagepayments.net/cgi-bin/eftBankcard.dll?transaction'
|
8
|
+
self.source = 'bankcard'
|
9
|
+
|
10
|
+
# Credit cards supported by Sage
|
11
|
+
# * VISA
|
12
|
+
# * MasterCard
|
13
|
+
# * AMEX
|
14
|
+
# * Diners
|
15
|
+
# * Carte Blanche
|
16
|
+
# * Discover
|
17
|
+
# * JCB
|
18
|
+
# * Sears
|
19
|
+
self.supported_cardtypes = [:visa, :master, :american_express, :discover, :jcb, :diners_club]
|
20
|
+
|
21
|
+
def authorize(money, credit_card, options = {})
|
22
|
+
post = {}
|
23
|
+
add_credit_card(post, credit_card)
|
24
|
+
add_transaction_data(post, money, options)
|
25
|
+
commit(:authorization, post)
|
26
|
+
end
|
27
|
+
|
28
|
+
def purchase(money, credit_card, options = {})
|
29
|
+
post = {}
|
30
|
+
add_credit_card(post, credit_card)
|
31
|
+
add_transaction_data(post, money, options)
|
32
|
+
commit(:purchase, post)
|
33
|
+
end
|
34
|
+
|
35
|
+
# The +money+ amount is not used. The entire amount of the
|
36
|
+
# initial authorization will be captured.
|
37
|
+
def capture(money, reference, options = {})
|
38
|
+
post = {}
|
39
|
+
add_reference(post, reference)
|
40
|
+
commit(:capture, post)
|
41
|
+
end
|
42
|
+
|
43
|
+
def void(reference, options = {})
|
44
|
+
post = {}
|
45
|
+
add_reference(post, reference)
|
46
|
+
commit(:void, post)
|
47
|
+
end
|
48
|
+
|
49
|
+
def credit(money, credit_card, options = {})
|
50
|
+
post = {}
|
51
|
+
add_credit_card(post, credit_card)
|
52
|
+
add_transaction_data(post, money, options)
|
53
|
+
commit(:credit, post)
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
def exp_date(credit_card)
|
58
|
+
year = sprintf("%.4i", credit_card.year)
|
59
|
+
month = sprintf("%.2i", credit_card.month)
|
60
|
+
|
61
|
+
"#{month}#{year[-2..-1]}"
|
62
|
+
end
|
63
|
+
|
64
|
+
def add_credit_card(post, credit_card)
|
65
|
+
post[:C_name] = credit_card.name
|
66
|
+
post[:C_cardnumber] = credit_card.number
|
67
|
+
post[:C_exp] = exp_date(credit_card)
|
68
|
+
post[:C_cvv] = credit_card.verification_value if credit_card.verification_value?
|
69
|
+
end
|
70
|
+
|
71
|
+
def parse(data)
|
72
|
+
response = {}
|
73
|
+
response[:success] = data[1,1]
|
74
|
+
response[:code] = data[2,6]
|
75
|
+
response[:message] = data[8,32].strip
|
76
|
+
response[:front_end] = data[40, 2]
|
77
|
+
response[:cvv_result] = data[42, 1]
|
78
|
+
response[:avs_result] = data[43, 1].strip
|
79
|
+
response[:risk] = data[44, 2]
|
80
|
+
response[:reference] = data[46, 10]
|
81
|
+
|
82
|
+
response[:order_number], response[:recurring] = data[57...-1].split("\034")
|
83
|
+
response
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
@@ -0,0 +1,116 @@
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
2
|
+
module Billing #:nodoc:
|
3
|
+
module SageCore #:nodoc:
|
4
|
+
def self.included(base)
|
5
|
+
base.cattr_accessor :url
|
6
|
+
base.cattr_accessor :source
|
7
|
+
base.supported_countries = ['US', 'CA']
|
8
|
+
base.homepage_url = 'http://www.sagepayments.com'
|
9
|
+
base.display_name = 'Sage Payment Solutions'
|
10
|
+
end
|
11
|
+
|
12
|
+
# Transactions types:
|
13
|
+
# <tt>01</tt> - Sale
|
14
|
+
# <tt>02</tt> - AuthOnly
|
15
|
+
# <tt>03</tt> - Force/PriorAuthSale
|
16
|
+
# <tt>04</tt> - Void
|
17
|
+
# <tt>06</tt> - Credit
|
18
|
+
# <tt>11</tt> - PriorAuthSale by Reference*
|
19
|
+
TRANSACTIONS = {
|
20
|
+
:purchase => '01',
|
21
|
+
:authorization => '02',
|
22
|
+
:capture => '11',
|
23
|
+
:void => '04',
|
24
|
+
:credit => '06'
|
25
|
+
}
|
26
|
+
|
27
|
+
def initialize(options = {})
|
28
|
+
requires!(options, :login, :password)
|
29
|
+
@options = options
|
30
|
+
super
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
def add_invoice(post, options)
|
35
|
+
post[:T_ordernum] = options[:order_id].slice(0, 20)
|
36
|
+
post[:T_tax] = amount(options[:tax]) unless options[:tax].blank?
|
37
|
+
post[:T_shipping] = amount(options[:shipping]) unless options[:shipping].blank?
|
38
|
+
end
|
39
|
+
|
40
|
+
def add_reference(post, reference)
|
41
|
+
ref, source = reference.to_s.split(";")
|
42
|
+
post[:T_reference] = ref
|
43
|
+
end
|
44
|
+
|
45
|
+
def add_amount(post, money)
|
46
|
+
post[:T_amt] = amount(money)
|
47
|
+
end
|
48
|
+
|
49
|
+
def add_customer_data(post, options)
|
50
|
+
post[:T_customer_number] = options[:customer]
|
51
|
+
end
|
52
|
+
|
53
|
+
def add_addresses(post, options)
|
54
|
+
billing_address = options[:billing_address] || options[:address] || {}
|
55
|
+
|
56
|
+
post[:C_address] = billing_address[:address1]
|
57
|
+
post[:C_city] = billing_address[:city]
|
58
|
+
|
59
|
+
if ['US', 'CA'].include?(billing_address[:country])
|
60
|
+
post[:C_state] = billing_address[:state]
|
61
|
+
else
|
62
|
+
post[:C_state] = "Outside of United States"
|
63
|
+
end
|
64
|
+
|
65
|
+
post[:C_zip] = billing_address[:zip]
|
66
|
+
post[:C_country] = billing_address[:country]
|
67
|
+
post[:C_telephone] = billing_address[:phone]
|
68
|
+
post[:C_fax] = billing_address[:fax]
|
69
|
+
post[:C_email] = options[:email]
|
70
|
+
|
71
|
+
if shipping_address = options[:shipping_address]
|
72
|
+
post[:C_ship_name] = shipping_address[:name]
|
73
|
+
post[:C_ship_address] = shipping_address[:address1]
|
74
|
+
post[:C_ship_city] = shipping_address[:city]
|
75
|
+
post[:C_ship_state] = shipping_address[:state]
|
76
|
+
post[:C_ship_zip] = shipping_address[:zip]
|
77
|
+
post[:C_ship_country] = shipping_address[:country]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def add_transaction_data(post, money, options)
|
82
|
+
add_amount(post, money)
|
83
|
+
add_invoice(post, options)
|
84
|
+
add_addresses(post, options)
|
85
|
+
add_customer_data(post, options)
|
86
|
+
end
|
87
|
+
|
88
|
+
def commit(action, params)
|
89
|
+
response = parse(ssl_post(url, post_data(action, params)))
|
90
|
+
|
91
|
+
Response.new(success?(response), response[:message], response,
|
92
|
+
:test => test?,
|
93
|
+
:authorization => authorization_from(response),
|
94
|
+
:avs_result => { :code => response[:avs_result] },
|
95
|
+
:cvv_result => response[:cvv_result]
|
96
|
+
)
|
97
|
+
end
|
98
|
+
|
99
|
+
def authorization_from(response)
|
100
|
+
"#{response[:reference]};#{source}"
|
101
|
+
end
|
102
|
+
|
103
|
+
def success?(response)
|
104
|
+
response[:success] == 'A'
|
105
|
+
end
|
106
|
+
|
107
|
+
def post_data(action, params = {})
|
108
|
+
params[:M_id] = @options[:login]
|
109
|
+
params[:M_key] = @options[:password]
|
110
|
+
params[:T_code] = TRANSACTIONS[action]
|
111
|
+
|
112
|
+
params.collect { |key, value| "#{key}=#{CGI.escape(value.to_s)}" }.join("&")
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/sage_core'
|
2
|
+
|
3
|
+
module ActiveMerchant #:nodoc:
|
4
|
+
module Billing #:nodoc:
|
5
|
+
class SageVirtualCheckGateway < Gateway #:nodoc:
|
6
|
+
include SageCore
|
7
|
+
self.url = 'https://www.sagepayments.net/cgi-bin/eftVirtualCheck.dll?transaction'
|
8
|
+
self.source = 'virtual_check'
|
9
|
+
|
10
|
+
def purchase(money, credit_card, options = {})
|
11
|
+
post = {}
|
12
|
+
add_check(post, credit_card)
|
13
|
+
add_check_customer_data(post, options)
|
14
|
+
add_transaction_data(post, money, options)
|
15
|
+
commit(:purchase, post)
|
16
|
+
end
|
17
|
+
|
18
|
+
def void(reference, options = {})
|
19
|
+
post = {}
|
20
|
+
add_reference(post, reference)
|
21
|
+
commit(:void, post)
|
22
|
+
end
|
23
|
+
|
24
|
+
def credit(money, credit_card, options = {})
|
25
|
+
post = {}
|
26
|
+
add_check(post, credit_card)
|
27
|
+
add_check_customer_data(post, options)
|
28
|
+
add_transaction_data(post, money, options)
|
29
|
+
commit(:credit, post)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
def add_check(post, check)
|
34
|
+
post[:C_first_name] = check.first_name
|
35
|
+
post[:C_last_name] = check.last_name
|
36
|
+
post[:C_rte] = check.routing_number
|
37
|
+
post[:C_acct] = check.account_number
|
38
|
+
post[:C_check_number] = check.number
|
39
|
+
post[:C_acct_type] = account_type(check)
|
40
|
+
end
|
41
|
+
|
42
|
+
def add_check_customer_data(post, options)
|
43
|
+
# Required Customer Type – (NACHA Transaction Class)
|
44
|
+
# CCD for Commercial, Merchant Initiated
|
45
|
+
# PPD for Personal, Merchant Initiated
|
46
|
+
# WEB for Internet, Consumer Initiated
|
47
|
+
# RCK for Returned Checks
|
48
|
+
# ARC for Account Receivable Entry
|
49
|
+
# TEL for TelephoneInitiated
|
50
|
+
post[:C_customer_type] = "WEB"
|
51
|
+
|
52
|
+
# Optional 10 Digit Originator ID – Assigned By for each transaction class or business purpose. If not provided, the default Originator ID for the specific Customer Type will be applied.
|
53
|
+
post[:C_originator_id] = options[:originator_id]
|
54
|
+
|
55
|
+
# Optional Transaction Addenda
|
56
|
+
post[:T_addenda] = options[:addenda]
|
57
|
+
|
58
|
+
# Required Check Writer Social Security Number ( Numbers Only, No Dashes )
|
59
|
+
post[:C_ssn] = options[:ssn].to_s.gsub(/[^\d]/, '')
|
60
|
+
|
61
|
+
post[:C_dl_state_code] = options[:drivers_license_state]
|
62
|
+
post[:C_dl_number] = options[:drivers_license_number]
|
63
|
+
post[:C_dob] = format_birth_date(options[:date_of_birth])
|
64
|
+
end
|
65
|
+
|
66
|
+
def format_birth_date(date)
|
67
|
+
date.respond_to?(:strftime) ? date.strftime("%m/%d/%Y") : date
|
68
|
+
end
|
69
|
+
|
70
|
+
# DDA for Checking
|
71
|
+
# SAV for Savings
|
72
|
+
def account_type(check)
|
73
|
+
case check.account_type
|
74
|
+
when 'checking' then 'DDA'
|
75
|
+
when 'savings' then 'SAV'
|
76
|
+
else raise ArgumentError, "Unknown account type #{check.account_type}"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def parse(data)
|
81
|
+
response = {}
|
82
|
+
response[:success] = data[1,1]
|
83
|
+
response[:code] = data[2,6].strip
|
84
|
+
response[:message] = data[8,32].strip
|
85
|
+
response[:risk] = data[40, 2]
|
86
|
+
response[:reference] = data[42, 10]
|
87
|
+
|
88
|
+
extra_data = data[53...-1].split("\034")
|
89
|
+
response[:order_number] = extra_data[0]
|
90
|
+
response[:authentication_indicator] = extra_data[1]
|
91
|
+
response[:authentication_disclosure] = extra_data[2]
|
92
|
+
response
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|