mattbauer-activemerchant 1.4.2

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 (292) hide show
  1. data/CHANGELOG +459 -0
  2. data/CONTRIBUTERS +118 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README +134 -0
  5. data/Rakefile +153 -0
  6. data/gem-public_cert.pem +20 -0
  7. data/init.rb +3 -0
  8. data/lib/active_merchant.rb +60 -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 +34 -0
  17. data/lib/active_merchant/billing/gateway.rb +158 -0
  18. data/lib/active_merchant/billing/gateways.rb +3 -0
  19. data/lib/active_merchant/billing/gateways/authorize_net.rb +657 -0
  20. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +703 -0
  21. data/lib/active_merchant/billing/gateways/beanstream.rb +102 -0
  22. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +233 -0
  23. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +54 -0
  24. data/lib/active_merchant/billing/gateways/bogus.rb +98 -0
  25. data/lib/active_merchant/billing/gateways/braintree.rb +17 -0
  26. data/lib/active_merchant/billing/gateways/card_stream.rb +230 -0
  27. data/lib/active_merchant/billing/gateways/cyber_source.rb +406 -0
  28. data/lib/active_merchant/billing/gateways/data_cash.rb +595 -0
  29. data/lib/active_merchant/billing/gateways/efsnet.rb +229 -0
  30. data/lib/active_merchant/billing/gateways/elavon.rb +106 -0
  31. data/lib/active_merchant/billing/gateways/eway.rb +277 -0
  32. data/lib/active_merchant/billing/gateways/exact.rb +222 -0
  33. data/lib/active_merchant/billing/gateways/first_pay.rb +172 -0
  34. data/lib/active_merchant/billing/gateways/instapay.rb +164 -0
  35. data/lib/active_merchant/billing/gateways/linkpoint.rb +396 -0
  36. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +154 -0
  37. data/lib/active_merchant/billing/gateways/merchant_ware.rb +283 -0
  38. data/lib/active_merchant/billing/gateways/modern_payments.rb +36 -0
  39. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +214 -0
  40. data/lib/active_merchant/billing/gateways/moneris.rb +295 -0
  41. data/lib/active_merchant/billing/gateways/moneris_usa.rb +258 -0
  42. data/lib/active_merchant/billing/gateways/net_registry.rb +189 -0
  43. data/lib/active_merchant/billing/gateways/netbilling.rb +168 -0
  44. data/lib/active_merchant/billing/gateways/ogone.rb +259 -0
  45. data/lib/active_merchant/billing/gateways/pay_junction.rb +392 -0
  46. data/lib/active_merchant/billing/gateways/pay_secure.rb +120 -0
  47. data/lib/active_merchant/billing/gateways/payflow.rb +236 -0
  48. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +207 -0
  49. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +39 -0
  50. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
  51. data/lib/active_merchant/billing/gateways/payflow_express.rb +138 -0
  52. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +15 -0
  53. data/lib/active_merchant/billing/gateways/payflow_uk.rb +21 -0
  54. data/lib/active_merchant/billing/gateways/payment_express.rb +230 -0
  55. data/lib/active_merchant/billing/gateways/paypal.rb +121 -0
  56. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +325 -0
  57. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +38 -0
  58. data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
  59. data/lib/active_merchant/billing/gateways/paypal_express.rb +130 -0
  60. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +20 -0
  61. data/lib/active_merchant/billing/gateways/plugnpay.rb +292 -0
  62. data/lib/active_merchant/billing/gateways/psigate.rb +214 -0
  63. data/lib/active_merchant/billing/gateways/psl_card.rb +306 -0
  64. data/lib/active_merchant/billing/gateways/quickpay.rb +213 -0
  65. data/lib/active_merchant/billing/gateways/realex.rb +200 -0
  66. data/lib/active_merchant/billing/gateways/sage.rb +146 -0
  67. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +88 -0
  68. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +110 -0
  69. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +97 -0
  70. data/lib/active_merchant/billing/gateways/sage_pay.rb +308 -0
  71. data/lib/active_merchant/billing/gateways/secure_pay.rb +31 -0
  72. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +157 -0
  73. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +113 -0
  74. data/lib/active_merchant/billing/gateways/skip_jack.rb +442 -0
  75. data/lib/active_merchant/billing/gateways/smart_ps.rb +254 -0
  76. data/lib/active_merchant/billing/gateways/trans_first.rb +127 -0
  77. data/lib/active_merchant/billing/gateways/transax.rb +26 -0
  78. data/lib/active_merchant/billing/gateways/trust_commerce.rb +418 -0
  79. data/lib/active_merchant/billing/gateways/usa_epay.rb +194 -0
  80. data/lib/active_merchant/billing/gateways/verifi.rb +228 -0
  81. data/lib/active_merchant/billing/gateways/viaklix.rb +189 -0
  82. data/lib/active_merchant/billing/gateways/wirecard.rb +318 -0
  83. data/lib/active_merchant/billing/integrations.rb +22 -0
  84. data/lib/active_merchant/billing/integrations/action_view_helper.rb +79 -0
  85. data/lib/active_merchant/billing/integrations/bogus.rb +22 -0
  86. data/lib/active_merchant/billing/integrations/bogus/helper.rb +17 -0
  87. data/lib/active_merchant/billing/integrations/bogus/notification.rb +11 -0
  88. data/lib/active_merchant/billing/integrations/bogus/return.rb +10 -0
  89. data/lib/active_merchant/billing/integrations/chronopay.rb +22 -0
  90. data/lib/active_merchant/billing/integrations/chronopay/helper.rb +81 -0
  91. data/lib/active_merchant/billing/integrations/chronopay/notification.rb +156 -0
  92. data/lib/active_merchant/billing/integrations/chronopay/return.rb +10 -0
  93. data/lib/active_merchant/billing/integrations/gestpay.rb +26 -0
  94. data/lib/active_merchant/billing/integrations/gestpay/common.rb +42 -0
  95. data/lib/active_merchant/billing/integrations/gestpay/helper.rb +70 -0
  96. data/lib/active_merchant/billing/integrations/gestpay/notification.rb +83 -0
  97. data/lib/active_merchant/billing/integrations/gestpay/return.rb +10 -0
  98. data/lib/active_merchant/billing/integrations/helper.rb +93 -0
  99. data/lib/active_merchant/billing/integrations/hi_trust.rb +26 -0
  100. data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +58 -0
  101. data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +59 -0
  102. data/lib/active_merchant/billing/integrations/hi_trust/return.rb +67 -0
  103. data/lib/active_merchant/billing/integrations/nochex.rb +87 -0
  104. data/lib/active_merchant/billing/integrations/nochex/helper.rb +68 -0
  105. data/lib/active_merchant/billing/integrations/nochex/notification.rb +94 -0
  106. data/lib/active_merchant/billing/integrations/nochex/return.rb +10 -0
  107. data/lib/active_merchant/billing/integrations/notification.rb +62 -0
  108. data/lib/active_merchant/billing/integrations/paypal.rb +40 -0
  109. data/lib/active_merchant/billing/integrations/paypal/helper.rb +119 -0
  110. data/lib/active_merchant/billing/integrations/paypal/notification.rb +154 -0
  111. data/lib/active_merchant/billing/integrations/paypal/return.rb +10 -0
  112. data/lib/active_merchant/billing/integrations/quickpay.rb +18 -0
  113. data/lib/active_merchant/billing/integrations/quickpay/helper.rb +72 -0
  114. data/lib/active_merchant/billing/integrations/quickpay/notification.rb +74 -0
  115. data/lib/active_merchant/billing/integrations/return.rb +35 -0
  116. data/lib/active_merchant/billing/integrations/two_checkout.rb +23 -0
  117. data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +59 -0
  118. data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +114 -0
  119. data/lib/active_merchant/billing/integrations/two_checkout/return.rb +17 -0
  120. data/lib/active_merchant/billing/response.rb +32 -0
  121. data/lib/active_merchant/lib/connection.rb +170 -0
  122. data/lib/active_merchant/lib/country.rb +319 -0
  123. data/lib/active_merchant/lib/error.rb +4 -0
  124. data/lib/active_merchant/lib/post_data.rb +22 -0
  125. data/lib/active_merchant/lib/posts_data.rb +47 -0
  126. data/lib/active_merchant/lib/requires_parameters.rb +16 -0
  127. data/lib/active_merchant/lib/utils.rb +18 -0
  128. data/lib/active_merchant/lib/validateable.rb +76 -0
  129. data/lib/certs/cacert.pem +7815 -0
  130. data/lib/support/gateway_support.rb +58 -0
  131. data/script/destroy +14 -0
  132. data/script/generate +14 -0
  133. data/test/fixtures.yml +353 -0
  134. data/test/remote/gateways/remote_authorize_net_cim_test.rb +459 -0
  135. data/test/remote/gateways/remote_authorize_net_test.rb +145 -0
  136. data/test/remote/gateways/remote_beanstream_interac_test.rb +53 -0
  137. data/test/remote/gateways/remote_beanstream_test.rb +150 -0
  138. data/test/remote/gateways/remote_braintree_test.rb +154 -0
  139. data/test/remote/gateways/remote_card_stream_test.rb +148 -0
  140. data/test/remote/gateways/remote_cyber_source_test.rb +144 -0
  141. data/test/remote/gateways/remote_data_cash_test.rb +357 -0
  142. data/test/remote/gateways/remote_efsnet_test.rb +81 -0
  143. data/test/remote/gateways/remote_elavon_test.rb +66 -0
  144. data/test/remote/gateways/remote_eway_test.rb +74 -0
  145. data/test/remote/gateways/remote_exact_test.rb +60 -0
  146. data/test/remote/gateways/remote_first_pay_test.rb +87 -0
  147. data/test/remote/gateways/remote_instapay_test.rb +61 -0
  148. data/test/remote/gateways/remote_linkpoint_test.rb +112 -0
  149. data/test/remote/gateways/remote_merchant_e_solutions_test.rb +173 -0
  150. data/test/remote/gateways/remote_merchant_ware_test.rb +113 -0
  151. data/test/remote/gateways/remote_modern_payments_cim_test.rb +58 -0
  152. data/test/remote/gateways/remote_modern_payments_test.rb +43 -0
  153. data/test/remote/gateways/remote_moneris_test.rb +118 -0
  154. data/test/remote/gateways/remote_moneris_usa_test.rb +115 -0
  155. data/test/remote/gateways/remote_net_registry_test.rb +85 -0
  156. data/test/remote/gateways/remote_netbilling_test.rb +70 -0
  157. data/test/remote/gateways/remote_ogone_test.rb +108 -0
  158. data/test/remote/gateways/remote_pay_junction_test.rb +143 -0
  159. data/test/remote/gateways/remote_pay_secure_test.rb +39 -0
  160. data/test/remote/gateways/remote_payflow_express_test.rb +50 -0
  161. data/test/remote/gateways/remote_payflow_test.rb +237 -0
  162. data/test/remote/gateways/remote_payflow_uk_test.rb +173 -0
  163. data/test/remote/gateways/remote_payment_express_test.rb +136 -0
  164. data/test/remote/gateways/remote_paypal_express_test.rb +49 -0
  165. data/test/remote/gateways/remote_paypal_test.rb +178 -0
  166. data/test/remote/gateways/remote_plugnpay_test.rb +72 -0
  167. data/test/remote/gateways/remote_psigate_test.rb +50 -0
  168. data/test/remote/gateways/remote_psl_card_test.rb +125 -0
  169. data/test/remote/gateways/remote_quickpay_test.rb +190 -0
  170. data/test/remote/gateways/remote_realex_test.rb +224 -0
  171. data/test/remote/gateways/remote_sage_bankcard_test.rb +109 -0
  172. data/test/remote/gateways/remote_sage_pay_test.rb +219 -0
  173. data/test/remote/gateways/remote_sage_test.rb +87 -0
  174. data/test/remote/gateways/remote_sage_virtual_check_test.rb +62 -0
  175. data/test/remote/gateways/remote_secure_pay_au_test.rb +40 -0
  176. data/test/remote/gateways/remote_secure_pay_tech_test.rb +37 -0
  177. data/test/remote/gateways/remote_secure_pay_test.rb +28 -0
  178. data/test/remote/gateways/remote_skipjack_test.rb +105 -0
  179. data/test/remote/gateways/remote_trans_first_test.rb +34 -0
  180. data/test/remote/gateways/remote_transax_test.rb +112 -0
  181. data/test/remote/gateways/remote_trust_commerce_test.rb +152 -0
  182. data/test/remote/gateways/remote_usa_epay_test.rb +46 -0
  183. data/test/remote/gateways/remote_verifi_test.rb +107 -0
  184. data/test/remote/gateways/remote_viaklix_test.rb +43 -0
  185. data/test/remote/gateways/remote_wirecard_test.rb +111 -0
  186. data/test/remote/integrations/remote_gestpay_integration_test.rb +37 -0
  187. data/test/remote/integrations/remote_paypal_integration_test.rb +26 -0
  188. data/test/test_helper.rb +182 -0
  189. data/test/unit/avs_result_test.rb +59 -0
  190. data/test/unit/base_test.rb +55 -0
  191. data/test/unit/check_test.rb +88 -0
  192. data/test/unit/connection_test.rb +129 -0
  193. data/test/unit/country_code_test.rb +33 -0
  194. data/test/unit/country_test.rb +64 -0
  195. data/test/unit/credit_card_formatting_test.rb +19 -0
  196. data/test/unit/credit_card_methods_test.rb +179 -0
  197. data/test/unit/credit_card_test.rb +318 -0
  198. data/test/unit/cvv_result_test.rb +33 -0
  199. data/test/unit/expiry_date_test.rb +32 -0
  200. data/test/unit/gateways/authorize_net_cim_test.rb +638 -0
  201. data/test/unit/gateways/authorize_net_test.rb +290 -0
  202. data/test/unit/gateways/beanstream_interac_test.rb +51 -0
  203. data/test/unit/gateways/beanstream_test.rb +108 -0
  204. data/test/unit/gateways/bogus_test.rb +46 -0
  205. data/test/unit/gateways/braintree_test.rb +126 -0
  206. data/test/unit/gateways/card_stream_test.rb +90 -0
  207. data/test/unit/gateways/cyber_source_test.rb +188 -0
  208. data/test/unit/gateways/data_cash_test.rb +133 -0
  209. data/test/unit/gateways/efsnet_test.rb +123 -0
  210. data/test/unit/gateways/elavon_test.rb +139 -0
  211. data/test/unit/gateways/eway_test.rb +118 -0
  212. data/test/unit/gateways/exact_test.rb +156 -0
  213. data/test/unit/gateways/first_pay_test.rb +125 -0
  214. data/test/unit/gateways/gateway_test.rb +48 -0
  215. data/test/unit/gateways/instapay_test.rb +102 -0
  216. data/test/unit/gateways/linkpoint_test.rb +167 -0
  217. data/test/unit/gateways/merchant_e_solutions_test.rb +169 -0
  218. data/test/unit/gateways/merchant_ware_test.rb +188 -0
  219. data/test/unit/gateways/modern_payments_cim_test.rb +171 -0
  220. data/test/unit/gateways/moneris_test.rb +185 -0
  221. data/test/unit/gateways/moneris_usa_test.rb +183 -0
  222. data/test/unit/gateways/net_registry_test.rb +416 -0
  223. data/test/unit/gateways/netbilling_test.rb +54 -0
  224. data/test/unit/gateways/ogone_test.rb +256 -0
  225. data/test/unit/gateways/pay_junction_test.rb +123 -0
  226. data/test/unit/gateways/pay_secure_test.rb +71 -0
  227. data/test/unit/gateways/payflow_express_test.rb +173 -0
  228. data/test/unit/gateways/payflow_express_uk_test.rb +86 -0
  229. data/test/unit/gateways/payflow_test.rb +305 -0
  230. data/test/unit/gateways/payflow_uk_test.rb +30 -0
  231. data/test/unit/gateways/payment_express_test.rb +195 -0
  232. data/test/unit/gateways/paypal_express_test.rb +382 -0
  233. data/test/unit/gateways/paypal_test.rb +569 -0
  234. data/test/unit/gateways/plugnpay_test.rb +86 -0
  235. data/test/unit/gateways/psigate_test.rb +169 -0
  236. data/test/unit/gateways/psl_card_test.rb +64 -0
  237. data/test/unit/gateways/quickpay_test.rb +112 -0
  238. data/test/unit/gateways/realex_test.rb +151 -0
  239. data/test/unit/gateways/sage_bankcard_test.rb +162 -0
  240. data/test/unit/gateways/sage_pay_test.rb +139 -0
  241. data/test/unit/gateways/sage_virtual_check_test.rb +71 -0
  242. data/test/unit/gateways/secure_pay_au_test.rb +207 -0
  243. data/test/unit/gateways/secure_pay_tech_test.rb +44 -0
  244. data/test/unit/gateways/secure_pay_test.rb +87 -0
  245. data/test/unit/gateways/skip_jack_test.rb +133 -0
  246. data/test/unit/gateways/trans_first_test.rb +112 -0
  247. data/test/unit/gateways/trust_commerce_test.rb +90 -0
  248. data/test/unit/gateways/usa_epay_test.rb +128 -0
  249. data/test/unit/gateways/verifi_test.rb +96 -0
  250. data/test/unit/gateways/viaklix_test.rb +78 -0
  251. data/test/unit/gateways/wirecard_test.rb +250 -0
  252. data/test/unit/generators/test_gateway_generator.rb +46 -0
  253. data/test/unit/generators/test_generator_helper.rb +20 -0
  254. data/test/unit/generators/test_integration_generator.rb +53 -0
  255. data/test/unit/integrations/action_view_helper_test.rb +50 -0
  256. data/test/unit/integrations/bogus_module_test.rb +20 -0
  257. data/test/unit/integrations/chronopay_module_test.rb +13 -0
  258. data/test/unit/integrations/gestpay_module_test.rb +14 -0
  259. data/test/unit/integrations/helpers/bogus_helper_test.rb +28 -0
  260. data/test/unit/integrations/helpers/chronopay_helper_test.rb +67 -0
  261. data/test/unit/integrations/helpers/gestpay_helper_test.rb +100 -0
  262. data/test/unit/integrations/helpers/hi_trust_helper_test.rb +16 -0
  263. data/test/unit/integrations/helpers/nochex_helper_test.rb +53 -0
  264. data/test/unit/integrations/helpers/paypal_helper_test.rb +171 -0
  265. data/test/unit/integrations/helpers/quickpay_helper_test.rb +40 -0
  266. data/test/unit/integrations/helpers/two_checkout_helper_test.rb +92 -0
  267. data/test/unit/integrations/hi_trust_module_test.rb +13 -0
  268. data/test/unit/integrations/nochex_module_test.rb +13 -0
  269. data/test/unit/integrations/notifications/chronopay_notification_test.rb +66 -0
  270. data/test/unit/integrations/notifications/gestpay_notification_test.rb +60 -0
  271. data/test/unit/integrations/notifications/hi_trust_notification_test.rb +59 -0
  272. data/test/unit/integrations/notifications/nochex_notification_test.rb +51 -0
  273. data/test/unit/integrations/notifications/notification_test.rb +54 -0
  274. data/test/unit/integrations/notifications/paypal_notification_test.rb +85 -0
  275. data/test/unit/integrations/notifications/quickpay_notification_test.rb +69 -0
  276. data/test/unit/integrations/notifications/two_checkout_notification_test.rb +55 -0
  277. data/test/unit/integrations/paypal_module_test.rb +28 -0
  278. data/test/unit/integrations/quickpay_module_test.rb +9 -0
  279. data/test/unit/integrations/returns/chronopay_return_test.rb +11 -0
  280. data/test/unit/integrations/returns/gestpay_return_test.rb +10 -0
  281. data/test/unit/integrations/returns/hi_trust_return_test.rb +24 -0
  282. data/test/unit/integrations/returns/nochex_return_test.rb +10 -0
  283. data/test/unit/integrations/returns/paypal_return_test.rb +10 -0
  284. data/test/unit/integrations/returns/return_test.rb +11 -0
  285. data/test/unit/integrations/returns/two_checkout_return_test.rb +24 -0
  286. data/test/unit/integrations/two_checkout_module_test.rb +13 -0
  287. data/test/unit/post_data_test.rb +55 -0
  288. data/test/unit/posts_data_test.rb +48 -0
  289. data/test/unit/response_test.rb +28 -0
  290. data/test/unit/utils_test.rb +7 -0
  291. data/test/unit/validateable_test.rb +60 -0
  292. metadata +396 -0
@@ -0,0 +1,595 @@
1
+ # Authors:: MoneySpyder, http://moneyspyder.co.uk and E-consultancy, http://www.e-consultancy.com
2
+
3
+ module ActiveMerchant
4
+ module Billing
5
+ class DataCashGateway < Gateway
6
+ self.default_currency = 'GBP'
7
+ self.supported_countries = ['GB']
8
+
9
+ # From the DataCash docs; Page 13, the following cards are
10
+ # usable:
11
+ # American Express, ATM, Carte Blanche, Diners Club, Discover,
12
+ # EnRoute, GE Capital, JCB, Laser, Maestro, Mastercard, Solo,
13
+ # Switch, Visa, Visa Delta, VISA Electron, Visa Purchasing
14
+ #
15
+ # Note continuous authority is only supported for :visa, :master and :american_express card types
16
+ self.supported_cardtypes = [ :visa, :master, :american_express, :discover, :diners_club, :jcb, :maestro, :switch, :solo, :laser ]
17
+
18
+ self.homepage_url = 'http://www.datacash.com/'
19
+ self.display_name = 'DataCash'
20
+
21
+ # Datacash server URLs
22
+ TEST_URL = 'https://testserver.datacash.com/Transaction'
23
+ LIVE_URL = 'https://mars.transaction.datacash.com/Transaction'
24
+
25
+ # Different Card Transaction Types
26
+ AUTH_TYPE = 'auth'
27
+ CANCEL_TYPE = 'cancel'
28
+ FULFILL_TYPE = 'fulfill'
29
+ PRE_TYPE = 'pre'
30
+ REFUND_TYPE = 'refund'
31
+ TRANSACTION_REFUND_TYPE = 'txn_refund'
32
+
33
+ # Constant strings for use in the ExtendedPolicy complex element for
34
+ # CV2 checks
35
+ POLICY_ACCEPT = 'accept'
36
+ POLICY_REJECT = 'reject'
37
+
38
+ # Datacash success code
39
+ DATACASH_SUCCESS = '1'
40
+
41
+ # Creates a new DataCashGateway
42
+ #
43
+ # The gateway requires that a valid login and password be passed
44
+ # in the +options+ hash.
45
+ #
46
+ # ==== Options
47
+ #
48
+ # * <tt>:login</tt> -- The Datacash account login.
49
+ # * <tt>:password</tt> -- The Datacash account password.
50
+ # * <tt>:test => +true+ or +false+</tt> -- Use the test or live Datacash url.
51
+ #
52
+ def initialize(options = {})
53
+ requires!(options, :login, :password)
54
+ @options = options
55
+ super
56
+ end
57
+
58
+ # Perform a purchase, which is essentially an authorization and capture in a single operation.
59
+ #
60
+ # ==== Parameters
61
+ # * <tt>money</tt> The amount to be authorized. Either an Integer value in cents or a Money object.
62
+ # * <tt>authorization_or_credit_card</tt>:: The continuous authority reference or CreditCard details for the transaction.
63
+ # * <tt>options</tt> A hash of optional parameters.
64
+ # * <tt>:order_id</tt> A unique reference for this order (corresponds to merchantreference in datacash documentation)
65
+ # * <tt>:set_up_continuous_authority</tt>
66
+ # Set to true to set up a recurring historic transaction account be set up.
67
+ # Only supported for :visa, :master and :american_express card types
68
+ # See http://www.datacash.com/services/recurring/historic.php for more details of historic transactions.
69
+ # * <tt>:address</tt>:: billing address for card
70
+ #
71
+ # The continuous authority reference will be available in response#params['ca_referece'] if you have requested one
72
+ def purchase(money, authorization_or_credit_card, options = {})
73
+ requires!(options, :order_id)
74
+
75
+ if authorization_or_credit_card.is_a?(String)
76
+ request = build_purchase_or_authorization_request_with_continuous_authority_reference_request(AUTH_TYPE, money, authorization_or_credit_card, options)
77
+ else
78
+ request = build_purchase_or_authorization_request_with_credit_card_request(AUTH_TYPE, money, authorization_or_credit_card, options)
79
+ end
80
+
81
+ commit(request)
82
+ end
83
+
84
+ # Performs an authorization, which reserves the funds on the customer's credit card, but does not
85
+ # charge the card.
86
+ #
87
+ # ==== Parameters
88
+ #
89
+ # * <tt>money</tt> The amount to be authorized. Either an Integer value in cents or a Money object.
90
+ # * <tt>authorization_or_credit_card</tt>:: The continuous authority reference or CreditCard details for the transaction.
91
+ # * <tt>options</tt> A hash of optional parameters.
92
+ # * <tt>:order_id</tt> A unique reference for this order (corresponds to merchantreference in datacash documentation)
93
+ # * <tt>:set_up_continuous_authority</tt>::
94
+ # Set to true to set up a recurring historic transaction account be set up.
95
+ # Only supported for :visa, :master and :american_express card types
96
+ # See http://www.datacash.com/services/recurring/historic.php for more details of historic transactions.
97
+ # * <tt>:address</tt>:: billing address for card
98
+ #
99
+ # The continuous authority reference will be available in response#params['ca_referece'] if you have requested one
100
+ def authorize(money, authorization_or_credit_card, options = {})
101
+ requires!(options, :order_id)
102
+
103
+ if authorization_or_credit_card.is_a?(String)
104
+ request = build_purchase_or_authorization_request_with_continuous_authority_reference_request(AUTH_TYPE, money, authorization_or_credit_card, options)
105
+ else
106
+ request = build_purchase_or_authorization_request_with_credit_card_request(PRE_TYPE, money, authorization_or_credit_card, options)
107
+ end
108
+
109
+ commit(request)
110
+ end
111
+
112
+ # Captures the funds from an authorized transaction.
113
+ #
114
+ # ==== Parameters
115
+ #
116
+ # * <tt>money</tt> -- The amount to be captured. Either an Integer value in cents or a Money object.
117
+ # * <tt>authorization</tt> -- The authorization returned from the previous authorize request.
118
+ def capture(money, authorization, options = {})
119
+ commit(build_void_or_capture_request(FULFILL_TYPE, money, authorization, options))
120
+ end
121
+
122
+ # Void a previous transaction
123
+ #
124
+ # ==== Parameters
125
+ #
126
+ # * <tt>authorization</tt> - The authorization returned from the previous authorize request.
127
+ def void(authorization, options = {})
128
+ request = build_void_or_capture_request(CANCEL_TYPE, nil, authorization, options)
129
+
130
+ commit(request)
131
+ end
132
+
133
+ # Refund to a card
134
+ #
135
+ # ==== Parameters
136
+ #
137
+ # * <tt>money</tt> The amount to be refunded. Either an Integer value in cents or a Money object. Set to nil for a full refund on existing transaction.
138
+ # * <tt>reference_or_credit_card</tt> The credit card you want to refund OR the datacash_reference for the existing transaction you are refunding
139
+ # * <tt>options</tt> Are ignored when refunding via reference to an existing transaction, otherwise
140
+ # * <tt>:order_id</tt> A unique reference for this order (corresponds to merchantreference in datacash documentation)
141
+ # * <tt>:address</tt>:: billing address for card
142
+ def credit(money, reference_or_credit_card, options = {})
143
+ if reference_or_credit_card.is_a?(String)
144
+ request = build_transaction_refund_request(money, reference_or_credit_card)
145
+ else
146
+ request = build_refund_request(money, reference_or_credit_card, options)
147
+ end
148
+
149
+ commit(request)
150
+ end
151
+
152
+ # Is the gateway running in test mode?
153
+ def test?
154
+ @options[:test] || super
155
+ end
156
+
157
+ private
158
+ # Create the xml document for a 'cancel' or 'fulfill' transaction.
159
+ #
160
+ # Final XML should look like:
161
+ # <Request>
162
+ # <Authentication>
163
+ # <client>99000001</client>
164
+ # <password>******</password>
165
+ # </Authentication>
166
+ # <Transaction>
167
+ # <TxnDetails>
168
+ # <amount>25.00</amount>
169
+ # </TxnDetails>
170
+ # <HistoricTxn>
171
+ # <reference>4900200000000001</reference>
172
+ # <authcode>A6</authcode>
173
+ # <method>fulfill</method>
174
+ # </HistoricTxn>
175
+ # </Transaction>
176
+ # </Request>
177
+ #
178
+ # Parameters:
179
+ # * <tt>type</tt> must be FULFILL_TYPE or CANCEL_TYPE
180
+ # * <tt>money</tt> - optional - Money object or value in cents
181
+ # * <tt>authorization</tt> - the Datacash authorization from a previous succesful authorize transaction
182
+ # * <tt>options</tt>
183
+ # * <tt>order_id</tt> - A unique reference for the transaction
184
+ #
185
+ # Returns:
186
+ # -Builder xml document
187
+ #
188
+ def build_void_or_capture_request(type, money, authorization, options)
189
+ reference, auth_code, ca_reference = authorization.to_s.split(';')
190
+
191
+ xml = Builder::XmlMarkup.new :indent => 2
192
+ xml.instruct!
193
+ xml.tag! :Request do
194
+ add_authentication(xml)
195
+
196
+ xml.tag! :Transaction do
197
+ xml.tag! :HistoricTxn do
198
+ xml.tag! :reference, reference
199
+ xml.tag! :authcode, auth_code
200
+ xml.tag! :method, type
201
+ end
202
+
203
+ if money
204
+ xml.tag! :TxnDetails do
205
+ xml.tag! :merchantreference, format_reference_number(options[:order_id])
206
+ xml.tag! :amount, amount(money), :currency => options[:currency] || currency(money)
207
+ end
208
+ end
209
+ end
210
+ end
211
+ xml.target!
212
+ end
213
+
214
+ # Create the xml document for an 'auth' or 'pre' transaction with a credit card
215
+ #
216
+ # Final XML should look like:
217
+ #
218
+ # <Request>
219
+ # <Authentication>
220
+ # <client>99000000</client>
221
+ # <password>*******</password>
222
+ # </Authentication>
223
+ # <Transaction>
224
+ # <TxnDetails>
225
+ # <merchantreference>123456</merchantreference>
226
+ # <amount currency="EUR">10.00</amount>
227
+ # </TxnDetails>
228
+ # <CardTxn>
229
+ # <Card>
230
+ # <pan>4444********1111</pan>
231
+ # <expirydate>03/04</expirydate>
232
+ # <Cv2Avs>
233
+ # <street_address1>Flat 7</street_address1>
234
+ # <street_address2>89 Jumble
235
+ # Street</street_address2>
236
+ # <street_address3>Mytown</street_address3>
237
+ # <postcode>AV12FR</postcode>
238
+ # <cv2>123</cv2>
239
+ # <ExtendedPolicy>
240
+ # <cv2_policy notprovided="reject"
241
+ # notchecked="accept"
242
+ # matched="accept"
243
+ # notmatched="reject"
244
+ # partialmatch="reject"/>
245
+ # <postcode_policy notprovided="reject"
246
+ # notchecked="accept"
247
+ # matched="accept"
248
+ # notmatched="reject"
249
+ # partialmatch="accept"/>
250
+ # <address_policy notprovided="reject"
251
+ # notchecked="accept"
252
+ # matched="accept"
253
+ # notmatched="reject"
254
+ # partialmatch="accept"/>
255
+ # </ExtendedPolicy>
256
+ # </Cv2Avs>
257
+ # </Card>
258
+ # <method>auth</method>
259
+ # </CardTxn>
260
+ # </Transaction>
261
+ # </Request>
262
+ #
263
+ # Parameters:
264
+ # -type must be 'auth' or 'pre'
265
+ # -money - A money object with the price and currency
266
+ # -credit_card - The credit_card details to use
267
+ # -options:
268
+ # :order_id is the merchant reference number
269
+ # :billing_address is the billing address for the cc
270
+ # :address is the delivery address
271
+ #
272
+ # Returns:
273
+ # -xml: Builder document containing the markup
274
+ #
275
+ def build_purchase_or_authorization_request_with_credit_card_request(type, money, credit_card, options)
276
+ xml = Builder::XmlMarkup.new :indent => 2
277
+ xml.instruct!
278
+ xml.tag! :Request do
279
+ add_authentication(xml)
280
+
281
+ xml.tag! :Transaction do
282
+ if options[:set_up_continuous_authority]
283
+ xml.tag! :ContAuthTxn, :type => 'setup'
284
+ end
285
+ xml.tag! :CardTxn do
286
+ xml.tag! :method, type
287
+ add_credit_card(xml, credit_card, options[:billing_address])
288
+ end
289
+ xml.tag! :TxnDetails do
290
+ xml.tag! :merchantreference, format_reference_number(options[:order_id])
291
+ xml.tag! :amount, amount(money), :currency => options[:currency] || currency(money)
292
+ end
293
+ end
294
+ end
295
+ xml.target!
296
+ end
297
+
298
+ # Create the xml document for an 'auth' or 'pre' transaction with
299
+ # continuous authorization
300
+ #
301
+ # Final XML should look like:
302
+ #
303
+ # <Request>
304
+ # <Transaction>
305
+ # <ContAuthTxn type="historic" />
306
+ # <TxnDetails>
307
+ # <merchantreference>3851231</merchantreference>
308
+ # <capturemethod>cont_auth</capturemethod>
309
+ # <amount currency="GBP">18.50</amount>
310
+ # </TxnDetails>
311
+ # <HistoricTxn>
312
+ # <reference>4500200040925092</reference>
313
+ # <method>auth</method>
314
+ # </HistoricTxn>
315
+ # </Transaction>
316
+ # <Authentication>
317
+ # <client>99000001</client>
318
+ # <password>mypasswd</password>
319
+ # </Authentication>
320
+ # </Request>
321
+ #
322
+ # Parameters:
323
+ # -type must be 'auth' or 'pre'
324
+ # -money - A money object with the price and currency
325
+ # -authorization - The authorization containing a continuous authority reference previously set up on a credit card
326
+ # -options:
327
+ # :order_id is the merchant reference number
328
+ #
329
+ # Returns:
330
+ # -xml: Builder document containing the markup
331
+ #
332
+ def build_purchase_or_authorization_request_with_continuous_authority_reference_request(type, money, authorization, options)
333
+ reference, auth_code, ca_reference = authorization.to_s.split(';')
334
+ raise ArgumentError, "The continuous authority reference is required for continuous authority transactions" if ca_reference.blank?
335
+
336
+ xml = Builder::XmlMarkup.new :indent => 2
337
+ xml.instruct!
338
+ xml.tag! :Request do
339
+ add_authentication(xml)
340
+ xml.tag! :Transaction do
341
+ xml.tag! :ContAuthTxn, :type => 'historic'
342
+ xml.tag! :HistoricTxn do
343
+ xml.tag! :reference, ca_reference
344
+ xml.tag! :method, type
345
+ end
346
+ xml.tag! :TxnDetails do
347
+ xml.tag! :merchantreference, format_reference_number(options[:order_id])
348
+ xml.tag! :amount, amount(money), :currency => options[:currency] || currency(money)
349
+ xml.tag! :capturemethod, 'cont_auth'
350
+ end
351
+ end
352
+ end
353
+ xml.target!
354
+ end
355
+
356
+ # Create the xml document for a full or partial refund transaction with
357
+ #
358
+ # Final XML should look like:
359
+ #
360
+ # <Request>
361
+ # <Authentication>
362
+ # <client>99000001</client>
363
+ # <password>*******</password>
364
+ # </Authentication>
365
+ # <Transaction>
366
+ # <HistoricTxn>
367
+ # <method>txn_refund</method>
368
+ # <reference>12345678</reference>
369
+ # </HistoricTxn>
370
+ # <TxnDetails>
371
+ # <amount>10.00</amount>
372
+ # </TxnDetails>
373
+ # </Transaction>
374
+ # </Request>
375
+ #
376
+ def build_transaction_refund_request(money, reference)
377
+ xml = Builder::XmlMarkup.new :indent => 2
378
+ xml.instruct!
379
+ xml.tag! :Request do
380
+ add_authentication(xml)
381
+ xml.tag! :Transaction do
382
+ xml.tag! :HistoricTxn do
383
+ xml.tag! :reference, reference
384
+ xml.tag! :method, TRANSACTION_REFUND_TYPE
385
+ end
386
+ unless money.nil?
387
+ xml.tag! :TxnDetails do
388
+ xml.tag! :amount, amount(money)
389
+ end
390
+ end
391
+ end
392
+ end
393
+ xml.target!
394
+ end
395
+
396
+ # Create the xml document for a full or partial refund with
397
+ #
398
+ # Final XML should look like:
399
+ #
400
+ # <Request>
401
+ # <Authentication>
402
+ # <client>99000001</client>
403
+ # <password>*****</password>
404
+ # </Authentication>
405
+ # <Transaction>
406
+ # <CardTxn>
407
+ # <Card>
408
+ # <pan>633300*********1</pan>
409
+ # <expirydate>04/06</expirydate>
410
+ # <startdate>01/04</startdate>
411
+ # </Card>
412
+ # <method>refund</method>
413
+ # </CardTxn>
414
+ # <TxnDetails>
415
+ # <merchantreference>1000001</merchantreference>
416
+ # <amount currency="GBP">95.99</amount>
417
+ # </TxnDetails>
418
+ # </Transaction>
419
+ # </Request>
420
+ def build_refund_request(money, credit_card, options)
421
+ xml = Builder::XmlMarkup.new :indent => 2
422
+ xml.instruct!
423
+ xml.tag! :Request do
424
+ add_authentication(xml)
425
+ xml.tag! :Transaction do
426
+ xml.tag! :CardTxn do
427
+ xml.tag! :method, REFUND_TYPE
428
+ add_credit_card(xml, credit_card, options[:billing_address])
429
+ end
430
+ xml.tag! :TxnDetails do
431
+ xml.tag! :merchantreference, format_reference_number(options[:order_id])
432
+ xml.tag! :amount, amount(money)
433
+ end
434
+ end
435
+ end
436
+ xml.target!
437
+ end
438
+
439
+
440
+ # Adds the authentication element to the passed builder xml doc
441
+ #
442
+ # Parameters:
443
+ # -xml: Builder document that is being built up
444
+ #
445
+ # Returns:
446
+ # -none: The results is stored in the passed xml document
447
+ #
448
+ def add_authentication(xml)
449
+ xml.tag! :Authentication do
450
+ xml.tag! :client, @options[:login]
451
+ xml.tag! :password, @options[:password]
452
+ end
453
+ end
454
+
455
+ # Add credit_card detals to the passed XML Builder doc
456
+ #
457
+ # Parameters:
458
+ # -xml: Builder document that is being built up
459
+ # -credit_card: ActiveMerchant::Billing::CreditCard object
460
+ # -billing_address: Hash containing all of the billing address details
461
+ #
462
+ # Returns:
463
+ # -none: The results is stored in the passed xml document
464
+ #
465
+ def add_credit_card(xml, credit_card, address)
466
+
467
+ xml.tag! :Card do
468
+
469
+ # DataCash calls the CC number 'pan'
470
+ xml.tag! :pan, credit_card.number
471
+ xml.tag! :expirydate, format_date(credit_card.month, credit_card.year)
472
+
473
+ # optional values - for Solo etc
474
+ if [ 'switch', 'solo' ].include?(card_brand(credit_card).to_s)
475
+
476
+ xml.tag! :issuenumber, credit_card.issue_number unless credit_card.issue_number.blank?
477
+
478
+ if !credit_card.start_month.blank? && !credit_card.start_year.blank?
479
+ xml.tag! :startdate, format_date(credit_card.start_month, credit_card.start_year)
480
+ end
481
+ end
482
+
483
+ xml.tag! :Cv2Avs do
484
+ xml.tag! :cv2, credit_card.verification_value if credit_card.verification_value?
485
+ if address
486
+ xml.tag! :street_address1, address[:address1] unless address[:address1].blank?
487
+ xml.tag! :street_address2, address[:address2] unless address[:address2].blank?
488
+ xml.tag! :street_address3, address[:address3] unless address[:address3].blank?
489
+ xml.tag! :street_address4, address[:address4] unless address[:address4].blank?
490
+ xml.tag! :postcode, address[:zip] unless address[:zip].blank?
491
+ end
492
+
493
+ # The ExtendedPolicy defines what to do when the passed data
494
+ # matches, or not...
495
+ #
496
+ # All of the following elements MUST be present for the
497
+ # xml to be valid (or can drop the ExtendedPolicy and use
498
+ # a predefined one
499
+ xml.tag! :ExtendedPolicy do
500
+ xml.tag! :cv2_policy,
501
+ :notprovided => POLICY_REJECT,
502
+ :notchecked => POLICY_REJECT,
503
+ :matched => POLICY_ACCEPT,
504
+ :notmatched => POLICY_REJECT,
505
+ :partialmatch => POLICY_REJECT
506
+ xml.tag! :postcode_policy,
507
+ :notprovided => POLICY_ACCEPT,
508
+ :notchecked => POLICY_ACCEPT,
509
+ :matched => POLICY_ACCEPT,
510
+ :notmatched => POLICY_REJECT,
511
+ :partialmatch => POLICY_ACCEPT
512
+ xml.tag! :address_policy,
513
+ :notprovided => POLICY_ACCEPT,
514
+ :notchecked => POLICY_ACCEPT,
515
+ :matched => POLICY_ACCEPT,
516
+ :notmatched => POLICY_REJECT,
517
+ :partialmatch => POLICY_ACCEPT
518
+ end
519
+ end
520
+ end
521
+ end
522
+
523
+ # Send the passed data to DataCash for processing
524
+ #
525
+ # Parameters:
526
+ # -request: The XML data that is to be sent to Datacash
527
+ #
528
+ # Returns:
529
+ # - ActiveMerchant::Billing::Response object
530
+ #
531
+ def commit(request)
532
+ response = parse(ssl_post(test? ? TEST_URL : LIVE_URL, request))
533
+
534
+ Response.new(response[:status] == DATACASH_SUCCESS, response[:reason], response,
535
+ :test => test?,
536
+ :authorization => "#{response[:datacash_reference]};#{response[:authcode]};#{response[:ca_reference]}"
537
+ )
538
+ end
539
+
540
+ # Returns a date string in the format Datacash expects
541
+ #
542
+ # Parameters:
543
+ # -month: integer, the month
544
+ # -year: integer, the year
545
+ #
546
+ # Returns:
547
+ # -String: date in MM/YY format
548
+ #
549
+ def format_date(month, year)
550
+ "#{format(month,:two_digits)}/#{format(year, :two_digits)}"
551
+ end
552
+
553
+ # Parse the datacash response and create a Response object
554
+ #
555
+ # Parameters:
556
+ # -body: The XML returned from Datacash
557
+ #
558
+ # Returns:
559
+ # -a hash with all of the values returned in the Datacash XML response
560
+ #
561
+ def parse(body)
562
+
563
+ response = {}
564
+ xml = REXML::Document.new(body)
565
+ root = REXML::XPath.first(xml, "//Response")
566
+
567
+ root.elements.to_a.each do |node|
568
+ parse_element(response, node)
569
+ end
570
+
571
+ response
572
+ end
573
+
574
+ # Parse an xml element
575
+ #
576
+ # Parameters:
577
+ # -response: The hash that the values are being returned in
578
+ # -node: The node that is currently being read
579
+ #
580
+ # Returns:
581
+ # - none (results are stored in the passed hash)
582
+ def parse_element(response, node)
583
+ if node.has_elements?
584
+ node.elements.each{|e| parse_element(response, e) }
585
+ else
586
+ response[node.name.underscore.to_sym] = node.text
587
+ end
588
+ end
589
+
590
+ def format_reference_number(number)
591
+ number.to_s.gsub(/[^A-Za-z0-9]/, '').rjust(6, "0").first(30)
592
+ end
593
+ end
594
+ end
595
+ end