abtain_billing 1.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 (294) hide show
  1. data/CHANGELOG +473 -0
  2. data/CONTRIBUTORS +126 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README +3 -0
  5. data/Rakefile +153 -0
  6. data/init.rb +3 -0
  7. data/lib/active_merchant.rb +60 -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 +159 -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 +158 -0
  17. data/lib/active_merchant/billing/gateways.rb +3 -0
  18. data/lib/active_merchant/billing/gateways/authorize_net.rb +657 -0
  19. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +813 -0
  20. data/lib/active_merchant/billing/gateways/beanstream.rb +102 -0
  21. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +233 -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/elavon.rb +106 -0
  30. data/lib/active_merchant/billing/gateways/eway.rb +277 -0
  31. data/lib/active_merchant/billing/gateways/exact.rb +222 -0
  32. data/lib/active_merchant/billing/gateways/first_pay.rb +172 -0
  33. data/lib/active_merchant/billing/gateways/instapay.rb +164 -0
  34. data/lib/active_merchant/billing/gateways/jetpay.rb +270 -0
  35. data/lib/active_merchant/billing/gateways/linkpoint.rb +449 -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 +205 -0
  41. data/lib/active_merchant/billing/gateways/net_registry.rb +189 -0
  42. data/lib/active_merchant/billing/gateways/netbilling.rb +168 -0
  43. data/lib/active_merchant/billing/gateways/ogone.rb +279 -0
  44. data/lib/active_merchant/billing/gateways/pay_junction.rb +392 -0
  45. data/lib/active_merchant/billing/gateways/pay_secure.rb +120 -0
  46. data/lib/active_merchant/billing/gateways/payflow.rb +236 -0
  47. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +207 -0
  48. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +39 -0
  49. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
  50. data/lib/active_merchant/billing/gateways/payflow_express.rb +138 -0
  51. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +15 -0
  52. data/lib/active_merchant/billing/gateways/payflow_uk.rb +21 -0
  53. data/lib/active_merchant/billing/gateways/payment_express.rb +230 -0
  54. data/lib/active_merchant/billing/gateways/paypal.rb +121 -0
  55. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +326 -0
  56. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +38 -0
  57. data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
  58. data/lib/active_merchant/billing/gateways/paypal_express.rb +130 -0
  59. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +20 -0
  60. data/lib/active_merchant/billing/gateways/plugnpay.rb +292 -0
  61. data/lib/active_merchant/billing/gateways/psigate.rb +214 -0
  62. data/lib/active_merchant/billing/gateways/psl_card.rb +306 -0
  63. data/lib/active_merchant/billing/gateways/quickpay.rb +213 -0
  64. data/lib/active_merchant/billing/gateways/realex.rb +200 -0
  65. data/lib/active_merchant/billing/gateways/sage.rb +146 -0
  66. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +88 -0
  67. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +116 -0
  68. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +97 -0
  69. data/lib/active_merchant/billing/gateways/sage_pay.rb +308 -0
  70. data/lib/active_merchant/billing/gateways/sallie_mae.rb +144 -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 +452 -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 +355 -0
  134. data/test/remote/gateways/remote_authorize_net_cim_test.rb +460 -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_jetpay_test.rb +103 -0
  149. data/test/remote/gateways/remote_linkpoint_test.rb +121 -0
  150. data/test/remote/gateways/remote_merchant_e_solutions_test.rb +173 -0
  151. data/test/remote/gateways/remote_merchant_ware_test.rb +113 -0
  152. data/test/remote/gateways/remote_modern_payments_cim_test.rb +58 -0
  153. data/test/remote/gateways/remote_modern_payments_test.rb +43 -0
  154. data/test/remote/gateways/remote_moneris_test.rb +82 -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 +115 -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 +191 -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_sallie_mae_test.rb +51 -0
  176. data/test/remote/gateways/remote_secure_pay_au_test.rb +40 -0
  177. data/test/remote/gateways/remote_secure_pay_tech_test.rb +37 -0
  178. data/test/remote/gateways/remote_secure_pay_test.rb +28 -0
  179. data/test/remote/gateways/remote_skipjack_test.rb +105 -0
  180. data/test/remote/gateways/remote_trans_first_test.rb +34 -0
  181. data/test/remote/gateways/remote_transax_test.rb +112 -0
  182. data/test/remote/gateways/remote_trust_commerce_test.rb +152 -0
  183. data/test/remote/gateways/remote_usa_epay_test.rb +46 -0
  184. data/test/remote/gateways/remote_verifi_test.rb +107 -0
  185. data/test/remote/gateways/remote_viaklix_test.rb +43 -0
  186. data/test/remote/gateways/remote_wirecard_test.rb +111 -0
  187. data/test/remote/integrations/remote_gestpay_integration_test.rb +37 -0
  188. data/test/remote/integrations/remote_paypal_integration_test.rb +26 -0
  189. data/test/test_helper.rb +182 -0
  190. data/test/unit/avs_result_test.rb +59 -0
  191. data/test/unit/base_test.rb +55 -0
  192. data/test/unit/check_test.rb +88 -0
  193. data/test/unit/connection_test.rb +129 -0
  194. data/test/unit/country_code_test.rb +33 -0
  195. data/test/unit/country_test.rb +64 -0
  196. data/test/unit/credit_card_formatting_test.rb +19 -0
  197. data/test/unit/credit_card_methods_test.rb +179 -0
  198. data/test/unit/credit_card_test.rb +318 -0
  199. data/test/unit/cvv_result_test.rb +33 -0
  200. data/test/unit/expiry_date_test.rb +32 -0
  201. data/test/unit/gateways/authorize_net_cim_test.rb +676 -0
  202. data/test/unit/gateways/authorize_net_test.rb +290 -0
  203. data/test/unit/gateways/beanstream_interac_test.rb +51 -0
  204. data/test/unit/gateways/beanstream_test.rb +108 -0
  205. data/test/unit/gateways/bogus_test.rb +46 -0
  206. data/test/unit/gateways/braintree_test.rb +126 -0
  207. data/test/unit/gateways/card_stream_test.rb +90 -0
  208. data/test/unit/gateways/cyber_source_test.rb +188 -0
  209. data/test/unit/gateways/data_cash_test.rb +133 -0
  210. data/test/unit/gateways/efsnet_test.rb +123 -0
  211. data/test/unit/gateways/elavon_test.rb +139 -0
  212. data/test/unit/gateways/eway_test.rb +118 -0
  213. data/test/unit/gateways/exact_test.rb +156 -0
  214. data/test/unit/gateways/first_pay_test.rb +125 -0
  215. data/test/unit/gateways/gateway_test.rb +48 -0
  216. data/test/unit/gateways/instapay_test.rb +102 -0
  217. data/test/unit/gateways/jetpay_test.rb +185 -0
  218. data/test/unit/gateways/linkpoint_test.rb +184 -0
  219. data/test/unit/gateways/merchant_e_solutions_test.rb +169 -0
  220. data/test/unit/gateways/merchant_ware_test.rb +188 -0
  221. data/test/unit/gateways/modern_payments_cim_test.rb +171 -0
  222. data/test/unit/gateways/moneris_test.rb +158 -0
  223. data/test/unit/gateways/net_registry_test.rb +416 -0
  224. data/test/unit/gateways/netbilling_test.rb +54 -0
  225. data/test/unit/gateways/ogone_test.rb +319 -0
  226. data/test/unit/gateways/pay_junction_test.rb +123 -0
  227. data/test/unit/gateways/pay_secure_test.rb +71 -0
  228. data/test/unit/gateways/payflow_express_test.rb +173 -0
  229. data/test/unit/gateways/payflow_express_uk_test.rb +86 -0
  230. data/test/unit/gateways/payflow_test.rb +305 -0
  231. data/test/unit/gateways/payflow_uk_test.rb +30 -0
  232. data/test/unit/gateways/payment_express_test.rb +195 -0
  233. data/test/unit/gateways/paypal_express_test.rb +382 -0
  234. data/test/unit/gateways/paypal_test.rb +569 -0
  235. data/test/unit/gateways/plugnpay_test.rb +86 -0
  236. data/test/unit/gateways/psigate_test.rb +169 -0
  237. data/test/unit/gateways/psl_card_test.rb +64 -0
  238. data/test/unit/gateways/quickpay_test.rb +112 -0
  239. data/test/unit/gateways/realex_test.rb +151 -0
  240. data/test/unit/gateways/sage_bankcard_test.rb +196 -0
  241. data/test/unit/gateways/sage_pay_test.rb +139 -0
  242. data/test/unit/gateways/sage_virtual_check_test.rb +71 -0
  243. data/test/unit/gateways/sallie_mae_test.rb +53 -0
  244. data/test/unit/gateways/secure_pay_au_test.rb +207 -0
  245. data/test/unit/gateways/secure_pay_tech_test.rb +44 -0
  246. data/test/unit/gateways/secure_pay_test.rb +87 -0
  247. data/test/unit/gateways/skip_jack_test.rb +213 -0
  248. data/test/unit/gateways/trans_first_test.rb +112 -0
  249. data/test/unit/gateways/trust_commerce_test.rb +90 -0
  250. data/test/unit/gateways/usa_epay_test.rb +128 -0
  251. data/test/unit/gateways/verifi_test.rb +96 -0
  252. data/test/unit/gateways/viaklix_test.rb +78 -0
  253. data/test/unit/gateways/wirecard_test.rb +250 -0
  254. data/test/unit/generators/test_gateway_generator.rb +46 -0
  255. data/test/unit/generators/test_generator_helper.rb +20 -0
  256. data/test/unit/generators/test_integration_generator.rb +53 -0
  257. data/test/unit/integrations/action_view_helper_test.rb +50 -0
  258. data/test/unit/integrations/bogus_module_test.rb +20 -0
  259. data/test/unit/integrations/chronopay_module_test.rb +13 -0
  260. data/test/unit/integrations/gestpay_module_test.rb +14 -0
  261. data/test/unit/integrations/helpers/bogus_helper_test.rb +28 -0
  262. data/test/unit/integrations/helpers/chronopay_helper_test.rb +67 -0
  263. data/test/unit/integrations/helpers/gestpay_helper_test.rb +100 -0
  264. data/test/unit/integrations/helpers/hi_trust_helper_test.rb +16 -0
  265. data/test/unit/integrations/helpers/nochex_helper_test.rb +53 -0
  266. data/test/unit/integrations/helpers/paypal_helper_test.rb +171 -0
  267. data/test/unit/integrations/helpers/quickpay_helper_test.rb +40 -0
  268. data/test/unit/integrations/helpers/two_checkout_helper_test.rb +92 -0
  269. data/test/unit/integrations/hi_trust_module_test.rb +13 -0
  270. data/test/unit/integrations/nochex_module_test.rb +13 -0
  271. data/test/unit/integrations/notifications/chronopay_notification_test.rb +66 -0
  272. data/test/unit/integrations/notifications/gestpay_notification_test.rb +60 -0
  273. data/test/unit/integrations/notifications/hi_trust_notification_test.rb +59 -0
  274. data/test/unit/integrations/notifications/nochex_notification_test.rb +51 -0
  275. data/test/unit/integrations/notifications/notification_test.rb +54 -0
  276. data/test/unit/integrations/notifications/paypal_notification_test.rb +85 -0
  277. data/test/unit/integrations/notifications/quickpay_notification_test.rb +69 -0
  278. data/test/unit/integrations/notifications/two_checkout_notification_test.rb +55 -0
  279. data/test/unit/integrations/paypal_module_test.rb +28 -0
  280. data/test/unit/integrations/quickpay_module_test.rb +9 -0
  281. data/test/unit/integrations/returns/chronopay_return_test.rb +11 -0
  282. data/test/unit/integrations/returns/gestpay_return_test.rb +10 -0
  283. data/test/unit/integrations/returns/hi_trust_return_test.rb +24 -0
  284. data/test/unit/integrations/returns/nochex_return_test.rb +10 -0
  285. data/test/unit/integrations/returns/paypal_return_test.rb +10 -0
  286. data/test/unit/integrations/returns/return_test.rb +11 -0
  287. data/test/unit/integrations/returns/two_checkout_return_test.rb +24 -0
  288. data/test/unit/integrations/two_checkout_module_test.rb +13 -0
  289. data/test/unit/post_data_test.rb +55 -0
  290. data/test/unit/posts_data_test.rb +48 -0
  291. data/test/unit/response_test.rb +28 -0
  292. data/test/unit/utils_test.rb +7 -0
  293. data/test/unit/validateable_test.rb +60 -0
  294. metadata +366 -0
@@ -0,0 +1,214 @@
1
+ # This class implements the Psigate gateway for the ActiveMerchant module.
2
+ # Psigate = http://www.psigate.com/ The class is currently set up to use
3
+ # the psigate test server while rails is in testing or developement mode.
4
+ # The real server will be used while in production mode.
5
+ #
6
+ # Modifications by Sean O'Hara ( sohara at sohara dot com )
7
+ #
8
+ # Usage for a PreAuth (authorize) is as follows:
9
+ #
10
+ # twenty = 2000
11
+ # gateway = PsigateGateway.new(
12
+ # :login => 'teststore',
13
+ # :password => 'psigate1234'
14
+ # )
15
+ #
16
+ # creditcard = CreditCard.new(
17
+ # :number => '4242424242424242',
18
+ # :month => 8,
19
+ # :year => 2006,
20
+ # :first_name => 'Longbob',
21
+ # :last_name => 'Longsen'
22
+ # )
23
+ # response = @gateway.authorize(twenty, creditcard,
24
+ # :order_id => 1234,
25
+ # :billing_address => {
26
+ # :address1 => '123 fairweather Lane',
27
+ # :address2 => 'Apt B',
28
+ # :city => 'New York',
29
+ # :state => 'NY',
30
+ # :country => 'U.S.A.',
31
+ # :zip => '10010'
32
+ # },
33
+ # :email => 'jack@yahoo.com'
34
+ # )
35
+
36
+ require 'rexml/document'
37
+
38
+ module ActiveMerchant #:nodoc:
39
+ module Billing #:nodoc:
40
+
41
+ class PsigateGateway < Gateway
42
+ TEST_URL = 'https://dev.psigate.com:7989/Messenger/XMLMessenger'
43
+ LIVE_URL = 'https://secure.psigate.com:7934/Messenger/XMLMessenger'
44
+
45
+ self.supported_cardtypes = [:visa, :master, :american_express]
46
+ self.supported_countries = ['CA']
47
+ self.homepage_url = 'http://www.psigate.com/'
48
+ self.display_name = 'Psigate'
49
+
50
+ SUCCESS_MESSAGE = 'Success'
51
+ FAILURE_MESSAGE = 'The transaction was declined'
52
+
53
+ def initialize(options = {})
54
+ requires!(options, :login, :password)
55
+ @options = options
56
+ super
57
+ end
58
+
59
+ # Psigate PreAuth
60
+ def authorize(money, creditcard, options = {})
61
+ requires!(options, :order_id)
62
+ options.update({ :CardAction => "1" })
63
+ commit(money, creditcard, options)
64
+ end
65
+
66
+ # Psigate Sale
67
+ def purchase(money, creditcard, options = {})
68
+ requires!(options, :order_id)
69
+ options.update({ :CardAction => "0" })
70
+ commit(money, creditcard, options)
71
+ end
72
+
73
+ # Psigate PostAuth
74
+ def capture(money, authorization, options = {})
75
+ options.update({ :CardAction => "2", :order_id => authorization })
76
+ commit(money, nil, options)
77
+ end
78
+
79
+
80
+ # Psigate Credit
81
+ def credit(money, authorization, options = {})
82
+ options.update({ :CardAction => "3", :order_id => authorization })
83
+ commit(money, nil, options)
84
+ end
85
+
86
+ private
87
+
88
+ def commit(money, creditcard, options = {})
89
+ response = parse(ssl_post(test? ? TEST_URL : LIVE_URL, post_data(money, creditcard, options)))
90
+
91
+ Response.new(successful?(response), message_from(response), response,
92
+ :test => test?,
93
+ :authorization => response[:orderid],
94
+ :avs_result => { :code => response[:avsresult] },
95
+ :cvv_result => response[:cardidresult]
96
+ )
97
+ end
98
+
99
+ def successful?(response)
100
+ response[:approved] == "APPROVED"
101
+ end
102
+
103
+ def parse(xml)
104
+ response = {:message => "Global Error Receipt", :complete => false}
105
+
106
+ xml = REXML::Document.new(xml)
107
+ xml.elements.each('//Result/*') do |node|
108
+
109
+ response[node.name.downcase.to_sym] = normalize(node.text)
110
+
111
+ end unless xml.root.nil?
112
+
113
+ response
114
+ end
115
+
116
+ def post_data(money, creditcard, options)
117
+ xml = REXML::Document.new
118
+ xml << REXML::XMLDecl.new
119
+ root = xml.add_element("Order")
120
+
121
+ for key, value in parameters(money, creditcard, options)
122
+ root.add_element(key.to_s).text = value if value
123
+ end
124
+
125
+ xml.to_s
126
+ end
127
+
128
+ # Set up the parameters hash just once so we don't have to do it
129
+ # for every action.
130
+ def parameters(money, creditcard, options = {})
131
+ params = {
132
+ # General order paramters
133
+ :StoreID => @options[:login],
134
+ :Passphrase => @options[:password],
135
+ :TestResult => options[:test_result],
136
+ :OrderID => options[:order_id],
137
+ :UserID => options[:user_id],
138
+ :Phone => options[:phone],
139
+ :Fax => options[:fax],
140
+ :Email => options[:email],
141
+
142
+ # Credit Card paramaters
143
+ :PaymentType => "CC",
144
+ :CardAction => options[:CardAction],
145
+
146
+ # Financial paramters
147
+ :CustomerIP => options[:ip],
148
+ :SubTotal => amount(money),
149
+ :Tax1 => options[:tax1],
150
+ :Tax2 => options[:tax2],
151
+ :ShippingTotal => options[:shipping_total],
152
+ }
153
+
154
+ if creditcard
155
+ exp_month = sprintf("%.2i", creditcard.month) unless creditcard.month.blank?
156
+ exp_year = creditcard.year.to_s[2,2] unless creditcard.year.blank?
157
+ card_id_code = creditcard.verification_value.blank? ? nil : "1"
158
+
159
+ params.update(
160
+ :CardNumber => creditcard.number,
161
+ :CardExpMonth => exp_month,
162
+ :CardExpYear => exp_year,
163
+ :CardIDCode => card_id_code,
164
+ :CardIDNumber => creditcard.verification_value
165
+ )
166
+ end
167
+
168
+ if address = options[:billing_address] || options[:address]
169
+ params[:Bname] = address[:name] || creditcard.name
170
+ params[:Baddress1] = address[:address1] unless address[:address1].blank?
171
+ params[:Baddress2] = address[:address2] unless address[:address2].blank?
172
+ params[:Bcity] = address[:city] unless address[:city].blank?
173
+ params[:Bprovince] = address[:state] unless address[:state].blank?
174
+ params[:Bpostalcode] = address[:zip] unless address[:zip].blank?
175
+ params[:Bcountry] = address[:country] unless address[:country].blank?
176
+ params[:Bcompany] = address[:company] unless address[:company].blank?
177
+ end
178
+
179
+ if address = options[:shipping_address]
180
+ params[:Sname] = address[:name] || creditcard.name
181
+ params[:Saddress1] = address[:address1] unless address[:address1].blank?
182
+ params[:Saddress2] = address[:address2] unless address[:address2].blank?
183
+ params[:Scity] = address[:city] unless address[:city].blank?
184
+ params[:Sprovince] = address[:state] unless address[:state].blank?
185
+ params[:Spostalcode] = address[:zip] unless address[:zip].blank?
186
+ params[:Scountry] = address[:country] unless address[:country].blank?
187
+ params[:Scompany] = address[:company] unless address[:company].blank?
188
+ end
189
+
190
+ return params
191
+ end
192
+
193
+ def message_from(response)
194
+ if response[:approved] == "APPROVED"
195
+ return SUCCESS_MESSAGE
196
+ else
197
+ return FAILURE_MESSAGE if response[:errmsg].blank?
198
+ return response[:errmsg].gsub(/[^\w]/, ' ').split.join(" ").capitalize
199
+ end
200
+ end
201
+
202
+ # Make a ruby type out of the response string
203
+ def normalize(field)
204
+ case field
205
+ when "true" then true
206
+ when "false" then false
207
+ when "" then nil
208
+ when "null" then nil
209
+ else field
210
+ end
211
+ end
212
+ end
213
+ end
214
+ end
@@ -0,0 +1,306 @@
1
+ # Author:: MoneySpyder, http://moneyspyder.co.uk
2
+
3
+ module ActiveMerchant
4
+ module Billing
5
+ #
6
+ # ActiveMerchant PSL Card Gateway
7
+ #
8
+ # Notes:
9
+ # -To be able to use the capture function, the IP address of the machine must be
10
+ # registered with PSL
11
+ # -ESALE_KEYED should only be used in situations where the cardholder perceives the
12
+ # transaction to be Internet-based, such as purchasing from a web site/on-line store.
13
+ # If the Internet is used purely for the transport of information from the merchant
14
+ # directly to the gateway then the appropriate cardholder present or not present message
15
+ # type should be used rather than the ‘E’ equivalent.
16
+ # -The CV2 / AVS policies are set up with the account settings when signing up for an account
17
+ class PslCardGateway < Gateway
18
+ self.money_format = :cents
19
+ self.default_currency = 'GBP'
20
+
21
+ self.supported_countries = ['GB']
22
+ # Visa Credit, Visa Debit, Mastercard, Maestro, Solo, Electron,
23
+ # American Express, Diners Club, JCB, International Maestro,
24
+ # Style, Clydesdale Financial Services, Other
25
+
26
+ self.supported_cardtypes = [ :visa, :master, :american_express, :diners_club, :jcb, :switch, :solo, :maestro ]
27
+ self.homepage_url = 'http://www.paymentsolutionsltd.com/'
28
+ self.display_name = 'PSL Payment Solutions'
29
+
30
+ # Default ISO 3166 country code (GB)
31
+ cattr_accessor :location
32
+ self.location = 826
33
+
34
+ # PslCard server URL - The url is the same whether testing or live - use
35
+ # the test account when testing...
36
+ URL = 'https://pslcard3.paymentsolutionsltd.com/secure/transact.asp?'
37
+
38
+ # eCommerce sale transaction, details keyed by merchant or cardholder
39
+ MESSAGE_TYPE = 'ESALE_KEYED'
40
+
41
+ # The type of response that we want to get from PSL, options are HTML, XML or REDIRECT
42
+ RESPONSE_ACTION = 'HTML'
43
+
44
+ # Currency Codes
45
+ CURRENCY_CODES = {
46
+ 'AUD' => 036,
47
+ 'GBP' => 826,
48
+ 'USD' => 840
49
+ }
50
+
51
+ #The terminal used - only for swipe transactions, so hard coded to 32 for online
52
+ EMV_TERMINAL_TYPE = 32
53
+
54
+ #Different Dispatch types
55
+ DISPATCH_LATER = 'LATER'
56
+ DISPATCH_NOW = 'NOW'
57
+
58
+ # Return codes
59
+ APPROVED = '00'
60
+
61
+ #Nominal amount to authorize for a 'dispatch later' type
62
+ #The nominal amount is held straight away, when the goods are ready
63
+ #to be dispatched, PSL is informed and the full amount is the
64
+ #taken.
65
+ NOMINAL_AMOUNT = 101
66
+
67
+ AVS_CODE = {
68
+ "ALL MATCH" => 'Y',
69
+ "SECURITY CODE MATCH ONLY" => 'N',
70
+ "ADDRESS MATCH ONLY" => 'Y',
71
+ "NO DATA MATCHES" => 'N',
72
+ "DATA NOT CHECKED" => 'R',
73
+ "SECURITY CHECKS NOT SUPPORTED" => 'X'
74
+ }
75
+
76
+ CVV_CODE = {
77
+ "ALL MATCH" => 'M',
78
+ "SECURITY CODE MATCH ONLY" => 'M',
79
+ "ADDRESS MATCH ONLY" => 'N',
80
+ "NO DATA MATCHES" => 'N',
81
+ "DATA NOT CHECKED" => 'P',
82
+ "SECURITY CHECKS NOT SUPPORTED" => 'X'
83
+ }
84
+
85
+ # Create a new PslCardGateway
86
+ #
87
+ # The gateway requires that a valid :login be passed in the options hash
88
+ #
89
+ # Paramaters:
90
+ # -options:
91
+ # :login - the PslCard account login (required)
92
+ def initialize(options = {})
93
+ requires!(options, :login)
94
+
95
+ @options = options
96
+ super
97
+ end
98
+
99
+ # Purchase the item straight away
100
+ #
101
+ # Parameters:
102
+ # -money: Money object for the total to be charged
103
+ # -authorization: the PSL cross reference from the previous authorization
104
+ # -options:
105
+ #
106
+ # Returns:
107
+ # -ActiveRecord::Billing::Response object
108
+ #
109
+ def purchase(money, credit_card, options = {})
110
+ post = {}
111
+
112
+ add_amount(post, money, DISPATCH_NOW, options)
113
+ add_credit_card(post, credit_card)
114
+ add_address(post, options)
115
+ add_invoice(post, options)
116
+ add_purchase_details(post)
117
+
118
+ commit(post)
119
+ end
120
+
121
+ # Authorize the transaction
122
+ #
123
+ # Reserves the funds on the customer's credit card, but does not
124
+ # charge the card.
125
+ #
126
+ # This implementation does not authorize the full amount, rather it checks that the full amount
127
+ # is available and only 'reserves' the nominal amount (currently a pound and a penny)
128
+ #
129
+ # Parameters:
130
+ # -money: Money object for the total to be charged
131
+ # -authorization: the PSL cross reference from the previous authorization
132
+ # -options:
133
+ #
134
+ # Returns:
135
+ # -ActiveRecord::Billing::Response object
136
+ #
137
+ def authorize(money, credit_card, options = {})
138
+ post = {}
139
+
140
+ add_amount(post, money, DISPATCH_LATER, options)
141
+ add_credit_card(post, credit_card)
142
+ add_address(post, options)
143
+ add_invoice(post, options)
144
+ add_purchase_details(post)
145
+
146
+ commit(post)
147
+ end
148
+
149
+ # Post an authorization.
150
+ #
151
+ # Captures the funds from an authorized transaction.
152
+ #
153
+ # Parameters:
154
+ # -money: Money object for the total to be charged
155
+ # -authorization: The PSL Cross Reference
156
+ # -options:
157
+ #
158
+ # Returns:
159
+ # -ActiveRecord::Billing::Response object
160
+ #
161
+ def capture(money, authorization, options = {})
162
+ post = {}
163
+
164
+ add_amount(post, money, DISPATCH_NOW, options)
165
+ add_reference(post, authorization)
166
+ add_purchase_details(post)
167
+
168
+ commit(post)
169
+ end
170
+
171
+ private
172
+
173
+ def add_credit_card(post, credit_card)
174
+ post[:QAName] = credit_card.name
175
+ post[:CardNumber] = credit_card.number
176
+ post[:EMVTerminalType] = EMV_TERMINAL_TYPE
177
+ post[:ExpMonth] = credit_card.month
178
+ post[:ExpYear] = credit_card.year
179
+
180
+ if requires_start_date_or_issue_number?(credit_card)
181
+ post[:IssueNumber] = credit_card.issue_number unless credit_card.issue_number.blank?
182
+ post[:StartMonth] = credit_card.start_month unless credit_card.start_month.blank?
183
+ post[:StartYear] = credit_card.start_year unless credit_card.start_year.blank?
184
+ end
185
+
186
+ # CV2 check
187
+ post[:AVSCV2Check] = credit_card.verification_value? ? 'YES' : 'NO'
188
+ post[:CV2] = credit_card.verification_value if credit_card.verification_value?
189
+ end
190
+
191
+ def add_address(post, options)
192
+ address = options[:billing_address] || options[:address]
193
+ return if address.nil?
194
+
195
+ post[:QAAddress] = [:address1, :address2, :city, :state].collect{|a| address[a]}.reject{|a| a.blank?}.join(' ')
196
+ post[:QAPostcode] = address[:zip]
197
+ end
198
+
199
+ def add_invoice(post, options)
200
+ post[:MerchantName] = options[:merchant] || 'Merchant Name' # May use this as the order_id field
201
+ post[:OrderID] = options[:order_id] unless options[:order_id].blank?
202
+ end
203
+
204
+ def add_reference(post, authorization)
205
+ post[:CrossReference] = authorization
206
+ end
207
+
208
+ def add_amount(post, money, dispatch_type, options)
209
+ post[:CurrencyCode] = currency_code(options[:currency] || currency(money))
210
+
211
+ if dispatch_type == DISPATCH_LATER
212
+ post[:amount] = amount(NOMINAL_AMOUNT)
213
+ post[:DispatchLaterAmount] = amount(money)
214
+ else
215
+ post[:amount] = amount(money)
216
+ end
217
+
218
+ post[:Dispatch] = dispatch_type
219
+ end
220
+
221
+ def add_purchase_details(post)
222
+ post[:EchoAmount] = 'YES'
223
+ post[:SCBI] = 'YES' # Return information about the transaction
224
+ post[:MessageType] = MESSAGE_TYPE
225
+ end
226
+
227
+ # Get the currency code for the passed money object
228
+ #
229
+ # The money class stores the currency as an ISO 4217:2001 Alphanumeric,
230
+ # however PSL requires the ISO 4217:2001 Numeric code.
231
+ #
232
+ # Parameters:
233
+ # -money: Money object with the amount and currency
234
+ #
235
+ # Returns:
236
+ # -the ISO 4217:2001 Numberic currency code
237
+ #
238
+ def currency_code(currency)
239
+ CURRENCY_CODES[currency]
240
+ end
241
+
242
+ # Parse the PSL response and create a Response object
243
+ #
244
+ # Parameters:
245
+ # -body: The response string returned from PSL, Formatted:
246
+ # Key=value&key=value...
247
+ #
248
+ # Returns:
249
+ # -a hash with all of the values returned in the PSL response
250
+ #
251
+ def parse(body)
252
+
253
+ fields = {}
254
+ for line in body.split('&')
255
+ key, value = *line.scan( %r{^(\w+)\=(.*)$} ).flatten
256
+ fields[key] = CGI.unescape(value)
257
+ end
258
+ fields.symbolize_keys
259
+ end
260
+
261
+ # Send the passed data to PSL for processing
262
+ #
263
+ # Parameters:
264
+ # -request: The data that is to be sent to PSL
265
+ #
266
+ # Returns:
267
+ # - ActiveMerchant::Billing::Response object
268
+ #
269
+ def commit(request)
270
+ response = parse( ssl_post(URL, post_data(request)) )
271
+
272
+ Response.new(response[:ResponseCode] == APPROVED, response[:Message], response,
273
+ :test => test?,
274
+ :authorization => response[:CrossReference],
275
+ :cvv_result => CVV_CODE[response[:AVSCV2Check]],
276
+ :avs_result => { :code => AVS_CODE[response[:AVSCV2Check]] }
277
+ )
278
+ end
279
+
280
+ # Put the passed data into a format that can be submitted to PSL
281
+ # Key=Value&Key=Value...
282
+ #
283
+ # Any ampersands and equal signs are removed from the data being posted
284
+ # as PSL puts them back into the response string which then cannot be parsed.
285
+ # This is after escaping before sending the request to PSL - this is a work
286
+ # around for the time being
287
+ #
288
+ # Parameters:
289
+ # -post: Hash of all the data to be sent
290
+ #
291
+ # Returns:
292
+ # -String: the data to be sent
293
+ #
294
+ def post_data(post)
295
+ post[:CountryCode] = self.location
296
+ post[:MerchantID] = @options[:login]
297
+ post[:ValidityID] = @options[:password]
298
+ post[:ResponseAction] = RESPONSE_ACTION
299
+
300
+ post.collect { |key, value|
301
+ "#{key}=#{CGI.escape(value.to_s.tr('&=', ' '))}"
302
+ }.join("&")
303
+ end
304
+ end
305
+ end
306
+ end