tomriley-active_merchant 1.4.2.3

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 (278) hide show
  1. data/CHANGELOG +442 -0
  2. data/CONTRIBUTERS +102 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README +134 -0
  5. data/Rakefile +153 -0
  6. data/active_merchant.gemspec +15 -0
  7. data/gem-public_cert.pem +20 -0
  8. data/init.rb +4 -0
  9. data/lib/active_merchant/billing/avs_result.rb +98 -0
  10. data/lib/active_merchant/billing/base.rb +57 -0
  11. data/lib/active_merchant/billing/check.rb +68 -0
  12. data/lib/active_merchant/billing/credit_card.rb +159 -0
  13. data/lib/active_merchant/billing/credit_card_formatting.rb +21 -0
  14. data/lib/active_merchant/billing/credit_card_methods.rb +125 -0
  15. data/lib/active_merchant/billing/cvv_result.rb +38 -0
  16. data/lib/active_merchant/billing/expiry_date.rb +28 -0
  17. data/lib/active_merchant/billing/gateway.rb +158 -0
  18. data/lib/active_merchant/billing/gateways/authorize_net.rb +646 -0
  19. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +702 -0
  20. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +233 -0
  21. data/lib/active_merchant/billing/gateways/beanstream.rb +102 -0
  22. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +54 -0
  23. data/lib/active_merchant/billing/gateways/bogus.rb +98 -0
  24. data/lib/active_merchant/billing/gateways/braintree.rb +17 -0
  25. data/lib/active_merchant/billing/gateways/card_stream.rb +230 -0
  26. data/lib/active_merchant/billing/gateways/cyber_source.rb +406 -0
  27. data/lib/active_merchant/billing/gateways/data_cash.rb +595 -0
  28. data/lib/active_merchant/billing/gateways/efsnet.rb +229 -0
  29. data/lib/active_merchant/billing/gateways/eway.rb +272 -0
  30. data/lib/active_merchant/billing/gateways/exact.rb +222 -0
  31. data/lib/active_merchant/billing/gateways/instapay.rb +164 -0
  32. data/lib/active_merchant/billing/gateways/linkpoint.rb +396 -0
  33. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +154 -0
  34. data/lib/active_merchant/billing/gateways/modern_payments.rb +36 -0
  35. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +214 -0
  36. data/lib/active_merchant/billing/gateways/moneris.rb +205 -0
  37. data/lib/active_merchant/billing/gateways/net_registry.rb +189 -0
  38. data/lib/active_merchant/billing/gateways/netbilling.rb +168 -0
  39. data/lib/active_merchant/billing/gateways/pay_junction.rb +392 -0
  40. data/lib/active_merchant/billing/gateways/pay_secure.rb +120 -0
  41. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +207 -0
  42. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +39 -0
  43. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
  44. data/lib/active_merchant/billing/gateways/payflow.rb +236 -0
  45. data/lib/active_merchant/billing/gateways/payflow_express.rb +138 -0
  46. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +15 -0
  47. data/lib/active_merchant/billing/gateways/payflow_uk.rb +21 -0
  48. data/lib/active_merchant/billing/gateways/payment_express.rb +230 -0
  49. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +325 -0
  50. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +38 -0
  51. data/lib/active_merchant/billing/gateways/paypal.rb +108 -0
  52. data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
  53. data/lib/active_merchant/billing/gateways/paypal_express.rb +130 -0
  54. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +20 -0
  55. data/lib/active_merchant/billing/gateways/plugnpay.rb +292 -0
  56. data/lib/active_merchant/billing/gateways/protx.rb +349 -0
  57. data/lib/active_merchant/billing/gateways/psigate.rb +214 -0
  58. data/lib/active_merchant/billing/gateways/psl_card.rb +306 -0
  59. data/lib/active_merchant/billing/gateways/quickpay.rb +213 -0
  60. data/lib/active_merchant/billing/gateways/realex.rb +200 -0
  61. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +88 -0
  62. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +110 -0
  63. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +97 -0
  64. data/lib/active_merchant/billing/gateways/sage.rb +146 -0
  65. data/lib/active_merchant/billing/gateways/secure_pay.rb +31 -0
  66. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +157 -0
  67. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +113 -0
  68. data/lib/active_merchant/billing/gateways/skip_jack.rb +442 -0
  69. data/lib/active_merchant/billing/gateways/smart_ps.rb +254 -0
  70. data/lib/active_merchant/billing/gateways/trans_first.rb +127 -0
  71. data/lib/active_merchant/billing/gateways/transax.rb +26 -0
  72. data/lib/active_merchant/billing/gateways/trust_commerce.rb +418 -0
  73. data/lib/active_merchant/billing/gateways/usa_epay.rb +194 -0
  74. data/lib/active_merchant/billing/gateways/verifi.rb +228 -0
  75. data/lib/active_merchant/billing/gateways/viaklix.rb +165 -0
  76. data/lib/active_merchant/billing/gateways/wirecard.rb +318 -0
  77. data/lib/active_merchant/billing/gateways.rb +3 -0
  78. data/lib/active_merchant/billing/integrations/action_view_helper.rb +79 -0
  79. data/lib/active_merchant/billing/integrations/bogus/helper.rb +17 -0
  80. data/lib/active_merchant/billing/integrations/bogus/notification.rb +11 -0
  81. data/lib/active_merchant/billing/integrations/bogus/return.rb +10 -0
  82. data/lib/active_merchant/billing/integrations/bogus.rb +22 -0
  83. data/lib/active_merchant/billing/integrations/chronopay/helper.rb +81 -0
  84. data/lib/active_merchant/billing/integrations/chronopay/notification.rb +156 -0
  85. data/lib/active_merchant/billing/integrations/chronopay/return.rb +10 -0
  86. data/lib/active_merchant/billing/integrations/chronopay.rb +22 -0
  87. data/lib/active_merchant/billing/integrations/gestpay/common.rb +42 -0
  88. data/lib/active_merchant/billing/integrations/gestpay/helper.rb +70 -0
  89. data/lib/active_merchant/billing/integrations/gestpay/notification.rb +83 -0
  90. data/lib/active_merchant/billing/integrations/gestpay/return.rb +10 -0
  91. data/lib/active_merchant/billing/integrations/gestpay.rb +26 -0
  92. data/lib/active_merchant/billing/integrations/helper.rb +93 -0
  93. data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +58 -0
  94. data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +59 -0
  95. data/lib/active_merchant/billing/integrations/hi_trust/return.rb +67 -0
  96. data/lib/active_merchant/billing/integrations/hi_trust.rb +26 -0
  97. data/lib/active_merchant/billing/integrations/nochex/helper.rb +68 -0
  98. data/lib/active_merchant/billing/integrations/nochex/notification.rb +94 -0
  99. data/lib/active_merchant/billing/integrations/nochex/return.rb +10 -0
  100. data/lib/active_merchant/billing/integrations/nochex.rb +87 -0
  101. data/lib/active_merchant/billing/integrations/notification.rb +62 -0
  102. data/lib/active_merchant/billing/integrations/paypal/helper.rb +118 -0
  103. data/lib/active_merchant/billing/integrations/paypal/notification.rb +154 -0
  104. data/lib/active_merchant/billing/integrations/paypal/return.rb +10 -0
  105. data/lib/active_merchant/billing/integrations/paypal.rb +40 -0
  106. data/lib/active_merchant/billing/integrations/quickpay/helper.rb +72 -0
  107. data/lib/active_merchant/billing/integrations/quickpay/notification.rb +74 -0
  108. data/lib/active_merchant/billing/integrations/quickpay.rb +18 -0
  109. data/lib/active_merchant/billing/integrations/return.rb +35 -0
  110. data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +59 -0
  111. data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +114 -0
  112. data/lib/active_merchant/billing/integrations/two_checkout/return.rb +17 -0
  113. data/lib/active_merchant/billing/integrations/two_checkout.rb +23 -0
  114. data/lib/active_merchant/billing/integrations.rb +22 -0
  115. data/lib/active_merchant/billing/response.rb +32 -0
  116. data/lib/active_merchant/lib/connection.rb +170 -0
  117. data/lib/active_merchant/lib/country.rb +319 -0
  118. data/lib/active_merchant/lib/error.rb +4 -0
  119. data/lib/active_merchant/lib/post_data.rb +22 -0
  120. data/lib/active_merchant/lib/posts_data.rb +47 -0
  121. data/lib/active_merchant/lib/requires_parameters.rb +16 -0
  122. data/lib/active_merchant/lib/utils.rb +18 -0
  123. data/lib/active_merchant/lib/validateable.rb +76 -0
  124. data/lib/active_merchant.rb +60 -0
  125. data/lib/certs/cacert.pem +7815 -0
  126. data/lib/support/gateway_support.rb +58 -0
  127. data/script/destroy +14 -0
  128. data/script/generate +14 -0
  129. data/test/fixtures.yml +330 -0
  130. data/test/remote/gateways/remote_authorize_net_cim_test.rb +459 -0
  131. data/test/remote/gateways/remote_authorize_net_test.rb +145 -0
  132. data/test/remote/gateways/remote_beanstream_interac_test.rb +53 -0
  133. data/test/remote/gateways/remote_beanstream_test.rb +150 -0
  134. data/test/remote/gateways/remote_braintree_test.rb +154 -0
  135. data/test/remote/gateways/remote_card_stream_test.rb +148 -0
  136. data/test/remote/gateways/remote_cyber_source_test.rb +144 -0
  137. data/test/remote/gateways/remote_data_cash_test.rb +357 -0
  138. data/test/remote/gateways/remote_efsnet_test.rb +81 -0
  139. data/test/remote/gateways/remote_eway_test.rb +74 -0
  140. data/test/remote/gateways/remote_exact_test.rb +60 -0
  141. data/test/remote/gateways/remote_instapay_test.rb +61 -0
  142. data/test/remote/gateways/remote_linkpoint_test.rb +112 -0
  143. data/test/remote/gateways/remote_merchant_e_solutions_test.rb +173 -0
  144. data/test/remote/gateways/remote_modern_payments_cim_test.rb +58 -0
  145. data/test/remote/gateways/remote_modern_payments_test.rb +43 -0
  146. data/test/remote/gateways/remote_moneris_test.rb +82 -0
  147. data/test/remote/gateways/remote_net_registry_test.rb +85 -0
  148. data/test/remote/gateways/remote_netbilling_test.rb +70 -0
  149. data/test/remote/gateways/remote_pay_junction_test.rb +143 -0
  150. data/test/remote/gateways/remote_pay_secure_test.rb +39 -0
  151. data/test/remote/gateways/remote_payflow_express_test.rb +50 -0
  152. data/test/remote/gateways/remote_payflow_test.rb +237 -0
  153. data/test/remote/gateways/remote_payflow_uk_test.rb +173 -0
  154. data/test/remote/gateways/remote_payment_express_test.rb +136 -0
  155. data/test/remote/gateways/remote_paypal_express_test.rb +49 -0
  156. data/test/remote/gateways/remote_paypal_test.rb +167 -0
  157. data/test/remote/gateways/remote_plugnpay_test.rb +72 -0
  158. data/test/remote/gateways/remote_protx_test.rb +219 -0
  159. data/test/remote/gateways/remote_psigate_test.rb +50 -0
  160. data/test/remote/gateways/remote_psl_card_test.rb +125 -0
  161. data/test/remote/gateways/remote_quickpay_test.rb +190 -0
  162. data/test/remote/gateways/remote_realex_test.rb +224 -0
  163. data/test/remote/gateways/remote_sage_bankcard_test.rb +109 -0
  164. data/test/remote/gateways/remote_sage_test.rb +87 -0
  165. data/test/remote/gateways/remote_sage_virtual_check_test.rb +62 -0
  166. data/test/remote/gateways/remote_secure_pay_au_test.rb +40 -0
  167. data/test/remote/gateways/remote_secure_pay_tech_test.rb +37 -0
  168. data/test/remote/gateways/remote_secure_pay_test.rb +28 -0
  169. data/test/remote/gateways/remote_skipjack_test.rb +105 -0
  170. data/test/remote/gateways/remote_trans_first_test.rb +34 -0
  171. data/test/remote/gateways/remote_transax_test.rb +112 -0
  172. data/test/remote/gateways/remote_trust_commerce_test.rb +152 -0
  173. data/test/remote/gateways/remote_usa_epay_test.rb +46 -0
  174. data/test/remote/gateways/remote_verifi_test.rb +107 -0
  175. data/test/remote/gateways/remote_viaklix_test.rb +43 -0
  176. data/test/remote/gateways/remote_wirecard_test.rb +111 -0
  177. data/test/remote/integrations/remote_gestpay_integration_test.rb +37 -0
  178. data/test/remote/integrations/remote_paypal_integration_test.rb +26 -0
  179. data/test/test_helper.rb +182 -0
  180. data/test/unit/avs_result_test.rb +59 -0
  181. data/test/unit/base_test.rb +55 -0
  182. data/test/unit/check_test.rb +88 -0
  183. data/test/unit/connection_test.rb +129 -0
  184. data/test/unit/country_code_test.rb +33 -0
  185. data/test/unit/country_test.rb +64 -0
  186. data/test/unit/credit_card_formatting_test.rb +19 -0
  187. data/test/unit/credit_card_methods_test.rb +170 -0
  188. data/test/unit/credit_card_test.rb +318 -0
  189. data/test/unit/cvv_result_test.rb +33 -0
  190. data/test/unit/expiry_date_test.rb +21 -0
  191. data/test/unit/gateways/authorize_net_cim_test.rb +638 -0
  192. data/test/unit/gateways/authorize_net_test.rb +290 -0
  193. data/test/unit/gateways/beanstream_interac_test.rb +51 -0
  194. data/test/unit/gateways/beanstream_test.rb +108 -0
  195. data/test/unit/gateways/bogus_test.rb +46 -0
  196. data/test/unit/gateways/braintree_test.rb +126 -0
  197. data/test/unit/gateways/card_stream_test.rb +90 -0
  198. data/test/unit/gateways/cyber_source_test.rb +188 -0
  199. data/test/unit/gateways/data_cash_test.rb +133 -0
  200. data/test/unit/gateways/efsnet_test.rb +123 -0
  201. data/test/unit/gateways/eway_test.rb +118 -0
  202. data/test/unit/gateways/exact_test.rb +156 -0
  203. data/test/unit/gateways/gateway_test.rb +48 -0
  204. data/test/unit/gateways/instapay_test.rb +102 -0
  205. data/test/unit/gateways/linkpoint_test.rb +167 -0
  206. data/test/unit/gateways/merchant_e_solutions_test.rb +169 -0
  207. data/test/unit/gateways/modern_payments_cim_test.rb +171 -0
  208. data/test/unit/gateways/moneris_test.rb +158 -0
  209. data/test/unit/gateways/net_registry_test.rb +416 -0
  210. data/test/unit/gateways/netbilling_test.rb +54 -0
  211. data/test/unit/gateways/pay_junction_test.rb +123 -0
  212. data/test/unit/gateways/pay_secure_test.rb +71 -0
  213. data/test/unit/gateways/payflow_express_test.rb +173 -0
  214. data/test/unit/gateways/payflow_express_uk_test.rb +86 -0
  215. data/test/unit/gateways/payflow_test.rb +305 -0
  216. data/test/unit/gateways/payflow_uk_test.rb +30 -0
  217. data/test/unit/gateways/payment_express_test.rb +195 -0
  218. data/test/unit/gateways/paypal_express_test.rb +382 -0
  219. data/test/unit/gateways/paypal_test.rb +520 -0
  220. data/test/unit/gateways/plugnpay_test.rb +86 -0
  221. data/test/unit/gateways/protx_test.rb +139 -0
  222. data/test/unit/gateways/psigate_test.rb +169 -0
  223. data/test/unit/gateways/psl_card_test.rb +64 -0
  224. data/test/unit/gateways/quickpay_test.rb +112 -0
  225. data/test/unit/gateways/realex_test.rb +151 -0
  226. data/test/unit/gateways/sage_bankcard_test.rb +162 -0
  227. data/test/unit/gateways/sage_virtual_check_test.rb +71 -0
  228. data/test/unit/gateways/secure_pay_au_test.rb +207 -0
  229. data/test/unit/gateways/secure_pay_tech_test.rb +44 -0
  230. data/test/unit/gateways/secure_pay_test.rb +87 -0
  231. data/test/unit/gateways/skip_jack_test.rb +133 -0
  232. data/test/unit/gateways/trans_first_test.rb +112 -0
  233. data/test/unit/gateways/trust_commerce_test.rb +90 -0
  234. data/test/unit/gateways/usa_epay_test.rb +128 -0
  235. data/test/unit/gateways/verifi_test.rb +96 -0
  236. data/test/unit/gateways/viaklix_test.rb +78 -0
  237. data/test/unit/gateways/wirecard_test.rb +250 -0
  238. data/test/unit/generators/test_gateway_generator.rb +46 -0
  239. data/test/unit/generators/test_generator_helper.rb +20 -0
  240. data/test/unit/generators/test_integration_generator.rb +53 -0
  241. data/test/unit/integrations/action_view_helper_test.rb +50 -0
  242. data/test/unit/integrations/bogus_module_test.rb +20 -0
  243. data/test/unit/integrations/chronopay_module_test.rb +13 -0
  244. data/test/unit/integrations/gestpay_module_test.rb +14 -0
  245. data/test/unit/integrations/helpers/bogus_helper_test.rb +28 -0
  246. data/test/unit/integrations/helpers/chronopay_helper_test.rb +67 -0
  247. data/test/unit/integrations/helpers/gestpay_helper_test.rb +100 -0
  248. data/test/unit/integrations/helpers/hi_trust_helper_test.rb +16 -0
  249. data/test/unit/integrations/helpers/nochex_helper_test.rb +53 -0
  250. data/test/unit/integrations/helpers/paypal_helper_test.rb +162 -0
  251. data/test/unit/integrations/helpers/quickpay_helper_test.rb +40 -0
  252. data/test/unit/integrations/helpers/two_checkout_helper_test.rb +92 -0
  253. data/test/unit/integrations/hi_trust_module_test.rb +13 -0
  254. data/test/unit/integrations/nochex_module_test.rb +13 -0
  255. data/test/unit/integrations/notifications/chronopay_notification_test.rb +66 -0
  256. data/test/unit/integrations/notifications/gestpay_notification_test.rb +60 -0
  257. data/test/unit/integrations/notifications/hi_trust_notification_test.rb +59 -0
  258. data/test/unit/integrations/notifications/nochex_notification_test.rb +51 -0
  259. data/test/unit/integrations/notifications/notification_test.rb +54 -0
  260. data/test/unit/integrations/notifications/paypal_notification_test.rb +85 -0
  261. data/test/unit/integrations/notifications/quickpay_notification_test.rb +69 -0
  262. data/test/unit/integrations/notifications/two_checkout_notification_test.rb +55 -0
  263. data/test/unit/integrations/paypal_module_test.rb +28 -0
  264. data/test/unit/integrations/quickpay_module_test.rb +9 -0
  265. data/test/unit/integrations/returns/chronopay_return_test.rb +11 -0
  266. data/test/unit/integrations/returns/gestpay_return_test.rb +10 -0
  267. data/test/unit/integrations/returns/hi_trust_return_test.rb +24 -0
  268. data/test/unit/integrations/returns/nochex_return_test.rb +10 -0
  269. data/test/unit/integrations/returns/paypal_return_test.rb +10 -0
  270. data/test/unit/integrations/returns/return_test.rb +11 -0
  271. data/test/unit/integrations/returns/two_checkout_return_test.rb +24 -0
  272. data/test/unit/integrations/two_checkout_module_test.rb +13 -0
  273. data/test/unit/post_data_test.rb +55 -0
  274. data/test/unit/posts_data_test.rb +48 -0
  275. data/test/unit/response_test.rb +28 -0
  276. data/test/unit/utils_test.rb +7 -0
  277. data/test/unit/validateable_test.rb +60 -0
  278. metadata +364 -0
@@ -0,0 +1,229 @@
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
+ # Perform authorization reversal
45
+ request = build_refund_or_settle_request(money, identification_or_credit_card, options)
46
+ commit(:credit_card_refund, request)
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 void(identification, options = {})
55
+ requires!(options, :order_id)
56
+ original_transaction_id, original_transaction_amount = identification.split(";")
57
+ commit(:void_transaction, {:reference_number => format_reference_number(options[:order_id]), :transaction_ID => original_transaction_id})
58
+ end
59
+
60
+ def voice_authorize(money, authorization_code, creditcard, options = {})
61
+ options[:authorization_number] = authorization_code
62
+ request = build_credit_card_request(money, creditcard, options)
63
+ commit(:credit_card_voice_authorize, request)
64
+ end
65
+
66
+ def force(money, authorization_code, creditcard, options = {})
67
+ options[:authorization_number] = authorization_code
68
+ request = build_credit_card_request(money, creditcard, options)
69
+ commit(:credit_card_capture, request)
70
+ end
71
+
72
+ def system_check
73
+ commit(:system_check, {})
74
+ end
75
+
76
+ private
77
+
78
+ def build_refund_or_settle_request(money, identification, options = {})
79
+ original_transaction_id, original_transaction_amount = identification.split(";")
80
+
81
+ requires!(options, :order_id)
82
+
83
+ post = {
84
+ :reference_number => format_reference_number(options[:order_id]),
85
+ :transaction_amount => amount(money),
86
+ :original_transaction_amount => original_transaction_amount,
87
+ :original_transaction_ID => original_transaction_id,
88
+ :client_ip_address => options[:ip]
89
+ }
90
+ end
91
+
92
+ def build_credit_card_request(money, creditcard, options = {})
93
+ requires!(options, :order_id)
94
+
95
+ post = {
96
+ :reference_number => format_reference_number(options[:order_id]),
97
+ :authorization_number => options[:authorization_number],
98
+ :transaction_amount => amount(money),
99
+ :client_ip_address => options[:ip]
100
+
101
+ }
102
+ add_creditcard(post,creditcard)
103
+ add_address(post,options)
104
+ post
105
+ end
106
+
107
+ def format_reference_number(number)
108
+ number.to_s.slice(0,12)
109
+ end
110
+
111
+ def add_address(post,options)
112
+ if address = options[:billing_address] || options[:address]
113
+ if address[:address2]
114
+ post[:billing_address] = address[:address1].to_s << ' ' << address[:address2].to_s
115
+ else
116
+ post[:billing_address] = address[:address1].to_s
117
+ end
118
+ post[:billing_city] = address[:city].to_s
119
+ post[:billing_state] = address[:state].blank? ? 'n/a' : address[:state]
120
+ post[:billing_postal_code] = address[:zip].to_s
121
+ post[:billing_country] = address[:country].to_s
122
+ end
123
+
124
+ if address = options[:shipping_address]
125
+ if address[:address2]
126
+ post[:shipping_address] = address[:address1].to_s << ' ' << address[:address2].to_s
127
+ else
128
+ post[:shipping_address] = address[:address1].to_s
129
+ end
130
+ post[:shipping_city] = address[:city].to_s
131
+ post[:shipping_state] = address[:state].blank? ? 'n/a' : address[:state]
132
+ post[:shipping_postal_code] = address[:zip].to_s
133
+ post[:shipping_country] = address[:country].to_s
134
+ end
135
+ end
136
+
137
+ def add_creditcard(post, creditcard)
138
+ post[:billing_name] = creditcard.name if creditcard.name
139
+ post[:account_number] = creditcard.number
140
+ post[:card_verification_value] = creditcard.verification_value if creditcard.verification_value?
141
+ post[:expiration_month] = sprintf("%.2i", creditcard.month)
142
+ post[:expiration_year] = sprintf("%.4i", creditcard.year)[-2..-1]
143
+ end
144
+
145
+
146
+ def commit(action, parameters)
147
+ response = parse(ssl_post(test? ? TEST_URL : LIVE_URL, post_data(action, parameters), 'Content-Type' => 'text/xml'))
148
+
149
+ Response.new(success?(response), message_from(response[:result_message]), response,
150
+ :test => test?,
151
+ :authorization => authorization_from(response, parameters),
152
+ :avs_result => { :code => response[:avs_response_code] },
153
+ :cvv_result => response[:cvv_response_code]
154
+ )
155
+ end
156
+
157
+ def success?(response)
158
+ response[:response_code] == '0'
159
+ end
160
+
161
+ def authorization_from(response, params)
162
+ [ response[:transaction_id], params[:transaction_amount] ].compact.join(';')
163
+ end
164
+
165
+ def parse(xml)
166
+ response = {}
167
+
168
+ xml = REXML::Document.new(xml)
169
+
170
+ xml.elements.each('//Reply//TransactionReply/*') do |node|
171
+
172
+ response[node.name.underscore.to_sym] = normalize(node.text)
173
+
174
+ end unless xml.root.nil?
175
+
176
+ response
177
+ end
178
+
179
+ def post_data(action, parameters = {})
180
+ xml = REXML::Document.new("<?xml version='1.0' encoding='UTF-8'?>")
181
+ root = xml.add_element("Request")
182
+ root.attributes["StoreID"] = options[:login]
183
+ root.attributes["StoreKey"] = options[:password]
184
+ root.attributes["ApplicationID"] = 'ot 1.0'
185
+ transaction = root.add_element(action.to_s.camelize)
186
+
187
+ actions[action].each do |key|
188
+ transaction.add_element(key.to_s.camelize).text = parameters[key] unless parameters[key].blank?
189
+ end
190
+
191
+ xml.to_s
192
+ end
193
+
194
+ def message_from(message)
195
+ return 'Unspecified error' if message.blank?
196
+ message.gsub(/[^\w]/, ' ').split.join(" ").capitalize
197
+ end
198
+
199
+ # Make a ruby type out of the response string
200
+ def normalize(field)
201
+ case field
202
+ when "true" then true
203
+ when "false" then false
204
+ when "" then nil
205
+ when "null" then nil
206
+ else field
207
+ end
208
+ end
209
+
210
+ def actions
211
+ ACTIONS
212
+ end
213
+
214
+ 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 ]
215
+
216
+ ACTIONS = {
217
+ :credit_card_authorize => CREDIT_CARD_FIELDS,
218
+ :credit_card_charge => CREDIT_CARD_FIELDS,
219
+ :credit_card_voice_authorize => CREDIT_CARD_FIELDS,
220
+ :credit_card_capture => CREDIT_CARD_FIELDS,
221
+ :credit_card_credit => CREDIT_CARD_FIELDS << :original_transaction_amount,
222
+ :credit_card_refund => [:reference_number, :transaction_amount, :original_transaction_amount, :original_transaction_ID, :client_ip_address],
223
+ :void_transaction => [:reference_number, :transaction_ID],
224
+ :credit_card_settle => [:reference_number, :transaction_amount, :original_transaction_amount, :original_transaction_ID, :client_ip_address],
225
+ :system_check => [:system_check],
226
+ }
227
+ end
228
+ end
229
+ end
@@ -0,0 +1,272 @@
1
+ require 'rexml/document'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ # First, make sure you have everything setup correctly and all of your dependencies in place with:
6
+ #
7
+ # require 'rubygems'
8
+ # require 'active_merchant'
9
+ #
10
+ # ActiveMerchant expects the amounts to be given as an Integer in cents. In this case, $10 US becomes 1000.
11
+ #
12
+ # tendollar = 1000
13
+ #
14
+ # Next, create a credit card object using a TC approved test card.
15
+ #
16
+ # creditcard = ActiveMerchant::Billing::CreditCard.new(
17
+ # :number => '4111111111111111',
18
+ # :month => 8,
19
+ # :year => 2006,
20
+ # :first_name => 'Longbob',
21
+ # :last_name => 'Longsen'
22
+ # )
23
+ # options = {
24
+ # :order_id => '1230123',
25
+ # :email => 'bob@testbob.com',
26
+ # :address => { :address1 => '47 Bobway',
27
+ # :city => 'Bobville',
28
+ # :state => 'WA',
29
+ # :country => 'Australia',
30
+ # :zip => '2000'
31
+ # }
32
+ # :description => 'purchased items'
33
+ # }
34
+ #
35
+ # To finish setting up, create the active_merchant object you will be using, with the eWay gateway. If you have a
36
+ # functional eWay account, replace :login with your account info.
37
+ #
38
+ # gateway = ActiveMerchant::Billing::Base.gateway(:eway).new(:login => '87654321')
39
+ #
40
+ # Now we are ready to process our transaction
41
+ #
42
+ # response = gateway.purchase(tendollar, creditcard, options)
43
+ #
44
+ # Sending a transaction to TrustCommerce with active_merchant returns a Response object, which consistently allows you to:
45
+ #
46
+ # 1) Check whether the transaction was successful
47
+ #
48
+ # response.success?
49
+ #
50
+ # 2) Retrieve any message returned by eWay, either a "transaction was successful" note or an explanation of why the
51
+ # transaction was rejected.
52
+ #
53
+ # response.message
54
+ #
55
+ # 3) Retrieve and store the unique transaction ID returned by eWway, for use in referencing the transaction in the future.
56
+ #
57
+ # response.authorization
58
+ #
59
+ # This should be enough to get you started with eWay and active_merchant. For further information, review the methods
60
+ # below and the rest of active_merchant's documentation.
61
+
62
+ class EwayGateway < Gateway
63
+ TEST_URL = 'https://www.eway.com.au/gateway/xmltest/testpage.asp'
64
+ LIVE_URL = 'https://www.eway.com.au/gateway/xmlpayment.asp'
65
+
66
+ TEST_CVN_URL = 'https://www.eway.com.au/gateway_cvn/xmltest/testpage.asp'
67
+ LIVE_CVN_URL = 'https://www.eway.com.au/gateway_cvn/xmlpayment.asp'
68
+
69
+ MESSAGES = {
70
+ "00" => "Transaction Approved",
71
+ "01" => "Refer to Issuer",
72
+ "02" => "Refer to Issuer, special",
73
+ "03" => "No Merchant",
74
+ "04" => "Pick Up Card",
75
+ "05" => "Do Not Honour",
76
+ "06" => "Error",
77
+ "07" => "Pick Up Card, Special",
78
+ "08" => "Honour With Identification",
79
+ "09" => "Request In Progress",
80
+ "10" => "Approved For Partial Amount",
81
+ "11" => "Approved, VIP",
82
+ "12" => "Invalid Transaction",
83
+ "13" => "Invalid Amount",
84
+ "14" => "Invalid Card Number",
85
+ "15" => "No Issuer",
86
+ "16" => "Approved, Update Track 3",
87
+ "19" => "Re-enter Last Transaction",
88
+ "21" => "No Action Taken",
89
+ "22" => "Suspected Malfunction",
90
+ "23" => "Unacceptable Transaction Fee",
91
+ "25" => "Unable to Locate Record On File",
92
+ "30" => "Format Error",
93
+ "31" => "Bank Not Supported By Switch",
94
+ "33" => "Expired Card, Capture",
95
+ "34" => "Suspected Fraud, Retain Card",
96
+ "35" => "Card Acceptor, Contact Acquirer, Retain Card",
97
+ "36" => "Restricted Card, Retain Card",
98
+ "37" => "Contact Acquirer Security Department, Retain Card",
99
+ "38" => "PIN Tries Exceeded, Capture",
100
+ "39" => "No Credit Account",
101
+ "40" => "Function Not Supported",
102
+ "41" => "Lost Card",
103
+ "42" => "No Universal Account",
104
+ "43" => "Stolen Card",
105
+ "44" => "No Investment Account",
106
+ "51" => "Insufficient Funds",
107
+ "52" => "No Cheque Account",
108
+ "53" => "No Savings Account",
109
+ "54" => "Expired Card",
110
+ "55" => "Incorrect PIN",
111
+ "56" => "No Card Record",
112
+ "57" => "Function Not Permitted to Cardholder",
113
+ "58" => "Function Not Permitted to Terminal",
114
+ "59" => "Suspected Fraud",
115
+ "60" => "Acceptor Contact Acquirer",
116
+ "61" => "Exceeds Withdrawal Limit",
117
+ "62" => "Restricted Card",
118
+ "63" => "Security Violation",
119
+ "64" => "Original Amount Incorrect",
120
+ "66" => "Acceptor Contact Acquirer, Security",
121
+ "67" => "Capture Card",
122
+ "75" => "PIN Tries Exceeded",
123
+ "82" => "CVV Validation Error",
124
+ "90" => "Cutoff In Progress",
125
+ "91" => "Card Issuer Unavailable",
126
+ "92" => "Unable To Route Transaction",
127
+ "93" => "Cannot Complete, Violation Of The Law",
128
+ "94" => "Duplicate Transaction",
129
+ "96" => "System Error"
130
+ }
131
+
132
+ self.money_format = :cents
133
+ self.supported_countries = ['AU']
134
+ self.supported_cardtypes = [:visa, :master]
135
+ self.homepage_url = 'http://www.eway.com.au/'
136
+ self.display_name = 'eWAY'
137
+
138
+ def initialize(options = {})
139
+ requires!(options, :login)
140
+ @options = options
141
+ super
142
+ end
143
+
144
+ # ewayCustomerEmail, ewayCustomerAddress, ewayCustomerPostcode
145
+ def purchase(money, creditcard, options = {})
146
+ requires!(options, :order_id)
147
+
148
+ post = {}
149
+ add_creditcard(post, creditcard)
150
+ add_address(post, options)
151
+ add_customer_data(post, options)
152
+ add_invoice_data(post, options)
153
+ # The request fails if all of the fields aren't present
154
+ add_optional_data(post)
155
+
156
+ commit(money, post)
157
+ end
158
+
159
+ private
160
+ def add_creditcard(post, creditcard)
161
+ post[:CardNumber] = creditcard.number
162
+ post[:CardExpiryMonth] = sprintf("%.2i", creditcard.month)
163
+ post[:CardExpiryYear] = sprintf("%.4i", creditcard.year)[-2..-1]
164
+ post[:CustomerFirstName] = creditcard.first_name
165
+ post[:CustomerLastName] = creditcard.last_name
166
+ post[:CardHoldersName] = creditcard.name
167
+
168
+ post[:CVN] = creditcard.verification_value if creditcard.verification_value?
169
+ end
170
+
171
+ def add_address(post, options)
172
+ if address = options[:billing_address] || options[:address]
173
+ post[:CustomerAddress] = [ address[:address1], address[:address2], address[:city], address[:state], address[:country] ].compact.join(', ')
174
+ post[:CustomerPostcode] = address[:zip]
175
+ end
176
+ end
177
+
178
+ def add_customer_data(post, options)
179
+ post[:CustomerEmail] = options[:email]
180
+ end
181
+
182
+ def add_invoice_data(post, options)
183
+ post[:CustomerInvoiceRef] = options[:order_id]
184
+ post[:CustomerInvoiceDescription] = options[:description]
185
+ end
186
+
187
+ def add_optional_data(post)
188
+ post[:TrxnNumber] = nil
189
+ post[:Option1] = nil
190
+ post[:Option2] = nil
191
+ post[:Option3] = nil
192
+ end
193
+
194
+ def commit(money, parameters)
195
+ parameters[:TotalAmount] = amount(money)
196
+
197
+ response = parse( ssl_post(gateway_url(parameters[:CVN], test?), post_data(parameters)) )
198
+
199
+ Response.new(success?(response), message_from(response[:ewaytrxnerror]), response,
200
+ :authorization => response[:ewayauthcode],
201
+ :test => /\(Test( CVN)? Gateway\)/ === response[:ewaytrxnerror]
202
+ )
203
+ end
204
+
205
+ def success?(response)
206
+ response[:ewaytrxnstatus] == "True"
207
+ end
208
+
209
+ # Parse eway response xml into a convinient hash
210
+ def parse(xml)
211
+ # "<?xml version=\"1.0\"?>".
212
+ # <ewayResponse>
213
+ # <ewayTrxnError></ewayTrxnError>
214
+ # <ewayTrxnStatus>True</ewayTrxnStatus>
215
+ # <ewayTrxnNumber>10002</ewayTrxnNumber>
216
+ # <ewayTrxnOption1></ewayTrxnOption1>
217
+ # <ewayTrxnOption2></ewayTrxnOption2>
218
+ # <ewayTrxnOption3></ewayTrxnOption3>
219
+ # <ewayReturnAmount>10</ewayReturnAmount>
220
+ # <ewayAuthCode>123456</ewayAuthCode>
221
+ # <ewayTrxnReference>987654321</ewayTrxnReference>
222
+ # </ewayResponse>
223
+
224
+ response = {}
225
+ xml = REXML::Document.new(xml)
226
+ xml.elements.each('//ewayResponse/*') do |node|
227
+
228
+ response[node.name.downcase.to_sym] = normalize(node.text)
229
+
230
+ end unless xml.root.nil?
231
+
232
+ response
233
+ end
234
+
235
+ def post_data(parameters = {})
236
+ parameters[:CustomerID] = @options[:login]
237
+
238
+ xml = REXML::Document.new
239
+ root = xml.add_element("ewaygateway")
240
+
241
+ parameters.each do |key, value|
242
+ root.add_element("eway#{key}").text = value
243
+ end
244
+ xml.to_s
245
+ end
246
+
247
+ def message_from(message)
248
+ return '' if message.blank?
249
+ MESSAGES[message[0,2]] || message
250
+ end
251
+
252
+ # Make a ruby type out of the response string
253
+ def normalize(field)
254
+ case field
255
+ when "true" then true
256
+ when "false" then false
257
+ when "" then nil
258
+ when "null" then nil
259
+ else field
260
+ end
261
+ end
262
+
263
+ def gateway_url(cvn, test)
264
+ if cvn
265
+ test ? TEST_CVN_URL : LIVE_CVN_URL
266
+ else
267
+ test ? TEST_URL : LIVE_URL
268
+ end
269
+ end
270
+ end
271
+ end
272
+ end