tlconnor-activemerchant 1.20.4

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 (195) hide show
  1. data/CHANGELOG +805 -0
  2. data/CONTRIBUTORS +274 -0
  3. data/MIT-LICENSE +20 -0
  4. data/gem-public_cert.pem +20 -0
  5. data/lib/active_merchant.rb +63 -0
  6. data/lib/active_merchant/billing.rb +9 -0
  7. data/lib/active_merchant/billing/avs_result.rb +98 -0
  8. data/lib/active_merchant/billing/base.rb +57 -0
  9. data/lib/active_merchant/billing/check.rb +68 -0
  10. data/lib/active_merchant/billing/credit_card.rb +264 -0
  11. data/lib/active_merchant/billing/credit_card_formatting.rb +21 -0
  12. data/lib/active_merchant/billing/credit_card_methods.rb +129 -0
  13. data/lib/active_merchant/billing/cvv_result.rb +38 -0
  14. data/lib/active_merchant/billing/expiry_date.rb +34 -0
  15. data/lib/active_merchant/billing/gateway.rb +170 -0
  16. data/lib/active_merchant/billing/gateways.rb +18 -0
  17. data/lib/active_merchant/billing/gateways/authorize_net.rb +694 -0
  18. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +944 -0
  19. data/lib/active_merchant/billing/gateways/barclays_epdq.rb +308 -0
  20. data/lib/active_merchant/billing/gateways/beanstream.rb +167 -0
  21. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +388 -0
  22. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +54 -0
  23. data/lib/active_merchant/billing/gateways/blue_pay.rb +11 -0
  24. data/lib/active_merchant/billing/gateways/bogus.rb +142 -0
  25. data/lib/active_merchant/billing/gateways/braintree.rb +17 -0
  26. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +9 -0
  27. data/lib/active_merchant/billing/gateways/braintree_blue.rb +308 -0
  28. data/lib/active_merchant/billing/gateways/braintree_orange.rb +21 -0
  29. data/lib/active_merchant/billing/gateways/card_save.rb +23 -0
  30. data/lib/active_merchant/billing/gateways/card_stream.rb +230 -0
  31. data/lib/active_merchant/billing/gateways/certo_direct.rb +279 -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 +135 -0
  36. data/lib/active_merchant/billing/gateways/epay.rb +274 -0
  37. data/lib/active_merchant/billing/gateways/eway.rb +277 -0
  38. data/lib/active_merchant/billing/gateways/eway_managed.rb +265 -0
  39. data/lib/active_merchant/billing/gateways/exact.rb +227 -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 +157 -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 +239 -0
  57. data/lib/active_merchant/billing/gateways/nab_transact.rb +244 -0
  58. data/lib/active_merchant/billing/gateways/net_registry.rb +189 -0
  59. data/lib/active_merchant/billing/gateways/netaxept.rb +239 -0
  60. data/lib/active_merchant/billing/gateways/netbilling.rb +168 -0
  61. data/lib/active_merchant/billing/gateways/nmi.rb +13 -0
  62. data/lib/active_merchant/billing/gateways/ogone.rb +330 -0
  63. data/lib/active_merchant/billing/gateways/optimal_payment.rb +277 -0
  64. data/lib/active_merchant/billing/gateways/orbital.rb +344 -0
  65. data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +46 -0
  66. data/lib/active_merchant/billing/gateways/pay_junction.rb +397 -0
  67. data/lib/active_merchant/billing/gateways/pay_secure.rb +120 -0
  68. data/lib/active_merchant/billing/gateways/paybox_direct.rb +207 -0
  69. data/lib/active_merchant/billing/gateways/payflow.rb +261 -0
  70. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +208 -0
  71. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +39 -0
  72. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
  73. data/lib/active_merchant/billing/gateways/payflow_express.rb +222 -0
  74. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +15 -0
  75. data/lib/active_merchant/billing/gateways/payflow_uk.rb +21 -0
  76. data/lib/active_merchant/billing/gateways/payment_express.rb +235 -0
  77. data/lib/active_merchant/billing/gateways/paypal.rb +121 -0
  78. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +354 -0
  79. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +49 -0
  80. data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
  81. data/lib/active_merchant/billing/gateways/paypal_express.rb +229 -0
  82. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +25 -0
  83. data/lib/active_merchant/billing/gateways/paystation.rb +201 -0
  84. data/lib/active_merchant/billing/gateways/plugnpay.rb +298 -0
  85. data/lib/active_merchant/billing/gateways/psigate.rb +219 -0
  86. data/lib/active_merchant/billing/gateways/psl_card.rb +304 -0
  87. data/lib/active_merchant/billing/gateways/qbms.rb +297 -0
  88. data/lib/active_merchant/billing/gateways/quantum.rb +282 -0
  89. data/lib/active_merchant/billing/gateways/quickpay.rb +298 -0
  90. data/lib/active_merchant/billing/gateways/realex.rb +315 -0
  91. data/lib/active_merchant/billing/gateways/sage.rb +146 -0
  92. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +88 -0
  93. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +116 -0
  94. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +97 -0
  95. data/lib/active_merchant/billing/gateways/sage_pay.rb +320 -0
  96. data/lib/active_merchant/billing/gateways/sallie_mae.rb +144 -0
  97. data/lib/active_merchant/billing/gateways/samurai.rb +121 -0
  98. data/lib/active_merchant/billing/gateways/secure_net.rb +330 -0
  99. data/lib/active_merchant/billing/gateways/secure_pay.rb +31 -0
  100. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +280 -0
  101. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +113 -0
  102. data/lib/active_merchant/billing/gateways/skip_jack.rb +458 -0
  103. data/lib/active_merchant/billing/gateways/smart_ps.rb +271 -0
  104. data/lib/active_merchant/billing/gateways/stripe.rb +244 -0
  105. data/lib/active_merchant/billing/gateways/trans_first.rb +127 -0
  106. data/lib/active_merchant/billing/gateways/transax.rb +25 -0
  107. data/lib/active_merchant/billing/gateways/trust_commerce.rb +423 -0
  108. data/lib/active_merchant/billing/gateways/usa_epay.rb +23 -0
  109. data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +1496 -0
  110. data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +206 -0
  111. data/lib/active_merchant/billing/gateways/verifi.rb +233 -0
  112. data/lib/active_merchant/billing/gateways/viaklix.rb +189 -0
  113. data/lib/active_merchant/billing/gateways/wirecard.rb +318 -0
  114. data/lib/active_merchant/billing/gateways/worldpay.rb +280 -0
  115. data/lib/active_merchant/billing/integrations.rb +17 -0
  116. data/lib/active_merchant/billing/integrations/action_view_helper.rb +72 -0
  117. data/lib/active_merchant/billing/integrations/authorize_net_sim.rb +38 -0
  118. data/lib/active_merchant/billing/integrations/authorize_net_sim/helper.rb +228 -0
  119. data/lib/active_merchant/billing/integrations/authorize_net_sim/notification.rb +340 -0
  120. data/lib/active_merchant/billing/integrations/bogus.rb +23 -0
  121. data/lib/active_merchant/billing/integrations/bogus/helper.rb +17 -0
  122. data/lib/active_merchant/billing/integrations/bogus/notification.rb +11 -0
  123. data/lib/active_merchant/billing/integrations/bogus/return.rb +10 -0
  124. data/lib/active_merchant/billing/integrations/chronopay.rb +23 -0
  125. data/lib/active_merchant/billing/integrations/chronopay/helper.rb +120 -0
  126. data/lib/active_merchant/billing/integrations/chronopay/notification.rb +158 -0
  127. data/lib/active_merchant/billing/integrations/chronopay/return.rb +10 -0
  128. data/lib/active_merchant/billing/integrations/direc_pay.rb +41 -0
  129. data/lib/active_merchant/billing/integrations/direc_pay/helper.rb +200 -0
  130. data/lib/active_merchant/billing/integrations/direc_pay/notification.rb +76 -0
  131. data/lib/active_merchant/billing/integrations/direc_pay/return.rb +32 -0
  132. data/lib/active_merchant/billing/integrations/direc_pay/status.rb +37 -0
  133. data/lib/active_merchant/billing/integrations/directebanking.rb +47 -0
  134. data/lib/active_merchant/billing/integrations/directebanking/helper.rb +90 -0
  135. data/lib/active_merchant/billing/integrations/directebanking/notification.rb +120 -0
  136. data/lib/active_merchant/billing/integrations/directebanking/return.rb +11 -0
  137. data/lib/active_merchant/billing/integrations/dwolla.rb +30 -0
  138. data/lib/active_merchant/billing/integrations/dwolla/helper.rb +31 -0
  139. data/lib/active_merchant/billing/integrations/dwolla/notification.rb +55 -0
  140. data/lib/active_merchant/billing/integrations/dwolla/return.rb +38 -0
  141. data/lib/active_merchant/billing/integrations/e_payment_plans.rb +48 -0
  142. data/lib/active_merchant/billing/integrations/e_payment_plans/helper.rb +34 -0
  143. data/lib/active_merchant/billing/integrations/e_payment_plans/notification.rb +84 -0
  144. data/lib/active_merchant/billing/integrations/gestpay.rb +25 -0
  145. data/lib/active_merchant/billing/integrations/gestpay/common.rb +42 -0
  146. data/lib/active_merchant/billing/integrations/gestpay/helper.rb +70 -0
  147. data/lib/active_merchant/billing/integrations/gestpay/notification.rb +85 -0
  148. data/lib/active_merchant/billing/integrations/gestpay/return.rb +10 -0
  149. data/lib/active_merchant/billing/integrations/helper.rb +113 -0
  150. data/lib/active_merchant/billing/integrations/hi_trust.rb +27 -0
  151. data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +58 -0
  152. data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +59 -0
  153. data/lib/active_merchant/billing/integrations/hi_trust/return.rb +67 -0
  154. data/lib/active_merchant/billing/integrations/moneybookers.rb +26 -0
  155. data/lib/active_merchant/billing/integrations/moneybookers/helper.rb +59 -0
  156. data/lib/active_merchant/billing/integrations/moneybookers/notification.rb +129 -0
  157. data/lib/active_merchant/billing/integrations/nochex.rb +88 -0
  158. data/lib/active_merchant/billing/integrations/nochex/helper.rb +68 -0
  159. data/lib/active_merchant/billing/integrations/nochex/notification.rb +94 -0
  160. data/lib/active_merchant/billing/integrations/nochex/return.rb +10 -0
  161. data/lib/active_merchant/billing/integrations/notification.rb +62 -0
  162. data/lib/active_merchant/billing/integrations/payflow_link.rb +21 -0
  163. data/lib/active_merchant/billing/integrations/payflow_link/helper.rb +100 -0
  164. data/lib/active_merchant/billing/integrations/payflow_link/notification.rb +78 -0
  165. data/lib/active_merchant/billing/integrations/paypal.rb +39 -0
  166. data/lib/active_merchant/billing/integrations/paypal/helper.rb +119 -0
  167. data/lib/active_merchant/billing/integrations/paypal/notification.rb +154 -0
  168. data/lib/active_merchant/billing/integrations/paypal/return.rb +10 -0
  169. data/lib/active_merchant/billing/integrations/quickpay.rb +21 -0
  170. data/lib/active_merchant/billing/integrations/quickpay/helper.rb +72 -0
  171. data/lib/active_merchant/billing/integrations/quickpay/notification.rb +74 -0
  172. data/lib/active_merchant/billing/integrations/return.rb +42 -0
  173. data/lib/active_merchant/billing/integrations/sage_pay_form.rb +37 -0
  174. data/lib/active_merchant/billing/integrations/sage_pay_form/encryption.rb +33 -0
  175. data/lib/active_merchant/billing/integrations/sage_pay_form/helper.rb +127 -0
  176. data/lib/active_merchant/billing/integrations/sage_pay_form/notification.rb +210 -0
  177. data/lib/active_merchant/billing/integrations/sage_pay_form/return.rb +31 -0
  178. data/lib/active_merchant/billing/integrations/two_checkout.rb +22 -0
  179. data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +59 -0
  180. data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +114 -0
  181. data/lib/active_merchant/billing/integrations/two_checkout/return.rb +17 -0
  182. data/lib/active_merchant/billing/integrations/valitor.rb +33 -0
  183. data/lib/active_merchant/billing/integrations/valitor/helper.rb +86 -0
  184. data/lib/active_merchant/billing/integrations/valitor/notification.rb +13 -0
  185. data/lib/active_merchant/billing/integrations/valitor/response_fields.rb +97 -0
  186. data/lib/active_merchant/billing/integrations/valitor/return.rb +13 -0
  187. data/lib/active_merchant/billing/integrations/world_pay.rb +27 -0
  188. data/lib/active_merchant/billing/integrations/world_pay/helper.rb +100 -0
  189. data/lib/active_merchant/billing/integrations/world_pay/notification.rb +160 -0
  190. data/lib/active_merchant/billing/response.rb +32 -0
  191. data/lib/active_merchant/version.rb +3 -0
  192. data/lib/activemerchant.rb +1 -0
  193. data/lib/support/gateway_support.rb +58 -0
  194. data/lib/support/outbound_hosts.rb +25 -0
  195. metadata +411 -0
@@ -0,0 +1,235 @@
1
+ require 'rexml/document'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+
6
+ class EfsnetGateway < Gateway
7
+ self.supported_countries = ['US']
8
+ self.supported_cardtypes = [:visa, :master, :american_express, :discover]
9
+ self.homepage_url = 'http://www.concordefsnet.com/'
10
+ self.display_name = 'Efsnet'
11
+
12
+ TEST_URL = 'https://testefsnet.concordebiz.com/efsnet.dll'
13
+ LIVE_URL = 'https://efsnet.concordebiz.com/efsnet.dll'
14
+
15
+ # login is your Store ID
16
+ # password is your Store Key
17
+ def initialize(options = {})
18
+ requires!(options, :login, :password)
19
+ @options = options
20
+ super
21
+ end
22
+
23
+ def test?
24
+ @options[:test] || super
25
+ end
26
+
27
+ def authorize(money, creditcard, options = {})
28
+ request = build_credit_card_request(money, creditcard, options)
29
+ commit(:credit_card_authorize, request)
30
+ end
31
+
32
+ def purchase(money, creditcard, options = {})
33
+ request = build_credit_card_request(money, creditcard, options)
34
+ commit(:credit_card_charge, request)
35
+ end
36
+
37
+ def capture(money, identification, options = {})
38
+ request = build_refund_or_settle_request(money, identification, options)
39
+ commit(:credit_card_settle, request)
40
+ end
41
+
42
+ def credit(money, identification_or_credit_card, options = {})
43
+ if identification_or_credit_card.is_a?(String)
44
+ deprecated CREDIT_DEPRECATION_MESSAGE
45
+ # Perform authorization reversal
46
+ refund(money, identification_or_credit_card, options)
47
+ else
48
+ # Perform credit
49
+ request = build_credit_card_request(money, identification_or_credit_card, options)
50
+ commit(:credit_card_credit, request)
51
+ end
52
+ end
53
+
54
+ def refund(money, reference, options = {})
55
+ # Perform authorization reversal
56
+ request = build_refund_or_settle_request(money, reference, options)
57
+ commit(:credit_card_refund, request)
58
+ end
59
+
60
+ def void(identification, options = {})
61
+ requires!(options, :order_id)
62
+ original_transaction_id, original_transaction_amount = identification.split(";")
63
+ commit(:void_transaction, {:reference_number => format_reference_number(options[:order_id]), :transaction_id => original_transaction_id})
64
+ end
65
+
66
+ def voice_authorize(money, authorization_code, creditcard, options = {})
67
+ options[:authorization_number] = authorization_code
68
+ request = build_credit_card_request(money, creditcard, options)
69
+ commit(:credit_card_voice_authorize, request)
70
+ end
71
+
72
+ def force(money, authorization_code, creditcard, options = {})
73
+ options[:authorization_number] = authorization_code
74
+ request = build_credit_card_request(money, creditcard, options)
75
+ commit(:credit_card_capture, request)
76
+ end
77
+
78
+ def system_check
79
+ commit(:system_check, {})
80
+ end
81
+
82
+ private
83
+
84
+ def build_refund_or_settle_request(money, identification, options = {})
85
+ original_transaction_id, original_transaction_amount = identification.split(";")
86
+
87
+ requires!(options, :order_id)
88
+
89
+ post = {
90
+ :reference_number => format_reference_number(options[:order_id]),
91
+ :transaction_amount => amount(money),
92
+ :original_transaction_amount => original_transaction_amount,
93
+ :original_transaction_id => original_transaction_id,
94
+ :client_ip_address => options[:ip]
95
+ }
96
+ end
97
+
98
+ def build_credit_card_request(money, creditcard, options = {})
99
+ requires!(options, :order_id)
100
+
101
+ post = {
102
+ :reference_number => format_reference_number(options[:order_id]),
103
+ :authorization_number => options[:authorization_number],
104
+ :transaction_amount => amount(money),
105
+ :client_ip_address => options[:ip]
106
+
107
+ }
108
+ add_creditcard(post,creditcard)
109
+ add_address(post,options)
110
+ post
111
+ end
112
+
113
+ def format_reference_number(number)
114
+ number.to_s.slice(0,12)
115
+ end
116
+
117
+ def add_address(post,options)
118
+ if address = options[:billing_address] || options[:address]
119
+ if address[:address2]
120
+ post[:billing_address] = address[:address1].to_s << ' ' << address[:address2].to_s
121
+ else
122
+ post[:billing_address] = address[:address1].to_s
123
+ end
124
+ post[:billing_city] = address[:city].to_s
125
+ post[:billing_state] = address[:state].blank? ? 'n/a' : address[:state]
126
+ post[:billing_postal_code] = address[:zip].to_s
127
+ post[:billing_country] = address[:country].to_s
128
+ end
129
+
130
+ if address = options[:shipping_address]
131
+ if address[:address2]
132
+ post[:shipping_address] = address[:address1].to_s << ' ' << address[:address2].to_s
133
+ else
134
+ post[:shipping_address] = address[:address1].to_s
135
+ end
136
+ post[:shipping_city] = address[:city].to_s
137
+ post[:shipping_state] = address[:state].blank? ? 'n/a' : address[:state]
138
+ post[:shipping_postal_code] = address[:zip].to_s
139
+ post[:shipping_country] = address[:country].to_s
140
+ end
141
+ end
142
+
143
+ def add_creditcard(post, creditcard)
144
+ post[:billing_name] = creditcard.name if creditcard.name
145
+ post[:account_number] = creditcard.number
146
+ post[:card_verification_value] = creditcard.verification_value if creditcard.verification_value?
147
+ post[:expiration_month] = sprintf("%.2i", creditcard.month)
148
+ post[:expiration_year] = sprintf("%.4i", creditcard.year)[-2..-1]
149
+ end
150
+
151
+
152
+ def commit(action, parameters)
153
+ response = parse(ssl_post(test? ? TEST_URL : LIVE_URL, post_data(action, parameters), 'Content-Type' => 'text/xml'))
154
+
155
+ Response.new(success?(response), message_from(response[:result_message]), response,
156
+ :test => test?,
157
+ :authorization => authorization_from(response, parameters),
158
+ :avs_result => { :code => response[:avs_response_code] },
159
+ :cvv_result => response[:cvv_response_code]
160
+ )
161
+ end
162
+
163
+ def success?(response)
164
+ response[:response_code] == '0'
165
+ end
166
+
167
+ def authorization_from(response, params)
168
+ [ response[:transaction_id], params[:transaction_amount] ].compact.join(';')
169
+ end
170
+
171
+ def parse(xml)
172
+ response = {}
173
+
174
+ xml = REXML::Document.new(xml)
175
+
176
+ xml.elements.each('//Reply//TransactionReply/*') do |node|
177
+
178
+ response[node.name.underscore.to_sym] = normalize(node.text)
179
+
180
+ end unless xml.root.nil?
181
+
182
+ response
183
+ end
184
+
185
+ def post_data(action, parameters = {})
186
+ xml = REXML::Document.new("<?xml version='1.0' encoding='UTF-8'?>")
187
+ root = xml.add_element("Request")
188
+ root.attributes["StoreID"] = options[:login]
189
+ root.attributes["StoreKey"] = options[:password]
190
+ root.attributes["ApplicationID"] = 'ot 1.0'
191
+ transaction = root.add_element(action.to_s.camelize)
192
+
193
+ actions[action].each do |key|
194
+ transaction.add_element(key).text = parameters[key.underscore.to_sym] unless parameters[key.underscore.to_sym].blank?
195
+ end
196
+
197
+ xml.to_s
198
+ end
199
+
200
+ def message_from(message)
201
+ return 'Unspecified error' if message.blank?
202
+ message.gsub(/[^\w]/, ' ').split.join(" ").capitalize
203
+ end
204
+
205
+ # Make a ruby type out of the response string
206
+ def normalize(field)
207
+ case field
208
+ when "true" then true
209
+ when "false" then false
210
+ when "" then nil
211
+ when "null" then nil
212
+ else field
213
+ end
214
+ end
215
+
216
+ def actions
217
+ ACTIONS
218
+ end
219
+
220
+ CREDIT_CARD_FIELDS = %w(AuthorizationNumber ClientIpAddress BillingAddress BillingCity BillingState BillingPostalCode BillingCountry BillingName CardVerificationValue ExpirationMonth ExpirationYear ReferenceNumber TransactionAmount AccountNumber )
221
+
222
+ ACTIONS = {
223
+ :credit_card_authorize => CREDIT_CARD_FIELDS,
224
+ :credit_card_charge => CREDIT_CARD_FIELDS,
225
+ :credit_card_voice_authorize => CREDIT_CARD_FIELDS,
226
+ :credit_card_capture => CREDIT_CARD_FIELDS,
227
+ :credit_card_credit => CREDIT_CARD_FIELDS + ["OriginalTransactionAmount"],
228
+ :credit_card_refund => %w(ReferenceNumber TransactionAmount OriginalTransactionAmount OriginalTransactionID ClientIpAddress),
229
+ :void_transaction => %w(ReferenceNumber TransactionID),
230
+ :credit_card_settle => %w(ReferenceNumber TransactionAmount OriginalTransactionAmount OriginalTransactionID ClientIpAddress),
231
+ :system_check => %w(SystemCheck),
232
+ }
233
+ end
234
+ end
235
+ end
@@ -0,0 +1,135 @@
1
+ require File.dirname(__FILE__) + '/viaklix'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ # = Elavon Virtual Merchant Gateway
6
+ #
7
+ # == Example use:
8
+ #
9
+ # gateway = ActiveMerchant::Billing::ElavonGateway.new(
10
+ # :login => "my_virtual_merchant_id",
11
+ # :password => "my_virtual_merchant_pin",
12
+ # :user => "my_virtual_merchant_user_id" # optional
13
+ # )
14
+ #
15
+ # # set up credit card obj as in main ActiveMerchant example
16
+ # creditcard = ActiveMerchant::Billing::CreditCard.new(
17
+ # :type => 'visa',
18
+ # :number => '41111111111111111',
19
+ # :month => 10,
20
+ # :year => 2011,
21
+ # :first_name => 'Bob',
22
+ # :last_name => 'Bobsen'
23
+ # )
24
+ #
25
+ # # run request
26
+ # response = gateway.purchase(1000, creditcard) # authorize and capture 10 USD
27
+ #
28
+ # puts response.success? # Check whether the transaction was successful
29
+ # puts response.message # Retrieve the message returned by Elavon
30
+ # puts response.authorization # Retrieve the unique transaction ID returned by Elavon
31
+ #
32
+ class ElavonGateway < ViaklixGateway
33
+ self.test_url = 'https://demo.myvirtualmerchant.com/VirtualMerchantDemo/process.do'
34
+ self.live_url = 'https://www.myvirtualmerchant.com/VirtualMerchant/process.do'
35
+
36
+ self.display_name = 'Elavon MyVirtualMerchant'
37
+ self.supported_countries = ['US', 'CA']
38
+ self.supported_cardtypes = [:visa, :master, :american_express, :discover]
39
+ self.homepage_url = 'http://www.elavon.com/'
40
+
41
+ self.delimiter = "\n"
42
+ self.actions = {
43
+ :purchase => 'CCSALE',
44
+ :credit => 'CCCREDIT',
45
+ :authorize => 'CCAUTHONLY',
46
+ :capture => 'CCFORCE'
47
+ }
48
+
49
+ # Authorize a credit card for a given amount.
50
+ #
51
+ # ==== Parameters
52
+ # * <tt>money</tt> - The amount to be authorized as an Integer value in cents.
53
+ # * <tt>credit_card</tt> - The CreditCard details for the transaction.
54
+ # * <tt>options</tt>
55
+ # * <tt>:billing_address</tt> - The billing address for the cardholder.
56
+ def authorize(money, creditcard, options = {})
57
+ form = {}
58
+ add_invoice(form, options)
59
+ add_creditcard(form, creditcard)
60
+ add_address(form, options)
61
+ add_customer_data(form, options)
62
+ commit(:authorize, money, form)
63
+ end
64
+
65
+ # Capture authorized funds from a credit card.
66
+ #
67
+ # ==== Parameters
68
+ # * <tt>money</tt> - The amount to be captured as an Integer value in cents.
69
+ # * <tt>authorization</tt> - The approval code returned from the initial authorization.
70
+ # * <tt>options</tt>
71
+ # * <tt>:credit_card</tt> - The CreditCard details from the initial transaction (required).
72
+ def capture(money, authorization, options = {})
73
+ requires!(options, :credit_card)
74
+
75
+ form = {}
76
+ add_reference(form, authorization)
77
+ add_invoice(form, options)
78
+ add_creditcard(form, options[:credit_card])
79
+ add_customer_data(form, options)
80
+ commit(:capture, money, form)
81
+ end
82
+
83
+ private
84
+ def add_reference(form, authorization)
85
+ form[:approval_code] = authorization
86
+ end
87
+
88
+ def authorization_from(response)
89
+ response['approval_code']
90
+ end
91
+
92
+ def add_verification_value(form, creditcard)
93
+ form[:cvv2cvc2] = creditcard.verification_value
94
+ form[:cvv2cvc2_indicator] = '1'
95
+ end
96
+
97
+ def add_address(form,options)
98
+ billing_address = options[:billing_address] || options[:address]
99
+
100
+ if billing_address
101
+ form[:avs_address] = billing_address[:address1].to_s.slice(0, 30)
102
+ form[:address2] = billing_address[:address2].to_s.slice(0, 30)
103
+ form[:avs_zip] = billing_address[:zip].to_s.slice(0, 10)
104
+ form[:city] = billing_address[:city].to_s.slice(0, 30)
105
+ form[:state] = billing_address[:state].to_s.slice(0, 10)
106
+ form[:company] = billing_address[:company].to_s.slice(0, 50)
107
+ form[:phone] = billing_address[:phone].to_s.slice(0, 20)
108
+ form[:country] = billing_address[:country].to_s.slice(0, 50)
109
+ end
110
+
111
+ if shipping_address = options[:shipping_address]
112
+ first_name, last_name = parse_first_and_last_name(shipping_address[:name])
113
+ form[:ship_to_first_name] = first_name.to_s.slice(0, 20)
114
+ form[:ship_to_last_name] = last_name.to_s.slice(0, 30)
115
+ form[:ship_to_address1] = shipping_address[:address1].to_s.slice(0, 30)
116
+ form[:ship_to_address2] = shipping_address[:address2].to_s.slice(0, 30)
117
+ form[:ship_to_city] = shipping_address[:city].to_s.slice(0, 30)
118
+ form[:ship_to_state] = shipping_address[:state].to_s.slice(0, 10)
119
+ form[:ship_to_company] = shipping_address[:company].to_s.slice(0, 50)
120
+ form[:ship_to_country] = shipping_address[:country].to_s.slice(0, 50)
121
+ form[:ship_to_zip] = shipping_address[:zip].to_s.slice(0, 10)
122
+ end
123
+ end
124
+
125
+ def message_from(response)
126
+ success?(response) ? response['result_message'] : response['errorMessage']
127
+ end
128
+
129
+ def success?(response)
130
+ !response.has_key?('errorMessage')
131
+ end
132
+ end
133
+ end
134
+ end
135
+
@@ -0,0 +1,274 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class EpayGateway < Gateway
4
+ API_HOST = 'ssl.ditonlinebetalingssystem.dk'
5
+ SOAP_URL = 'https://' + API_HOST + '/remote/payment'
6
+
7
+ self.default_currency = 'DKK'
8
+ self.money_format = :cents
9
+ self.supported_cardtypes = [:dankort, :forbrugsforeningen, :visa, :master,
10
+ :american_express, :diners_club, :jcb, :maestro]
11
+ self.supported_countries = ['DK', 'SE', 'NO']
12
+ self.homepage_url = 'http://epay.dk/'
13
+ self.display_name = 'ePay'
14
+
15
+ CURRENCY_CODES = {
16
+ :ADP => '020', :AED => '784', :AFA => '004', :ALL => '008', :AMD => '051',
17
+ :ANG => '532', :AOA => '973', :ARS => '032', :AUD => '036', :AWG => '533',
18
+ :AZM => '031', :BAM => '977', :BBD => '052', :BDT => '050', :BGL => '100',
19
+ :BGN => '975', :BHD => '048', :BIF => '108', :BMD => '060', :BND => '096',
20
+ :BOB => '068', :BOV => '984', :BRL => '986', :BSD => '044', :BTN => '064',
21
+ :BWP => '072', :BYR => '974', :BZD => '084', :CAD => '124', :CDF => '976',
22
+ :CHF => '756', :CLF => '990', :CLP => '152', :CNY => '156', :COP => '170',
23
+ :CRC => '188', :CUP => '192', :CVE => '132', :CYP => '196', :CZK => '203',
24
+ :DJF => '262', :DKK => '208', :DOP => '214', :DZD => '012', :ECS => '218',
25
+ :ECV => '983', :EEK => '233', :EGP => '818', :ERN => '232', :ETB => '230',
26
+ :EUR => '978', :FJD => '242', :FKP => '238', :GBP => '826', :GEL => '981',
27
+ :GHC => '288', :GIP => '292', :GMD => '270', :GNF => '324', :GTQ => '320',
28
+ :GWP => '624', :GYD => '328', :HKD => '344', :HNL => '340', :HRK => '191',
29
+ :HTG => '332', :HUF => '348', :IDR => '360', :ILS => '376', :INR => '356',
30
+ :IQD => '368', :IRR => '364', :ISK => '352', :JMD => '388', :JOD => '400',
31
+ :JPY => '392', :KES => '404', :KGS => '417', :KHR => '116', :KMF => '174',
32
+ :KPW => '408', :KRW => '410', :KWD => '414', :KYD => '136', :KZT => '398',
33
+ :LAK => '418', :LBP => '422', :LKR => '144', :LRD => '430', :LSL => '426',
34
+ :LTL => '440', :LVL => '428', :LYD => '434', :MAD => '504', :MDL => '498',
35
+ :MGF => '450', :MKD => '807', :MMK => '104', :MNT => '496', :MOP => '446',
36
+ :MRO => '478', :MTL => '470', :MUR => '480', :MVR => '462', :MWK => '454',
37
+ :MXN => '484', :MXV => '979', :MYR => '458', :MZM => '508', :NAD => '516',
38
+ :NGN => '566', :NIO => '558', :NOK => '578', :NPR => '524', :NZD => '554',
39
+ :OMR => '512', :PAB => '590', :PEN => '604', :PGK => '598', :PHP => '608',
40
+ :PKR => '586', :PLN => '985', :PYG => '600', :QAR => '634', :ROL => '642',
41
+ :RUB => '643', :RUR => '810', :RWF => '646', :SAR => '682', :SBD => '090',
42
+ :SCR => '690', :SDD => '736', :SEK => '752', :SGD => '702', :SHP => '654',
43
+ :SIT => '705', :SKK => '703', :SLL => '694', :SOS => '706', :SRG => '740',
44
+ :STD => '678', :SVC => '222', :SYP => '760', :SZL => '748', :THB => '764',
45
+ :TJS => '972', :TMM => '795', :TND => '788', :TOP => '776', :TPE => '626',
46
+ :TRL => '792', :TRY => '949', :TTD => '780', :TWD => '901', :TZS => '834',
47
+ :UAH => '980', :UGX => '800', :USD => '840', :UYU => '858', :UZS => '860',
48
+ :VEB => '862', :VND => '704', :VUV => '548', :XAF => '950', :XCD => '951',
49
+ :XOF => '952', :XPF => '953', :YER => '886', :YUM => '891', :ZAR => '710',
50
+ :ZMK => '894', :ZWD => '716'
51
+ }
52
+
53
+ # login: merchant number
54
+ # password: referrer url (for authorize authentication)
55
+ def initialize(options = {})
56
+ requires!(options, :login)
57
+ @options = options
58
+ super
59
+ end
60
+
61
+ def authorize(money, credit_card_or_reference, options = {})
62
+ post = {}
63
+
64
+ add_amount(post, money, options)
65
+ add_invoice(post, options)
66
+ add_creditcard_or_reference(post, credit_card_or_reference)
67
+ add_instant_capture(post, false)
68
+
69
+ commit(:authorize, post)
70
+ end
71
+
72
+ def purchase(money, credit_card_or_reference, options = {})
73
+ post = {}
74
+
75
+ add_amount(post, money, options)
76
+ add_creditcard_or_reference(post, credit_card_or_reference)
77
+ add_invoice(post, options)
78
+ add_instant_capture(post, true)
79
+
80
+ commit(:authorize, post)
81
+ end
82
+
83
+ def capture(money, authorization, options = {})
84
+ post = {}
85
+
86
+ add_reference(post, authorization)
87
+ add_amount_without_currency(post, money)
88
+
89
+ commit(:capture, post)
90
+ end
91
+
92
+ def void(identification, options = {})
93
+ post = {}
94
+
95
+ add_reference(post, identification)
96
+
97
+ commit(:void, post)
98
+ end
99
+
100
+ def refund(money, identification, options = {})
101
+ post = {}
102
+
103
+ add_amount_without_currency(post, money)
104
+ add_reference(post, identification)
105
+
106
+ commit(:credit, post)
107
+ end
108
+
109
+ def credit(money, identification, options = {})
110
+ deprecated CREDIT_DEPRECATION_MESSAGE
111
+ refund(money, identification, options)
112
+ end
113
+
114
+ private
115
+
116
+ def add_amount(post, money, options)
117
+ post[:amount] = amount(money)
118
+ post[:currency] = CURRENCY_CODES[(options[:currency] || currency(money)).to_sym]
119
+ end
120
+
121
+ def add_amount_without_currency(post, money)
122
+ post[:amount] = amount(money)
123
+ end
124
+
125
+ def add_reference(post, identification)
126
+ post[:transaction] = identification
127
+ end
128
+
129
+ def add_invoice(post, options)
130
+ post[:orderid] = format_order_number(options[:order_id])
131
+ end
132
+
133
+ def add_creditcard(post, credit_card)
134
+ post[:cardno] = credit_card.number
135
+ post[:cvc] = credit_card.verification_value
136
+ post[:expmonth] = credit_card.month
137
+ post[:expyear] = credit_card.year
138
+ end
139
+
140
+ def add_creditcard_or_reference(post, credit_card_or_reference)
141
+ if credit_card_or_reference.respond_to?(:number)
142
+ add_creditcard(post, credit_card_or_reference)
143
+ else
144
+ add_reference(post, credit_card_or_reference.to_s)
145
+ end
146
+ end
147
+
148
+ def add_instant_capture(post, option)
149
+ post[:instantcapture] = option ? 1 : 0
150
+ end
151
+
152
+ def commit(action, params)
153
+ response = send("do_#{action}", params)
154
+
155
+ if action == :authorize
156
+ Response.new response['accept'].to_i == 1,
157
+ response['errortext'],
158
+ response,
159
+ :test => test?,
160
+ :authorization => response['tid']
161
+ else
162
+ Response.new response['result'] == 'true',
163
+ messages(response['epay'], response['pbs']),
164
+ response,
165
+ :test => test?,
166
+ :authorization => params[:transaction]
167
+ end
168
+ end
169
+
170
+ def messages(epay, pbs = nil)
171
+ response = "ePay: #{epay}"
172
+ response << " PBS: #{pbs}" if pbs
173
+ return response
174
+ end
175
+
176
+ def soap_post(method, params)
177
+ data = xml_builder(params, method)
178
+ headers = make_headers(data, method)
179
+ REXML::Document.new(ssl_post('https://' + API_HOST + '/remote/payment.asmx', data, headers))
180
+ end
181
+
182
+ def do_authorize(params)
183
+ headers = {}
184
+ headers['Referer'] = (options[:password] || "activemerchant.org")
185
+
186
+ response = raw_ssl_request(:post, 'https://' + API_HOST + '/auth/default.aspx', authorize_post_data(params), headers)
187
+
188
+ # Authorize gives the response back by redirecting with the values in
189
+ # the URL query
190
+ if location = response['Location']
191
+ query = CGI::parse(URI.parse(location.gsub(' ', '%20')).query)
192
+ else
193
+ return {
194
+ 'accept' => '0',
195
+ 'errortext' => 'No Location header returned.'
196
+ }
197
+ end
198
+
199
+ result = {}
200
+ query.each_pair do |k,v|
201
+ result[k] = v.is_a?(Array) && v.size == 1 ? v[0] : v # make values like ['v'] into 'v'
202
+ end
203
+ result
204
+ end
205
+
206
+ def do_capture(params)
207
+ response = soap_post('capture', params)
208
+ {
209
+ 'result' => response.elements['//captureResponse/captureResult'].text,
210
+ 'pbs' => response.elements['//captureResponse/pbsResponse'].text,
211
+ 'epay' => response.elements['//captureResponse/epayresponse'].text
212
+ }
213
+ end
214
+
215
+ def do_credit(params)
216
+ response = soap_post('credit', params)
217
+ {
218
+ 'result' => response.elements['//creditResponse/creditResult'].text,
219
+ 'pbs' => response.elements['//creditResponse/pbsresponse'].text,
220
+ 'epay' => response.elements['//creditResponse/epayresponse'].text
221
+ }
222
+ end
223
+
224
+ def do_void(params)
225
+ response = soap_post('delete', params)
226
+ {
227
+ 'result' => response.elements['//deleteResponse/deleteResult'].text,
228
+ 'epay' => response.elements['//deleteResponse/epayresponse'].text
229
+ }
230
+ end
231
+
232
+ def make_headers(data, soap_call)
233
+ {
234
+ 'Content-Type' => 'text/xml; charset=utf-8',
235
+ 'Host' => API_HOST,
236
+ 'Content-Length' => data.size.to_s,
237
+ 'SOAPAction' => SOAP_URL + '/' + soap_call
238
+ }
239
+ end
240
+
241
+ def xml_builder(params, soap_call)
242
+ xml = Builder::XmlMarkup.new(:indent => 2)
243
+ xml.instruct!
244
+ xml.tag! 'soap:Envelope', { 'xmlns:xsi' => 'http://schemas.xmlsoap.org/soap/envelope/',
245
+ 'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
246
+ 'xmlns:soap' => 'http://schemas.xmlsoap.org/soap/envelope/' } do
247
+ xml.tag! 'soap:Body' do
248
+ xml.tag! soap_call, { 'xmlns' => SOAP_URL } do
249
+ xml.tag! 'merchantnumber', @options[:login]
250
+ xml.tag! 'transactionid', params[:transaction]
251
+ xml.tag! 'amount', params[:amount].to_s if soap_call != 'delete'
252
+ end
253
+ end
254
+ end
255
+ xml.target!
256
+ end
257
+
258
+ def authorize_post_data(params = {})
259
+ params[:language] = '2'
260
+ params[:cms] = 'activemerchant'
261
+ params[:accepturl] = 'https://ssl.ditonlinebetalingssystem.dk/auth/default.aspx?accept=1'
262
+ params[:declineurl] = 'https://ssl.ditonlinebetalingssystem.dk/auth/default.aspx?decline=1'
263
+ params[:merchantnumber] = @options[:login]
264
+
265
+ params.collect { |key, value| "#{key}=#{CGI.escape(value.to_s)}" }.join("&")
266
+ end
267
+
268
+ # Limited to 20 digits max
269
+ def format_order_number(number)
270
+ number.to_s.gsub(/[^\w_]/, '').rjust(4, "0")[0...20]
271
+ end
272
+ end
273
+ end
274
+ end