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.
Files changed (189) hide show
  1. data/CHANGELOG +690 -0
  2. data/CONTRIBUTORS +237 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.rdoc +165 -0
  5. data/gem-public_cert.pem +20 -0
  6. data/lib/active_merchant.rb +47 -0
  7. data/lib/active_merchant/billing.rb +9 -0
  8. data/lib/active_merchant/billing/avs_result.rb +98 -0
  9. data/lib/active_merchant/billing/base.rb +57 -0
  10. data/lib/active_merchant/billing/check.rb +68 -0
  11. data/lib/active_merchant/billing/credit_card.rb +178 -0
  12. data/lib/active_merchant/billing/credit_card_formatting.rb +21 -0
  13. data/lib/active_merchant/billing/credit_card_methods.rb +125 -0
  14. data/lib/active_merchant/billing/cvv_result.rb +38 -0
  15. data/lib/active_merchant/billing/expiry_date.rb +34 -0
  16. data/lib/active_merchant/billing/gateway.rb +170 -0
  17. data/lib/active_merchant/billing/gateways.rb +18 -0
  18. data/lib/active_merchant/billing/gateways/authorize_net.rb +664 -0
  19. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +858 -0
  20. data/lib/active_merchant/billing/gateways/barclays_epdq.rb +308 -0
  21. data/lib/active_merchant/billing/gateways/beanstream.rb +139 -0
  22. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +282 -0
  23. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +54 -0
  24. data/lib/active_merchant/billing/gateways/blue_pay.rb +11 -0
  25. data/lib/active_merchant/billing/gateways/bogus.rb +132 -0
  26. data/lib/active_merchant/billing/gateways/braintree.rb +17 -0
  27. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +9 -0
  28. data/lib/active_merchant/billing/gateways/braintree_blue.rb +293 -0
  29. data/lib/active_merchant/billing/gateways/braintree_orange.rb +17 -0
  30. data/lib/active_merchant/billing/gateways/braspag.rb +188 -0
  31. data/lib/active_merchant/billing/gateways/card_stream.rb +230 -0
  32. data/lib/active_merchant/billing/gateways/cyber_source.rb +430 -0
  33. data/lib/active_merchant/billing/gateways/data_cash.rb +597 -0
  34. data/lib/active_merchant/billing/gateways/efsnet.rb +235 -0
  35. data/lib/active_merchant/billing/gateways/elavon.rb +134 -0
  36. data/lib/active_merchant/billing/gateways/epay.rb +268 -0
  37. data/lib/active_merchant/billing/gateways/eway.rb +277 -0
  38. data/lib/active_merchant/billing/gateways/eway_managed.rb +231 -0
  39. data/lib/active_merchant/billing/gateways/exact.rb +222 -0
  40. data/lib/active_merchant/billing/gateways/federated_canada.rb +168 -0
  41. data/lib/active_merchant/billing/gateways/first_pay.rb +177 -0
  42. data/lib/active_merchant/billing/gateways/garanti.rb +262 -0
  43. data/lib/active_merchant/billing/gateways/ideal/ideal_base.rb +250 -0
  44. data/lib/active_merchant/billing/gateways/ideal/ideal_rabobank.pem +13 -0
  45. data/lib/active_merchant/billing/gateways/ideal/ideal_response.rb +29 -0
  46. data/lib/active_merchant/billing/gateways/ideal_rabobank.rb +55 -0
  47. data/lib/active_merchant/billing/gateways/inspire.rb +221 -0
  48. data/lib/active_merchant/billing/gateways/instapay.rb +164 -0
  49. data/lib/active_merchant/billing/gateways/iridium.rb +258 -0
  50. data/lib/active_merchant/billing/gateways/jetpay.rb +276 -0
  51. data/lib/active_merchant/billing/gateways/linkpoint.rb +454 -0
  52. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +156 -0
  53. data/lib/active_merchant/billing/gateways/merchant_ware.rb +289 -0
  54. data/lib/active_merchant/billing/gateways/modern_payments.rb +36 -0
  55. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +220 -0
  56. data/lib/active_merchant/billing/gateways/moneris.rb +209 -0
  57. data/lib/active_merchant/billing/gateways/net_registry.rb +189 -0
  58. data/lib/active_merchant/billing/gateways/netaxept.rb +239 -0
  59. data/lib/active_merchant/billing/gateways/netbilling.rb +168 -0
  60. data/lib/active_merchant/billing/gateways/nmi.rb +13 -0
  61. data/lib/active_merchant/billing/gateways/ogone.rb +292 -0
  62. data/lib/active_merchant/billing/gateways/orbital.rb +321 -0
  63. data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +46 -0
  64. data/lib/active_merchant/billing/gateways/pay_junction.rb +392 -0
  65. data/lib/active_merchant/billing/gateways/pay_secure.rb +120 -0
  66. data/lib/active_merchant/billing/gateways/paybox_direct.rb +207 -0
  67. data/lib/active_merchant/billing/gateways/payflow.rb +253 -0
  68. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +207 -0
  69. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +39 -0
  70. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
  71. data/lib/active_merchant/billing/gateways/payflow_express.rb +222 -0
  72. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +15 -0
  73. data/lib/active_merchant/billing/gateways/payflow_uk.rb +21 -0
  74. data/lib/active_merchant/billing/gateways/payment_express.rb +235 -0
  75. data/lib/active_merchant/billing/gateways/paypal.rb +121 -0
  76. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +351 -0
  77. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +49 -0
  78. data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
  79. data/lib/active_merchant/billing/gateways/paypal_express.rb +177 -0
  80. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +25 -0
  81. data/lib/active_merchant/billing/gateways/plugnpay.rb +298 -0
  82. data/lib/active_merchant/billing/gateways/psigate.rb +219 -0
  83. data/lib/active_merchant/billing/gateways/psl_card.rb +304 -0
  84. data/lib/active_merchant/billing/gateways/qbms.rb +295 -0
  85. data/lib/active_merchant/billing/gateways/quantum.rb +282 -0
  86. data/lib/active_merchant/billing/gateways/quickpay.rb +218 -0
  87. data/lib/active_merchant/billing/gateways/realex.rb +311 -0
  88. data/lib/active_merchant/billing/gateways/sage.rb +146 -0
  89. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +88 -0
  90. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +116 -0
  91. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +97 -0
  92. data/lib/active_merchant/billing/gateways/sage_pay.rb +320 -0
  93. data/lib/active_merchant/billing/gateways/sallie_mae.rb +144 -0
  94. data/lib/active_merchant/billing/gateways/secure_net.rb +330 -0
  95. data/lib/active_merchant/billing/gateways/secure_pay.rb +31 -0
  96. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +193 -0
  97. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +113 -0
  98. data/lib/active_merchant/billing/gateways/skip_jack.rb +453 -0
  99. data/lib/active_merchant/billing/gateways/smart_ps.rb +271 -0
  100. data/lib/active_merchant/billing/gateways/stripe.rb +212 -0
  101. data/lib/active_merchant/billing/gateways/trans_first.rb +127 -0
  102. data/lib/active_merchant/billing/gateways/transax.rb +25 -0
  103. data/lib/active_merchant/billing/gateways/trust_commerce.rb +423 -0
  104. data/lib/active_merchant/billing/gateways/usa_epay.rb +194 -0
  105. data/lib/active_merchant/billing/gateways/verifi.rb +233 -0
  106. data/lib/active_merchant/billing/gateways/viaklix.rb +189 -0
  107. data/lib/active_merchant/billing/gateways/wirecard.rb +318 -0
  108. data/lib/active_merchant/billing/gateways/worldpay.rb +280 -0
  109. data/lib/active_merchant/billing/integrations.rb +17 -0
  110. data/lib/active_merchant/billing/integrations/action_view_helper.rb +68 -0
  111. data/lib/active_merchant/billing/integrations/bogus.rb +23 -0
  112. data/lib/active_merchant/billing/integrations/bogus/helper.rb +17 -0
  113. data/lib/active_merchant/billing/integrations/bogus/notification.rb +11 -0
  114. data/lib/active_merchant/billing/integrations/bogus/return.rb +10 -0
  115. data/lib/active_merchant/billing/integrations/chronopay.rb +23 -0
  116. data/lib/active_merchant/billing/integrations/chronopay/helper.rb +120 -0
  117. data/lib/active_merchant/billing/integrations/chronopay/notification.rb +158 -0
  118. data/lib/active_merchant/billing/integrations/chronopay/return.rb +10 -0
  119. data/lib/active_merchant/billing/integrations/direc_pay.rb +41 -0
  120. data/lib/active_merchant/billing/integrations/direc_pay/helper.rb +200 -0
  121. data/lib/active_merchant/billing/integrations/direc_pay/notification.rb +76 -0
  122. data/lib/active_merchant/billing/integrations/direc_pay/return.rb +32 -0
  123. data/lib/active_merchant/billing/integrations/direc_pay/status.rb +37 -0
  124. data/lib/active_merchant/billing/integrations/directebanking.rb +47 -0
  125. data/lib/active_merchant/billing/integrations/directebanking/helper.rb +90 -0
  126. data/lib/active_merchant/billing/integrations/directebanking/notification.rb +120 -0
  127. data/lib/active_merchant/billing/integrations/directebanking/return.rb +11 -0
  128. data/lib/active_merchant/billing/integrations/e_payment_plans.rb +48 -0
  129. data/lib/active_merchant/billing/integrations/e_payment_plans/helper.rb +34 -0
  130. data/lib/active_merchant/billing/integrations/e_payment_plans/notification.rb +84 -0
  131. data/lib/active_merchant/billing/integrations/gestpay.rb +25 -0
  132. data/lib/active_merchant/billing/integrations/gestpay/common.rb +42 -0
  133. data/lib/active_merchant/billing/integrations/gestpay/helper.rb +70 -0
  134. data/lib/active_merchant/billing/integrations/gestpay/notification.rb +85 -0
  135. data/lib/active_merchant/billing/integrations/gestpay/return.rb +10 -0
  136. data/lib/active_merchant/billing/integrations/helper.rb +96 -0
  137. data/lib/active_merchant/billing/integrations/hi_trust.rb +27 -0
  138. data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +58 -0
  139. data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +59 -0
  140. data/lib/active_merchant/billing/integrations/hi_trust/return.rb +67 -0
  141. data/lib/active_merchant/billing/integrations/moneybookers.rb +26 -0
  142. data/lib/active_merchant/billing/integrations/moneybookers/helper.rb +59 -0
  143. data/lib/active_merchant/billing/integrations/moneybookers/notification.rb +129 -0
  144. data/lib/active_merchant/billing/integrations/nochex.rb +88 -0
  145. data/lib/active_merchant/billing/integrations/nochex/helper.rb +68 -0
  146. data/lib/active_merchant/billing/integrations/nochex/notification.rb +94 -0
  147. data/lib/active_merchant/billing/integrations/nochex/return.rb +10 -0
  148. data/lib/active_merchant/billing/integrations/notification.rb +62 -0
  149. data/lib/active_merchant/billing/integrations/paypal.rb +39 -0
  150. data/lib/active_merchant/billing/integrations/paypal/helper.rb +119 -0
  151. data/lib/active_merchant/billing/integrations/paypal/notification.rb +154 -0
  152. data/lib/active_merchant/billing/integrations/paypal/return.rb +10 -0
  153. data/lib/active_merchant/billing/integrations/quickpay.rb +21 -0
  154. data/lib/active_merchant/billing/integrations/quickpay/helper.rb +72 -0
  155. data/lib/active_merchant/billing/integrations/quickpay/notification.rb +74 -0
  156. data/lib/active_merchant/billing/integrations/return.rb +42 -0
  157. data/lib/active_merchant/billing/integrations/sage_pay_form.rb +37 -0
  158. data/lib/active_merchant/billing/integrations/sage_pay_form/encryption.rb +33 -0
  159. data/lib/active_merchant/billing/integrations/sage_pay_form/helper.rb +111 -0
  160. data/lib/active_merchant/billing/integrations/sage_pay_form/notification.rb +210 -0
  161. data/lib/active_merchant/billing/integrations/sage_pay_form/return.rb +31 -0
  162. data/lib/active_merchant/billing/integrations/two_checkout.rb +23 -0
  163. data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +59 -0
  164. data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +114 -0
  165. data/lib/active_merchant/billing/integrations/two_checkout/return.rb +17 -0
  166. data/lib/active_merchant/billing/integrations/valitor.rb +33 -0
  167. data/lib/active_merchant/billing/integrations/valitor/helper.rb +86 -0
  168. data/lib/active_merchant/billing/integrations/valitor/notification.rb +13 -0
  169. data/lib/active_merchant/billing/integrations/valitor/response_fields.rb +97 -0
  170. data/lib/active_merchant/billing/integrations/valitor/return.rb +13 -0
  171. data/lib/active_merchant/billing/integrations/world_pay.rb +27 -0
  172. data/lib/active_merchant/billing/integrations/world_pay/helper.rb +100 -0
  173. data/lib/active_merchant/billing/integrations/world_pay/notification.rb +160 -0
  174. data/lib/active_merchant/billing/response.rb +32 -0
  175. data/lib/active_merchant/common.rb +14 -0
  176. data/lib/active_merchant/common/connection.rb +177 -0
  177. data/lib/active_merchant/common/country.rb +328 -0
  178. data/lib/active_merchant/common/error.rb +26 -0
  179. data/lib/active_merchant/common/post_data.rb +24 -0
  180. data/lib/active_merchant/common/posts_data.rb +63 -0
  181. data/lib/active_merchant/common/requires_parameters.rb +16 -0
  182. data/lib/active_merchant/common/utils.rb +22 -0
  183. data/lib/active_merchant/common/validateable.rb +81 -0
  184. data/lib/active_merchant/version.rb +3 -0
  185. data/lib/activemerchant.rb +1 -0
  186. data/lib/certs/cacert.pem +7815 -0
  187. data/lib/support/gateway_support.rb +58 -0
  188. data/lib/support/outbound_hosts.rb +25 -0
  189. 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
+