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,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.to_s.camelize).text = parameters[key] unless parameters[key].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 = [:authorization_number, :client_ip_address, :billing_address, :billing_city, :billing_state, :billing_postal_code, :billing_country, :billing_name, :card_verification_value, :expiration_month, :expiration_year, :reference_number, :transaction_amount, :account_number ]
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 << :original_transaction_amount,
228
+ :credit_card_refund => [:reference_number, :transaction_amount, :original_transaction_amount, :original_transaction_ID, :client_ip_address],
229
+ :void_transaction => [:reference_number, :transaction_ID],
230
+ :credit_card_settle => [:reference_number, :transaction_amount, :original_transaction_amount, :original_transaction_ID, :client_ip_address],
231
+ :system_check => [:system_check],
232
+ }
233
+ end
234
+ end
235
+ end
@@ -0,0 +1,134 @@
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 = self.live_url = 'https://www.myvirtualmerchant.com/VirtualMerchant/process.do'
34
+
35
+ self.display_name = 'Elavon MyVirtualMerchant'
36
+ self.supported_countries = ['US', 'CA']
37
+ self.supported_cardtypes = [:visa, :master, :american_express, :discover]
38
+ self.homepage_url = 'http://www.elavon.com/'
39
+
40
+ self.delimiter = "\n"
41
+ self.actions = {
42
+ :purchase => 'CCSALE',
43
+ :credit => 'CCCREDIT',
44
+ :authorize => 'CCAUTHONLY',
45
+ :capture => 'CCFORCE'
46
+ }
47
+
48
+ # Authorize a credit card for a given amount.
49
+ #
50
+ # ==== Parameters
51
+ # * <tt>money</tt> - The amount to be authorized as an Integer value in cents.
52
+ # * <tt>credit_card</tt> - The CreditCard details for the transaction.
53
+ # * <tt>options</tt>
54
+ # * <tt>:billing_address</tt> - The billing address for the cardholder.
55
+ def authorize(money, creditcard, options = {})
56
+ form = {}
57
+ add_invoice(form, options)
58
+ add_creditcard(form, creditcard)
59
+ add_address(form, options)
60
+ add_customer_data(form, options)
61
+ commit(:authorize, money, form)
62
+ end
63
+
64
+ # Capture authorized funds from a credit card.
65
+ #
66
+ # ==== Parameters
67
+ # * <tt>money</tt> - The amount to be captured as an Integer value in cents.
68
+ # * <tt>authorization</tt> - The approval code returned from the initial authorization.
69
+ # * <tt>options</tt>
70
+ # * <tt>:credit_card</tt> - The CreditCard details from the initial transaction (required).
71
+ def capture(money, authorization, options = {})
72
+ requires!(options, :credit_card)
73
+
74
+ form = {}
75
+ add_reference(form, authorization)
76
+ add_invoice(form, options)
77
+ add_creditcard(form, options[:credit_card])
78
+ add_customer_data(form, options)
79
+ commit(:capture, money, form)
80
+ end
81
+
82
+ private
83
+ def add_reference(form, authorization)
84
+ form[:approval_code] = authorization
85
+ end
86
+
87
+ def authorization_from(response)
88
+ response['approval_code']
89
+ end
90
+
91
+ def add_verification_value(form, creditcard)
92
+ form[:cvv2cvc2] = creditcard.verification_value
93
+ form[:cvv2cvc2_indicator] = '1'
94
+ end
95
+
96
+ def add_address(form,options)
97
+ billing_address = options[:billing_address] || options[:address]
98
+
99
+ if billing_address
100
+ form[:avs_address] = billing_address[:address1].to_s.slice(0, 30)
101
+ form[:address2] = billing_address[:address2].to_s.slice(0, 30)
102
+ form[:avs_zip] = billing_address[:zip].to_s.slice(0, 10)
103
+ form[:city] = billing_address[:city].to_s.slice(0, 30)
104
+ form[:state] = billing_address[:state].to_s.slice(0, 10)
105
+ form[:company] = billing_address[:company].to_s.slice(0, 50)
106
+ form[:phone] = billing_address[:phone].to_s.slice(0, 20)
107
+ form[:country] = billing_address[:country].to_s.slice(0, 50)
108
+ end
109
+
110
+ if shipping_address = options[:shipping_address]
111
+ first_name, last_name = parse_first_and_last_name(shipping_address[:name])
112
+ form[:ship_to_first_name] = first_name.to_s.slice(0, 20)
113
+ form[:ship_to_last_name] = last_name.to_s.slice(0, 30)
114
+ form[:ship_to_address1] = shipping_address[:address1].to_s.slice(0, 30)
115
+ form[:ship_to_address2] = shipping_address[:address2].to_s.slice(0, 30)
116
+ form[:ship_to_city] = shipping_address[:city].to_s.slice(0, 30)
117
+ form[:ship_to_state] = shipping_address[:state].to_s.slice(0, 10)
118
+ form[:ship_to_company] = shipping_address[:company].to_s.slice(0, 50)
119
+ form[:ship_to_country] = shipping_address[:country].to_s.slice(0, 50)
120
+ form[:ship_to_zip] = shipping_address[:zip].to_s.slice(0, 10)
121
+ end
122
+ end
123
+
124
+ def message_from(response)
125
+ success?(response) ? response['result_message'] : response['errorMessage']
126
+ end
127
+
128
+ def success?(response)
129
+ !response.has_key?('errorMessage')
130
+ end
131
+ end
132
+ end
133
+ end
134
+
@@ -0,0 +1,268 @@
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']
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, :password)
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
+ 'Referer' => options[:password]
185
+ }
186
+
187
+ response = raw_ssl_request(:post, 'https://' + API_HOST + '/auth/default.aspx', authorize_post_data(params), headers)
188
+
189
+ # Authorize gives the response back by redirecting with the values in
190
+ # the URL query
191
+ query = CGI::parse(URI.parse(response['Location'].gsub(' ', '%20')).query)
192
+
193
+ result = {}
194
+ query.each_pair do |k,v|
195
+ result[k] = v.is_a?(Array) && v.size == 1 ? v[0] : v # make values like ['v'] into 'v'
196
+ end
197
+ result
198
+ end
199
+
200
+ def do_capture(params)
201
+ response = soap_post('capture', params)
202
+ {
203
+ 'result' => response.elements['//captureResponse/captureResult'].text,
204
+ 'pbs' => response.elements['//captureResponse/pbsResponse'].text,
205
+ 'epay' => response.elements['//captureResponse/epayresponse'].text
206
+ }
207
+ end
208
+
209
+ def do_credit(params)
210
+ response = soap_post('credit', params)
211
+ {
212
+ 'result' => response.elements['//creditResponse/creditResult'].text,
213
+ 'pbs' => response.elements['//creditResponse/pbsresponse'].text,
214
+ 'epay' => response.elements['//creditResponse/epayresponse'].text
215
+ }
216
+ end
217
+
218
+ def do_void(params)
219
+ response = soap_post('delete', params)
220
+ {
221
+ 'result' => response.elements['//deleteResponse/deleteResult'].text,
222
+ 'epay' => response.elements['//deleteResponse/epayresponse'].text
223
+ }
224
+ end
225
+
226
+ def make_headers(data, soap_call)
227
+ {
228
+ 'Content-Type' => 'text/xml; charset=utf-8',
229
+ 'Host' => API_HOST,
230
+ 'Content-Length' => data.size.to_s,
231
+ 'SOAPAction' => SOAP_URL + '/' + soap_call
232
+ }
233
+ end
234
+
235
+ def xml_builder(params, soap_call)
236
+ xml = Builder::XmlMarkup.new(:indent => 2)
237
+ xml.instruct!
238
+ xml.tag! 'soap:Envelope', { 'xmlns:xsi' => 'http://schemas.xmlsoap.org/soap/envelope/',
239
+ 'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
240
+ 'xmlns:soap' => 'http://schemas.xmlsoap.org/soap/envelope/' } do
241
+ xml.tag! 'soap:Body' do
242
+ xml.tag! soap_call, { 'xmlns' => SOAP_URL } do
243
+ xml.tag! 'merchantnumber', @options[:login]
244
+ xml.tag! 'transactionid', params[:transaction]
245
+ xml.tag! 'amount', params[:amount].to_s if soap_call != 'delete'
246
+ end
247
+ end
248
+ end
249
+ xml.target!
250
+ end
251
+
252
+ def authorize_post_data(params = {})
253
+ params[:language] = '2'
254
+ params[:cms] = 'activemerchant'
255
+ params[:accepturl] = 'https://ssl.ditonlinebetalingssystem.dk/auth/default.aspx?accept=1'
256
+ params[:declineurl] = 'https://ssl.ditonlinebetalingssystem.dk/auth/default.aspx?decline=1'
257
+ params[:merchantnumber] = @options[:login]
258
+
259
+ params.collect { |key, value| "#{key}=#{CGI.escape(value.to_s)}" }.join("&")
260
+ end
261
+
262
+ # Limited to 20 digits max
263
+ def format_order_number(number)
264
+ number.to_s.gsub(/[^\w_]/, '').rjust(4, "0")[0...20]
265
+ end
266
+ end
267
+ end
268
+ end