tanga_activemerchant 1.37.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (306) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +1202 -0
  3. data/CONTRIBUTORS +414 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +221 -0
  6. data/gem-public_cert.pem +20 -0
  7. data/lib/active_merchant/billing/avs_result.rb +98 -0
  8. data/lib/active_merchant/billing/base.rb +57 -0
  9. data/lib/active_merchant/billing/check.rb +69 -0
  10. data/lib/active_merchant/billing/credit_card.rb +283 -0
  11. data/lib/active_merchant/billing/credit_card_formatting.rb +21 -0
  12. data/lib/active_merchant/billing/credit_card_methods.rb +143 -0
  13. data/lib/active_merchant/billing/cvv_result.rb +38 -0
  14. data/lib/active_merchant/billing/expiry_date.rb +34 -0
  15. data/lib/active_merchant/billing/gateway.rb +181 -0
  16. data/lib/active_merchant/billing/gateways/authorize_net.rb +725 -0
  17. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +956 -0
  18. data/lib/active_merchant/billing/gateways/balanced.rb +468 -0
  19. data/lib/active_merchant/billing/gateways/banwire.rb +105 -0
  20. data/lib/active_merchant/billing/gateways/barclays_epdq.rb +314 -0
  21. data/lib/active_merchant/billing/gateways/barclays_epdq_extra_plus.rb +15 -0
  22. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +393 -0
  23. data/lib/active_merchant/billing/gateways/beanstream.rb +169 -0
  24. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +54 -0
  25. data/lib/active_merchant/billing/gateways/blue_pay.rb +501 -0
  26. data/lib/active_merchant/billing/gateways/bogus.rb +142 -0
  27. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +9 -0
  28. data/lib/active_merchant/billing/gateways/braintree.rb +19 -0
  29. data/lib/active_merchant/billing/gateways/braintree_blue.rb +401 -0
  30. data/lib/active_merchant/billing/gateways/braintree_orange.rb +19 -0
  31. data/lib/active_merchant/billing/gateways/card_save.rb +23 -0
  32. data/lib/active_merchant/billing/gateways/card_stream.rb +225 -0
  33. data/lib/active_merchant/billing/gateways/card_stream_modern.rb +155 -0
  34. data/lib/active_merchant/billing/gateways/cc5.rb +156 -0
  35. data/lib/active_merchant/billing/gateways/certo_direct.rb +277 -0
  36. data/lib/active_merchant/billing/gateways/cyber_source.rb +639 -0
  37. data/lib/active_merchant/billing/gateways/data_cash.rb +591 -0
  38. data/lib/active_merchant/billing/gateways/efsnet.rb +230 -0
  39. data/lib/active_merchant/billing/gateways/elavon.rb +312 -0
  40. data/lib/active_merchant/billing/gateways/epay.rb +275 -0
  41. data/lib/active_merchant/billing/gateways/evo_ca.rb +308 -0
  42. data/lib/active_merchant/billing/gateways/eway.rb +225 -0
  43. data/lib/active_merchant/billing/gateways/eway_managed.rb +291 -0
  44. data/lib/active_merchant/billing/gateways/eway_rapid.rb +320 -0
  45. data/lib/active_merchant/billing/gateways/exact.rb +218 -0
  46. data/lib/active_merchant/billing/gateways/fat_zebra.rb +173 -0
  47. data/lib/active_merchant/billing/gateways/federated_canada.rb +167 -0
  48. data/lib/active_merchant/billing/gateways/finansbank.rb +22 -0
  49. data/lib/active_merchant/billing/gateways/first_pay.rb +176 -0
  50. data/lib/active_merchant/billing/gateways/firstdata_e4.rb +314 -0
  51. data/lib/active_merchant/billing/gateways/garanti.rb +257 -0
  52. data/lib/active_merchant/billing/gateways/hdfc.rb +207 -0
  53. data/lib/active_merchant/billing/gateways/iats_payments.rb +35 -0
  54. data/lib/active_merchant/billing/gateways/ideal/ideal_base.rb +249 -0
  55. data/lib/active_merchant/billing/gateways/ideal/ideal_rabobank.pem +13 -0
  56. data/lib/active_merchant/billing/gateways/ideal/ideal_response.rb +29 -0
  57. data/lib/active_merchant/billing/gateways/ideal_rabobank.rb +66 -0
  58. data/lib/active_merchant/billing/gateways/inspire.rb +221 -0
  59. data/lib/active_merchant/billing/gateways/instapay.rb +163 -0
  60. data/lib/active_merchant/billing/gateways/iridium.rb +262 -0
  61. data/lib/active_merchant/billing/gateways/itransact.rb +448 -0
  62. data/lib/active_merchant/billing/gateways/jetpay.rb +275 -0
  63. data/lib/active_merchant/billing/gateways/linkpoint.rb +447 -0
  64. data/lib/active_merchant/billing/gateways/litle.rb +554 -0
  65. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +176 -0
  66. data/lib/active_merchant/billing/gateways/merchant_one.rb +115 -0
  67. data/lib/active_merchant/billing/gateways/merchant_ware.rb +322 -0
  68. data/lib/active_merchant/billing/gateways/merchant_ware_version_four.rb +275 -0
  69. data/lib/active_merchant/billing/gateways/merchant_warrior.rb +191 -0
  70. data/lib/active_merchant/billing/gateways/mercury.rb +311 -0
  71. data/lib/active_merchant/billing/gateways/metrics_global.rb +322 -0
  72. data/lib/active_merchant/billing/gateways/migs/migs_codes.rb +100 -0
  73. data/lib/active_merchant/billing/gateways/migs.rb +265 -0
  74. data/lib/active_merchant/billing/gateways/modern_payments.rb +37 -0
  75. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +219 -0
  76. data/lib/active_merchant/billing/gateways/moneris.rb +244 -0
  77. data/lib/active_merchant/billing/gateways/moneris_us.rb +208 -0
  78. data/lib/active_merchant/billing/gateways/nab_transact.rb +277 -0
  79. data/lib/active_merchant/billing/gateways/net_registry.rb +193 -0
  80. data/lib/active_merchant/billing/gateways/netaxept.rb +181 -0
  81. data/lib/active_merchant/billing/gateways/netbilling.rb +197 -0
  82. data/lib/active_merchant/billing/gateways/netpay.rb +223 -0
  83. data/lib/active_merchant/billing/gateways/nmi.rb +20 -0
  84. data/lib/active_merchant/billing/gateways/ogone.rb +421 -0
  85. data/lib/active_merchant/billing/gateways/optimal_payment.rb +297 -0
  86. data/lib/active_merchant/billing/gateways/orbital/avs_result.rb +93 -0
  87. data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +46 -0
  88. data/lib/active_merchant/billing/gateways/orbital.rb +633 -0
  89. data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +261 -0
  90. data/lib/active_merchant/billing/gateways/pay_junction.rb +396 -0
  91. data/lib/active_merchant/billing/gateways/pay_secure.rb +119 -0
  92. data/lib/active_merchant/billing/gateways/paybox_direct.rb +196 -0
  93. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +209 -0
  94. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +39 -0
  95. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
  96. data/lib/active_merchant/billing/gateways/payflow.rb +268 -0
  97. data/lib/active_merchant/billing/gateways/payflow_express.rb +224 -0
  98. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +15 -0
  99. data/lib/active_merchant/billing/gateways/payflow_uk.rb +21 -0
  100. data/lib/active_merchant/billing/gateways/payment_express.rb +353 -0
  101. data/lib/active_merchant/billing/gateways/paymill.rb +179 -0
  102. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +670 -0
  103. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +61 -0
  104. data/lib/active_merchant/billing/gateways/paypal/paypal_recurring_api.rb +248 -0
  105. data/lib/active_merchant/billing/gateways/paypal.rb +106 -0
  106. data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
  107. data/lib/active_merchant/billing/gateways/paypal_digital_goods.rb +43 -0
  108. data/lib/active_merchant/billing/gateways/paypal_express.rb +239 -0
  109. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +30 -0
  110. data/lib/active_merchant/billing/gateways/paystation.rb +199 -0
  111. data/lib/active_merchant/billing/gateways/payway.rb +207 -0
  112. data/lib/active_merchant/billing/gateways/pin.rb +165 -0
  113. data/lib/active_merchant/billing/gateways/plugnpay.rb +294 -0
  114. data/lib/active_merchant/billing/gateways/psigate.rb +227 -0
  115. data/lib/active_merchant/billing/gateways/psl_card.rb +303 -0
  116. data/lib/active_merchant/billing/gateways/qbms.rb +292 -0
  117. data/lib/active_merchant/billing/gateways/quantum.rb +276 -0
  118. data/lib/active_merchant/billing/gateways/quickpay.rb +335 -0
  119. data/lib/active_merchant/billing/gateways/realex.rb +303 -0
  120. data/lib/active_merchant/billing/gateways/redsys.rb +394 -0
  121. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +93 -0
  122. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +114 -0
  123. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +102 -0
  124. data/lib/active_merchant/billing/gateways/sage.rb +152 -0
  125. data/lib/active_merchant/billing/gateways/sage_pay.rb +324 -0
  126. data/lib/active_merchant/billing/gateways/sallie_mae.rb +143 -0
  127. data/lib/active_merchant/billing/gateways/samurai.rb +118 -0
  128. data/lib/active_merchant/billing/gateways/secure_net.rb +261 -0
  129. data/lib/active_merchant/billing/gateways/secure_pay.rb +28 -0
  130. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +279 -0
  131. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +112 -0
  132. data/lib/active_merchant/billing/gateways/skip_jack.rb +453 -0
  133. data/lib/active_merchant/billing/gateways/smart_ps.rb +272 -0
  134. data/lib/active_merchant/billing/gateways/spreedly_core.rb +233 -0
  135. data/lib/active_merchant/billing/gateways/stripe.rb +316 -0
  136. data/lib/active_merchant/billing/gateways/trans_first.rb +126 -0
  137. data/lib/active_merchant/billing/gateways/transax.rb +23 -0
  138. data/lib/active_merchant/billing/gateways/transnational.rb +239 -0
  139. data/lib/active_merchant/billing/gateways/trust_commerce.rb +421 -0
  140. data/lib/active_merchant/billing/gateways/usa_epay.rb +25 -0
  141. data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +1501 -0
  142. data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +201 -0
  143. data/lib/active_merchant/billing/gateways/verifi.rb +232 -0
  144. data/lib/active_merchant/billing/gateways/viaklix.rb +189 -0
  145. data/lib/active_merchant/billing/gateways/vindicia.rb +361 -0
  146. data/lib/active_merchant/billing/gateways/webpay.rb +57 -0
  147. data/lib/active_merchant/billing/gateways/wirecard.rb +313 -0
  148. data/lib/active_merchant/billing/gateways/worldpay.rb +303 -0
  149. data/lib/active_merchant/billing/gateways.rb +17 -0
  150. data/lib/active_merchant/billing/integrations/a1agregator/helper.rb +31 -0
  151. data/lib/active_merchant/billing/integrations/a1agregator/notification.rb +186 -0
  152. data/lib/active_merchant/billing/integrations/a1agregator/status.rb +38 -0
  153. data/lib/active_merchant/billing/integrations/a1agregator.rb +26 -0
  154. data/lib/active_merchant/billing/integrations/action_view_helper.rb +73 -0
  155. data/lib/active_merchant/billing/integrations/authorize_net_sim/helper.rb +229 -0
  156. data/lib/active_merchant/billing/integrations/authorize_net_sim/notification.rb +340 -0
  157. data/lib/active_merchant/billing/integrations/authorize_net_sim.rb +38 -0
  158. data/lib/active_merchant/billing/integrations/bogus/helper.rb +17 -0
  159. data/lib/active_merchant/billing/integrations/bogus/notification.rb +11 -0
  160. data/lib/active_merchant/billing/integrations/bogus/return.rb +10 -0
  161. data/lib/active_merchant/billing/integrations/bogus.rb +23 -0
  162. data/lib/active_merchant/billing/integrations/chronopay/helper.rb +120 -0
  163. data/lib/active_merchant/billing/integrations/chronopay/notification.rb +158 -0
  164. data/lib/active_merchant/billing/integrations/chronopay/return.rb +10 -0
  165. data/lib/active_merchant/billing/integrations/chronopay.rb +23 -0
  166. data/lib/active_merchant/billing/integrations/direc_pay/helper.rb +200 -0
  167. data/lib/active_merchant/billing/integrations/direc_pay/notification.rb +76 -0
  168. data/lib/active_merchant/billing/integrations/direc_pay/return.rb +32 -0
  169. data/lib/active_merchant/billing/integrations/direc_pay/status.rb +37 -0
  170. data/lib/active_merchant/billing/integrations/direc_pay.rb +41 -0
  171. data/lib/active_merchant/billing/integrations/directebanking/helper.rb +90 -0
  172. data/lib/active_merchant/billing/integrations/directebanking/notification.rb +120 -0
  173. data/lib/active_merchant/billing/integrations/directebanking/return.rb +11 -0
  174. data/lib/active_merchant/billing/integrations/directebanking.rb +47 -0
  175. data/lib/active_merchant/billing/integrations/dotpay/helper.rb +77 -0
  176. data/lib/active_merchant/billing/integrations/dotpay/notification.rb +86 -0
  177. data/lib/active_merchant/billing/integrations/dotpay/return.rb +11 -0
  178. data/lib/active_merchant/billing/integrations/dotpay.rb +22 -0
  179. data/lib/active_merchant/billing/integrations/dwolla/common.rb +23 -0
  180. data/lib/active_merchant/billing/integrations/dwolla/helper.rb +43 -0
  181. data/lib/active_merchant/billing/integrations/dwolla/notification.rb +64 -0
  182. data/lib/active_merchant/billing/integrations/dwolla/return.rb +49 -0
  183. data/lib/active_merchant/billing/integrations/dwolla.rb +23 -0
  184. data/lib/active_merchant/billing/integrations/e_payment_plans/helper.rb +34 -0
  185. data/lib/active_merchant/billing/integrations/e_payment_plans/notification.rb +84 -0
  186. data/lib/active_merchant/billing/integrations/e_payment_plans.rb +48 -0
  187. data/lib/active_merchant/billing/integrations/easy_pay/common.rb +40 -0
  188. data/lib/active_merchant/billing/integrations/easy_pay/helper.rb +36 -0
  189. data/lib/active_merchant/billing/integrations/easy_pay/notification.rb +59 -0
  190. data/lib/active_merchant/billing/integrations/easy_pay.rb +30 -0
  191. data/lib/active_merchant/billing/integrations/epay/helper.rb +55 -0
  192. data/lib/active_merchant/billing/integrations/epay/notification.rb +110 -0
  193. data/lib/active_merchant/billing/integrations/epay.rb +21 -0
  194. data/lib/active_merchant/billing/integrations/first_data/helper.rb +61 -0
  195. data/lib/active_merchant/billing/integrations/first_data/notification.rb +56 -0
  196. data/lib/active_merchant/billing/integrations/first_data.rb +38 -0
  197. data/lib/active_merchant/billing/integrations/gestpay/common.rb +42 -0
  198. data/lib/active_merchant/billing/integrations/gestpay/helper.rb +70 -0
  199. data/lib/active_merchant/billing/integrations/gestpay/notification.rb +85 -0
  200. data/lib/active_merchant/billing/integrations/gestpay/return.rb +10 -0
  201. data/lib/active_merchant/billing/integrations/gestpay.rb +25 -0
  202. data/lib/active_merchant/billing/integrations/helper.rb +117 -0
  203. data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +58 -0
  204. data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +59 -0
  205. data/lib/active_merchant/billing/integrations/hi_trust/return.rb +67 -0
  206. data/lib/active_merchant/billing/integrations/hi_trust.rb +27 -0
  207. data/lib/active_merchant/billing/integrations/ipay88/helper.rb +114 -0
  208. data/lib/active_merchant/billing/integrations/ipay88/return.rb +95 -0
  209. data/lib/active_merchant/billing/integrations/ipay88.rb +19 -0
  210. data/lib/active_merchant/billing/integrations/liqpay/helper.rb +43 -0
  211. data/lib/active_merchant/billing/integrations/liqpay/notification.rb +89 -0
  212. data/lib/active_merchant/billing/integrations/liqpay/return.rb +83 -0
  213. data/lib/active_merchant/billing/integrations/liqpay.rb +30 -0
  214. data/lib/active_merchant/billing/integrations/maksuturva/helper.rb +119 -0
  215. data/lib/active_merchant/billing/integrations/maksuturva/notification.rb +48 -0
  216. data/lib/active_merchant/billing/integrations/maksuturva.rb +86 -0
  217. data/lib/active_merchant/billing/integrations/moneybookers/helper.rb +75 -0
  218. data/lib/active_merchant/billing/integrations/moneybookers/notification.rb +129 -0
  219. data/lib/active_merchant/billing/integrations/moneybookers.rb +26 -0
  220. data/lib/active_merchant/billing/integrations/nochex/helper.rb +68 -0
  221. data/lib/active_merchant/billing/integrations/nochex/notification.rb +94 -0
  222. data/lib/active_merchant/billing/integrations/nochex/return.rb +10 -0
  223. data/lib/active_merchant/billing/integrations/nochex.rb +88 -0
  224. data/lib/active_merchant/billing/integrations/notification.rb +71 -0
  225. data/lib/active_merchant/billing/integrations/paxum/common.rb +24 -0
  226. data/lib/active_merchant/billing/integrations/paxum/helper.rb +42 -0
  227. data/lib/active_merchant/billing/integrations/paxum/notification.rb +33 -0
  228. data/lib/active_merchant/billing/integrations/paxum.rb +44 -0
  229. data/lib/active_merchant/billing/integrations/pay_fast/common.rb +42 -0
  230. data/lib/active_merchant/billing/integrations/pay_fast/helper.rb +50 -0
  231. data/lib/active_merchant/billing/integrations/pay_fast/notification.rb +134 -0
  232. data/lib/active_merchant/billing/integrations/pay_fast/return.rb +10 -0
  233. data/lib/active_merchant/billing/integrations/pay_fast.rb +70 -0
  234. data/lib/active_merchant/billing/integrations/payflow_link/helper.rb +116 -0
  235. data/lib/active_merchant/billing/integrations/payflow_link/notification.rb +78 -0
  236. data/lib/active_merchant/billing/integrations/payflow_link.rb +21 -0
  237. data/lib/active_merchant/billing/integrations/paypal/helper.rb +119 -0
  238. data/lib/active_merchant/billing/integrations/paypal/notification.rb +227 -0
  239. data/lib/active_merchant/billing/integrations/paypal/return.rb +10 -0
  240. data/lib/active_merchant/billing/integrations/paypal.rb +39 -0
  241. data/lib/active_merchant/billing/integrations/paypal_payments_advanced/helper.rb +15 -0
  242. data/lib/active_merchant/billing/integrations/paypal_payments_advanced.rb +20 -0
  243. data/lib/active_merchant/billing/integrations/paysbuy/helper.rb +15 -0
  244. data/lib/active_merchant/billing/integrations/paysbuy/notification.rb +28 -0
  245. data/lib/active_merchant/billing/integrations/paysbuy.rb +36 -0
  246. data/lib/active_merchant/billing/integrations/payu_in/helper.rb +74 -0
  247. data/lib/active_merchant/billing/integrations/payu_in/notification.rb +165 -0
  248. data/lib/active_merchant/billing/integrations/payu_in/return.rb +36 -0
  249. data/lib/active_merchant/billing/integrations/payu_in.rb +43 -0
  250. data/lib/active_merchant/billing/integrations/platron/helper.rb +32 -0
  251. data/lib/active_merchant/billing/integrations/platron/notification.rb +113 -0
  252. data/lib/active_merchant/billing/integrations/platron.rb +28 -0
  253. data/lib/active_merchant/billing/integrations/pxpay/helper.rb +112 -0
  254. data/lib/active_merchant/billing/integrations/pxpay/notification.rb +157 -0
  255. data/lib/active_merchant/billing/integrations/pxpay/return.rb +25 -0
  256. data/lib/active_merchant/billing/integrations/pxpay.rb +31 -0
  257. data/lib/active_merchant/billing/integrations/quickpay/helper.rb +74 -0
  258. data/lib/active_merchant/billing/integrations/quickpay/notification.rb +137 -0
  259. data/lib/active_merchant/billing/integrations/quickpay.rb +21 -0
  260. data/lib/active_merchant/billing/integrations/rbkmoney/helper.rb +23 -0
  261. data/lib/active_merchant/billing/integrations/rbkmoney/notification.rb +91 -0
  262. data/lib/active_merchant/billing/integrations/rbkmoney.rb +17 -0
  263. data/lib/active_merchant/billing/integrations/return.rb +42 -0
  264. data/lib/active_merchant/billing/integrations/robokassa/common.rb +19 -0
  265. data/lib/active_merchant/billing/integrations/robokassa/helper.rb +50 -0
  266. data/lib/active_merchant/billing/integrations/robokassa/notification.rb +55 -0
  267. data/lib/active_merchant/billing/integrations/robokassa/return.rb +17 -0
  268. data/lib/active_merchant/billing/integrations/robokassa.rb +49 -0
  269. data/lib/active_merchant/billing/integrations/sage_pay_form/encryption.rb +33 -0
  270. data/lib/active_merchant/billing/integrations/sage_pay_form/helper.rb +136 -0
  271. data/lib/active_merchant/billing/integrations/sage_pay_form/notification.rb +210 -0
  272. data/lib/active_merchant/billing/integrations/sage_pay_form/return.rb +31 -0
  273. data/lib/active_merchant/billing/integrations/sage_pay_form.rb +37 -0
  274. data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +91 -0
  275. data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +139 -0
  276. data/lib/active_merchant/billing/integrations/two_checkout/return.rb +17 -0
  277. data/lib/active_merchant/billing/integrations/two_checkout.rb +44 -0
  278. data/lib/active_merchant/billing/integrations/valitor/helper.rb +86 -0
  279. data/lib/active_merchant/billing/integrations/valitor/notification.rb +13 -0
  280. data/lib/active_merchant/billing/integrations/valitor/response_fields.rb +97 -0
  281. data/lib/active_merchant/billing/integrations/valitor/return.rb +13 -0
  282. data/lib/active_merchant/billing/integrations/valitor.rb +33 -0
  283. data/lib/active_merchant/billing/integrations/verkkomaksut/helper.rb +88 -0
  284. data/lib/active_merchant/billing/integrations/verkkomaksut/notification.rb +59 -0
  285. data/lib/active_merchant/billing/integrations/verkkomaksut.rb +20 -0
  286. data/lib/active_merchant/billing/integrations/web_pay/common.rb +50 -0
  287. data/lib/active_merchant/billing/integrations/web_pay/helper.rb +68 -0
  288. data/lib/active_merchant/billing/integrations/web_pay/notification.rb +51 -0
  289. data/lib/active_merchant/billing/integrations/web_pay.rb +45 -0
  290. data/lib/active_merchant/billing/integrations/webmoney/common.rb +17 -0
  291. data/lib/active_merchant/billing/integrations/webmoney/helper.rb +40 -0
  292. data/lib/active_merchant/billing/integrations/webmoney/notification.rb +47 -0
  293. data/lib/active_merchant/billing/integrations/webmoney.rb +43 -0
  294. data/lib/active_merchant/billing/integrations/world_pay/helper.rb +101 -0
  295. data/lib/active_merchant/billing/integrations/world_pay/notification.rb +160 -0
  296. data/lib/active_merchant/billing/integrations/world_pay.rb +34 -0
  297. data/lib/active_merchant/billing/integrations.rb +17 -0
  298. data/lib/active_merchant/billing/response.rb +77 -0
  299. data/lib/active_merchant/billing.rb +9 -0
  300. data/lib/active_merchant/version.rb +3 -0
  301. data/lib/active_merchant.rb +63 -0
  302. data/lib/activemerchant.rb +1 -0
  303. data/lib/support/gateway_support.rb +65 -0
  304. data/lib/support/outbound_hosts.rb +25 -0
  305. data/lib/support/ssl_verify.rb +93 -0
  306. metadata +506 -0
@@ -0,0 +1,303 @@
1
+ require 'nokogiri'
2
+ require 'digest/sha1'
3
+
4
+ module ActiveMerchant
5
+ module Billing
6
+ # Realex is the leading CC gateway in Ireland
7
+ # see http://www.realexpayments.com
8
+ # Contributed by John Ward (john@ward.name)
9
+ # see http://thinedgeofthewedge.blogspot.com
10
+ #
11
+ # Realex works using the following
12
+ # login - The unique id of the merchant
13
+ # password - The secret is used to digitally sign the request
14
+ # account - This is an optional third part of the authentication process
15
+ # and is used if the merchant wishes do distuinguish cc traffic from the different sources
16
+ # by using a different account. This must be created in advance
17
+ #
18
+ # the Realex team decided to make the orderid unique per request,
19
+ # so if validation fails you can not correct and resend using the
20
+ # same order id
21
+ class RealexGateway < Gateway
22
+ self.live_url = self.test_url = 'https://epage.payandshop.com/epage-remote.cgi'
23
+
24
+ CARD_MAPPING = {
25
+ 'master' => 'MC',
26
+ 'visa' => 'VISA',
27
+ 'american_express' => 'AMEX',
28
+ 'diners_club' => 'DINERS',
29
+ 'switch' => 'SWITCH',
30
+ 'solo' => 'SWITCH',
31
+ 'laser' => 'LASER'
32
+ }
33
+
34
+ self.money_format = :cents
35
+ self.default_currency = 'EUR'
36
+ self.supported_cardtypes = [ :visa, :master, :american_express, :diners_club, :switch, :solo, :laser ]
37
+ self.supported_countries = [ 'IE', 'GB' ]
38
+ self.homepage_url = 'http://www.realexpayments.com/'
39
+ self.display_name = 'Realex'
40
+
41
+ SUCCESS, DECLINED = "Successful", "Declined"
42
+ BANK_ERROR = REALEX_ERROR = "Gateway is in maintenance. Please try again later."
43
+ ERROR = CLIENT_DEACTIVATED = "Gateway Error"
44
+
45
+ def initialize(options = {})
46
+ requires!(options, :login, :password)
47
+ options[:refund_hash] = Digest::SHA1.hexdigest(options[:rebate_secret]) if options.has_key?(:rebate_secret)
48
+ super
49
+ end
50
+
51
+ def purchase(money, credit_card, options = {})
52
+ requires!(options, :order_id)
53
+
54
+ request = build_purchase_or_authorization_request(:purchase, money, credit_card, options)
55
+ commit(request)
56
+ end
57
+
58
+ def authorize(money, creditcard, options = {})
59
+ requires!(options, :order_id)
60
+
61
+ request = build_purchase_or_authorization_request(:authorization, money, creditcard, options)
62
+ commit(request)
63
+ end
64
+
65
+ def capture(money, authorization, options = {})
66
+ request = build_capture_request(authorization, options)
67
+ commit(request)
68
+ end
69
+
70
+ def refund(money, authorization, options = {})
71
+ request = build_refund_request(money, authorization, options)
72
+ commit(request)
73
+ end
74
+
75
+ def credit(money, authorization, options = {})
76
+ deprecated CREDIT_DEPRECATION_MESSAGE
77
+ refund(money, authorization, options)
78
+ end
79
+
80
+ def void(authorization, options = {})
81
+ request = build_void_request(authorization, options)
82
+ commit(request)
83
+ end
84
+
85
+ private
86
+ def commit(request)
87
+ response = parse(ssl_post(self.live_url, request))
88
+
89
+ Response.new(response[:result] == "00", message_from(response), response,
90
+ :test => response[:message] =~ /\[ test system \]/,
91
+ :authorization => authorization_from(response),
92
+ :cvv_result => response[:cvnresult],
93
+ :avs_result => {
94
+ :street_match => response[:avspostcoderesponse],
95
+ :postal_match => response[:avspostcoderesponse]
96
+ }
97
+ )
98
+ end
99
+
100
+ def parse(xml)
101
+ response = {}
102
+
103
+ doc = Nokogiri::XML(xml)
104
+ doc.xpath('//response/*').each do |node|
105
+ if (node.elements.size == 0)
106
+ response[node.name.downcase.to_sym] = normalize(node.text)
107
+ else
108
+ node.elements.each do |childnode|
109
+ name = "#{node.name.downcase}_#{childnode.name.downcase}"
110
+ response[name.to_sym] = normalize(childnode.text)
111
+ end
112
+ end
113
+ end unless doc.root.nil?
114
+
115
+ response
116
+ end
117
+
118
+ def authorization_from(parsed)
119
+ [parsed[:orderid], parsed[:pasref], parsed[:authcode]].join(';')
120
+ end
121
+
122
+ def build_purchase_or_authorization_request(action, money, credit_card, options)
123
+ timestamp = new_timestamp
124
+ xml = Builder::XmlMarkup.new :indent => 2
125
+ xml.tag! 'request', 'timestamp' => timestamp, 'type' => 'auth' do
126
+ add_merchant_details(xml, options)
127
+ xml.tag! 'orderid', sanitize_order_id(options[:order_id])
128
+ add_amount(xml, money, options)
129
+ add_card(xml, credit_card)
130
+ xml.tag! 'autosettle', 'flag' => auto_settle_flag(action)
131
+ add_signed_digest(xml, timestamp, @options[:login], sanitize_order_id(options[:order_id]), amount(money), (options[:currency] || currency(money)), credit_card.number)
132
+ add_comments(xml, options)
133
+ add_address_and_customer_info(xml, options)
134
+ end
135
+ xml.target!
136
+ end
137
+
138
+ def build_capture_request(authorization, options)
139
+ timestamp = new_timestamp
140
+ xml = Builder::XmlMarkup.new :indent => 2
141
+ xml.tag! 'request', 'timestamp' => timestamp, 'type' => 'settle' do
142
+ add_merchant_details(xml, options)
143
+ add_transaction_identifiers(xml, authorization, options)
144
+ add_comments(xml, options)
145
+ add_signed_digest(xml, timestamp, @options[:login], sanitize_order_id(options[:order_id]), nil, nil, nil)
146
+ end
147
+ xml.target!
148
+ end
149
+
150
+ def build_refund_request(money, authorization, options)
151
+ timestamp = new_timestamp
152
+ xml = Builder::XmlMarkup.new :indent => 2
153
+ xml.tag! 'request', 'timestamp' => timestamp, 'type' => 'rebate' do
154
+ add_merchant_details(xml, options)
155
+ add_transaction_identifiers(xml, authorization, options)
156
+ xml.tag! 'amount', amount(money), 'currency' => options[:currency] || currency(money)
157
+ xml.tag! 'refundhash', @options[:refund_hash] if @options[:refund_hash]
158
+ xml.tag! 'autosettle', 'flag' => 1
159
+ add_comments(xml, options)
160
+ add_signed_digest(xml, timestamp, @options[:login], sanitize_order_id(options[:order_id]), amount(money), (options[:currency] || currency(money)), nil)
161
+ end
162
+ xml.target!
163
+ end
164
+
165
+ def build_void_request(authorization, options)
166
+ timestamp = new_timestamp
167
+ xml = Builder::XmlMarkup.new :indent => 2
168
+ xml.tag! 'request', 'timestamp' => timestamp, 'type' => 'void' do
169
+ add_merchant_details(xml, options)
170
+ add_transaction_identifiers(xml, authorization, options)
171
+ add_comments(xml, options)
172
+ add_signed_digest(xml, timestamp, @options[:login], sanitize_order_id(options[:order_id]), nil, nil, nil)
173
+ end
174
+ xml.target!
175
+ end
176
+
177
+ def add_address_and_customer_info(xml, options)
178
+ billing_address = options[:billing_address] || options[:address]
179
+ shipping_address = options[:shipping_address]
180
+
181
+ return unless billing_address || shipping_address || options[:customer] || options[:invoice] || options[:ip]
182
+
183
+ xml.tag! 'tssinfo' do
184
+ xml.tag! 'custnum', options[:customer] if options[:customer]
185
+ xml.tag! 'prodid', options[:invoice] if options[:invoice]
186
+ xml.tag! 'custipaddress', options[:ip] if options[:ip]
187
+
188
+ if billing_address
189
+ xml.tag! 'address', 'type' => 'billing' do
190
+ xml.tag! 'code', format_shipping_zip_code(billing_address[:zip])
191
+ xml.tag! 'country', billing_address[:country]
192
+ end
193
+ end
194
+
195
+ if shipping_address
196
+ xml.tag! 'address', 'type' => 'shipping' do
197
+ xml.tag! 'code', format_shipping_zip_code(shipping_address[:zip])
198
+ xml.tag! 'country', shipping_address[:country]
199
+ end
200
+ end
201
+ end
202
+ end
203
+
204
+ def add_merchant_details(xml, options)
205
+ xml.tag! 'merchantid', @options[:login]
206
+ if options[:account] || @options[:account]
207
+ xml.tag! 'account', (options[:account] || @options[:account])
208
+ end
209
+ end
210
+
211
+ def add_transaction_identifiers(xml, authorization, options)
212
+ options[:order_id], pasref, authcode = authorization.split(';')
213
+ xml.tag! 'orderid', sanitize_order_id(options[:order_id])
214
+ xml.tag! 'pasref', pasref
215
+ xml.tag! 'authcode', authcode
216
+ end
217
+
218
+ def add_comments(xml, options)
219
+ return unless options[:description]
220
+ xml.tag! 'comments' do
221
+ xml.tag! 'comment', options[:description], 'id' => 1
222
+ end
223
+ end
224
+
225
+ def add_amount(xml, money, options)
226
+ xml.tag! 'amount', amount(money), 'currency' => options[:currency] || currency(money)
227
+ end
228
+
229
+ def add_card(xml, credit_card)
230
+ xml.tag! 'card' do
231
+ xml.tag! 'number', credit_card.number
232
+ xml.tag! 'expdate', expiry_date(credit_card)
233
+ xml.tag! 'chname', credit_card.name
234
+ xml.tag! 'type', CARD_MAPPING[card_brand(credit_card).to_s]
235
+ xml.tag! 'issueno', credit_card.issue_number
236
+ xml.tag! 'cvn' do
237
+ xml.tag! 'number', credit_card.verification_value
238
+ xml.tag! 'presind', (options['presind'] || (credit_card.verification_value? ? 1 : nil))
239
+ end
240
+ end
241
+ end
242
+
243
+ def format_shipping_zip_code(zip)
244
+ zip.to_s.gsub(/\W/, '')
245
+ end
246
+
247
+ def new_timestamp
248
+ Time.now.strftime('%Y%m%d%H%M%S')
249
+ end
250
+
251
+ def add_signed_digest(xml, *values)
252
+ string = Digest::SHA1.hexdigest(values.join("."))
253
+ xml.tag! 'sha1hash', Digest::SHA1.hexdigest([string, @options[:password]].join("."))
254
+ end
255
+
256
+ def auto_settle_flag(action)
257
+ action == :authorization ? '0' : '1'
258
+ end
259
+
260
+ def expiry_date(credit_card)
261
+ "#{format(credit_card.month, :two_digits)}#{format(credit_card.year, :two_digits)}"
262
+ end
263
+
264
+ def normalize(field)
265
+ case field
266
+ when "true" then true
267
+ when "false" then false
268
+ when "" then nil
269
+ when "null" then nil
270
+ else field
271
+ end
272
+ end
273
+
274
+ def message_from(response)
275
+ message = nil
276
+ case response[:result]
277
+ when "00"
278
+ message = SUCCESS
279
+ when "101"
280
+ message = response[:message]
281
+ when "102", "103"
282
+ message = DECLINED
283
+ when /^2[0-9][0-9]/
284
+ message = BANK_ERROR
285
+ when /^3[0-9][0-9]/
286
+ message = REALEX_ERROR
287
+ when /^5[0-9][0-9]/
288
+ message = response[:message]
289
+ when "600", "601", "603"
290
+ message = ERROR
291
+ when "666"
292
+ message = CLIENT_DEACTIVATED
293
+ else
294
+ message = DECLINED
295
+ end
296
+ end
297
+
298
+ def sanitize_order_id(order_id)
299
+ order_id.to_s.gsub(/[^a-zA-Z0-9\-_]/, '')
300
+ end
301
+ end
302
+ end
303
+ end
@@ -0,0 +1,394 @@
1
+ # coding: utf-8
2
+ require 'nokogiri'
3
+
4
+ module ActiveMerchant #:nodoc:
5
+ module Billing #:nodoc:
6
+ # = Redsys Merchant Gateway
7
+ #
8
+ # Gateway support for the Spanish "Redsys" payment gateway system. This is
9
+ # used by many banks in Spain and is particularly well supported by
10
+ # Catalunya Caixa's ecommerce department.
11
+ #
12
+ # Standard ActiveMerchant methods are supported, with one notable exception:
13
+ # :order_id must be provided and must conform to a very specific format.
14
+ #
15
+ # == Example use:
16
+ #
17
+ # gateway = ActiveMerchant::Billing::RedsysGateway.new(
18
+ # :login => "091358382",
19
+ # :secret_key => "qwertyasdf0123456789"
20
+ # )
21
+ #
22
+ # # Run a purchase for 10 euros
23
+ # response = gateway.purchase(1000, creditcard, :order_id => "123456")
24
+ # puts reponse.success? # => true
25
+ #
26
+ # # Partially refund the purchase
27
+ # response = gateway.refund(500, response.authorization)
28
+ #
29
+ # Redsys requires an order_id be provided with each transaction of a
30
+ # specific format. The rules are as follows:
31
+ #
32
+ # * Minimum length: 4
33
+ # * Maximum length: 12
34
+ # * First 4 digits must be numerical
35
+ # * Remaining 8 digits may be alphanumeric
36
+ #
37
+ # Much of the code for this library is based on the active_merchant_sermepa
38
+ # integration gateway which uses essentially the same API but with the
39
+ # banks own payment screen.
40
+ #
41
+ # Written by Samuel Lown for Cabify. For implementation questions, or
42
+ # test access details please get in touch: sam@cabify.com.
43
+ class RedsysGateway < Gateway
44
+ self.live_url = "https://sis.sermepa.es/sis/operaciones"
45
+ self.test_url = "https://sis-t.sermepa.es:25443/sis/operaciones"
46
+
47
+ # Sensible region specific defaults.
48
+ self.supported_countries = ['ES']
49
+ self.default_currency = 'EUR'
50
+ self.money_format = :cents
51
+
52
+ # Not all card types may be actived by the bank!
53
+ self.supported_cardtypes = [:visa, :master, :american_express, :jcb, :diners_club]
54
+
55
+ # Homepage URL of the gateway for reference
56
+ self.homepage_url = "http://www.redsys.es/"
57
+
58
+ # What to call this gateway
59
+ self.display_name = "Redsys"
60
+
61
+ CURRENCY_CODES = {
62
+ "ARS" => '032',
63
+ "AUD" => '036',
64
+ "BRL" => '986',
65
+ "BOB" => '068',
66
+ "CAD" => '124',
67
+ "CHF" => '756',
68
+ "CLP" => '152',
69
+ "COP" => '170',
70
+ "EUR" => '978',
71
+ "GBP" => '826',
72
+ "GTQ" => '320',
73
+ "JPY" => '392',
74
+ "MXN" => '484',
75
+ "NZD" => '554',
76
+ "PEN" => '604',
77
+ "RUB" => '643',
78
+ "USD" => '840',
79
+ "UYU" => '858'
80
+ }
81
+
82
+ # The set of supported transactions for this gateway.
83
+ # More operations are supported by the gateway itself, but
84
+ # are not supported in this library.
85
+ SUPPORTED_TRANSACTIONS = {
86
+ :purchase => 'A',
87
+ :authorize => '1',
88
+ :capture => '2',
89
+ :refund => '3',
90
+ :cancel => '9'
91
+ }
92
+
93
+ # These are the text meanings sent back by the acquirer when
94
+ # a card has been rejected. Syntax or general request errors
95
+ # are not covered here.
96
+ RESPONSE_TEXTS = {
97
+ # Accepted Codes
98
+ 0 => "Transaction Approved",
99
+ 400 => "Cancellation Accepted",
100
+ 481 => "Cancellation Accepted",
101
+ 500 => "Reconciliation Accepted",
102
+ 900 => "Refund / Confirmation approved",
103
+
104
+ # Declined error codes
105
+ 101 => "Card expired",
106
+ 102 => "Card blocked temporarily or under susciption of fraud",
107
+ 104 => "Transaction not permitted",
108
+ 107 => "Contact the card issuer",
109
+ 109 => "Invalid identification by merchant or POS terminal",
110
+ 110 => "Invalid amount",
111
+ 114 => "Card cannot be used to the requested transaction",
112
+ 116 => "Insufficient credit",
113
+ 118 => "Non-registered card",
114
+ 125 => "Card not effective",
115
+ 129 => "CVV2/CVC2 Error",
116
+ 167 => "Contact the card issuer: suspected fraud",
117
+ 180 => "Card out of service",
118
+ 181 => "Card with credit or debit restrictions",
119
+ 182 => "Card with credit or debit restrictions",
120
+ 184 => "Authentication error",
121
+ 190 => "Refusal with no specific reason",
122
+ 191 => "Expiry date incorrect",
123
+
124
+ # Declined, and suspected of fraud
125
+ 201 => "Card expired",
126
+ 202 => "Card blocked temporarily or under suscipition of fraud",
127
+ 204 => "Transaction not permitted",
128
+ 207 => "Contact the card issuer",
129
+ 208 => "Lost or stolen card",
130
+ 209 => "Lost or stolen card",
131
+ 280 => "CVV2/CVC2 Error",
132
+ 290 => "Declined with no specific reason",
133
+
134
+ # More general codes for specific types of transaction
135
+ 480 => "Original transaction not located, or time-out exceeded",
136
+ 501 => "Original transaction not located, or time-out exceeded",
137
+ 502 => "Original transaction not located, or time-out exceeded",
138
+ 503 => "Original transaction not located, or time-out exceeded",
139
+
140
+ # Declined transactions by the bank
141
+ 904 => "Merchant not registered at FUC",
142
+ 909 => "System error",
143
+ 912 => "Issuer not available",
144
+ 913 => "Duplicate transmission",
145
+ 916 => "Amount too low",
146
+ 928 => "Time-out exceeded",
147
+ 940 => "Transaction cancelled previously",
148
+ 941 => "Authorization operation already cancelled",
149
+ 942 => "Original authorization declined",
150
+ 943 => "Different details from origin transaction",
151
+ 944 => "Session error",
152
+ 945 => "Duplicate transmission",
153
+ 946 => "Cancellation of transaction while in progress",
154
+ 947 => "Duplicate tranmission while in progress",
155
+ 949 => "POS Inoperative",
156
+ 950 => "Refund not possible",
157
+ 9064 => "Card number incorrect",
158
+ 9078 => "No payment method available",
159
+ 9093 => "Non-existent card",
160
+ 9218 => "Recursive transaction in bad gateway",
161
+ 9253 => "Check-digit incorrect",
162
+ 9256 => "Preauth not allowed for merchant",
163
+ 9257 => "Preauth not allowed for card",
164
+ 9261 => "Operating limit exceeded",
165
+ 9912 => "Issuer not available",
166
+ 9913 => "Confirmation error",
167
+ 9914 => "KO Confirmation"
168
+ }
169
+
170
+ # Creates a new instance
171
+ #
172
+ # Redsys requires a login and secret_key, and optionally also accepts a
173
+ # non-default terminal.
174
+ #
175
+ # ==== Options
176
+ #
177
+ # * <tt>:login</tt> -- The Redsys Merchant ID (REQUIRED)
178
+ # * <tt>:secret_key</tt> -- The Redsys Secret Key. (REQUIRED)
179
+ # * <tt>:terminal</tt> -- The Redsys Terminal. Defaults to 1. (OPTIONAL)
180
+ # * <tt>:test</tt> -- +true+ or +false+. Defaults to +false+. (OPTIONAL)
181
+ def initialize(options = {})
182
+ requires!(options, :login, :secret_key)
183
+ options[:terminal] ||= 1
184
+ super
185
+ end
186
+
187
+ def purchase(money, creditcard, options = {})
188
+ requires!(options, :order_id)
189
+
190
+ data = {}
191
+ add_action(data, :purchase)
192
+ add_amount(data, money, options)
193
+ add_order(data, options[:order_id])
194
+ add_creditcard(data, creditcard)
195
+
196
+ commit data
197
+ end
198
+
199
+ def authorize(money, creditcard, options = {})
200
+ requires!(options, :order_id)
201
+
202
+ data = {}
203
+ add_action(data, :authorize)
204
+ add_amount(data, money, options)
205
+ add_order(data, options[:order_id])
206
+ add_creditcard(data, creditcard)
207
+
208
+ commit data
209
+ end
210
+
211
+ def capture(money, authorization, options = {})
212
+ data = {}
213
+ add_action(data, :capture)
214
+ add_amount(data, money, options)
215
+ order_id, _, _ = split_authorization(authorization)
216
+ add_order(data, order_id)
217
+
218
+ commit data
219
+ end
220
+
221
+ def void(authorization, options = {})
222
+ data = {}
223
+ add_action(data, :cancel)
224
+ order_id, amount, currency = split_authorization(authorization)
225
+ add_amount(data, amount, :currency => currency)
226
+ add_order(data, order_id)
227
+
228
+ commit data
229
+ end
230
+
231
+ def refund(money, authorization, options = {})
232
+ data = {}
233
+ add_action(data, :refund)
234
+ add_amount(data, money, options)
235
+ order_id, _, _ = split_authorization(authorization)
236
+ add_order(data, order_id)
237
+
238
+ commit data
239
+ end
240
+
241
+ private
242
+
243
+ def add_action(data, action)
244
+ data[:action] = transaction_code(action)
245
+ end
246
+
247
+ def add_amount(data, money, options)
248
+ data[:amount] = amount(money).to_s
249
+ data[:currency] = currency_code(options[:currency] || currency(money))
250
+ end
251
+
252
+ def add_order(data, order_id)
253
+ raise ArgumentError.new("Invalid order_id format") unless(/^\d{4}[\da-zA-Z]{0,8}$/ =~ order_id)
254
+ data[:order_id] = order_id
255
+ end
256
+
257
+ def url
258
+ test? ? test_url : live_url
259
+ end
260
+
261
+ def add_creditcard(data, card)
262
+ name = [card.first_name, card.last_name].join(' ').slice(0, 60)
263
+ year = sprintf("%.4i", card.year)
264
+ month = sprintf("%.2i", card.month)
265
+ data[:card] = {
266
+ :name => name,
267
+ :pan => card.number,
268
+ :date => "#{year[2..3]}#{month}",
269
+ :cvv => card.verification_value
270
+ }
271
+ end
272
+
273
+ def commit(data)
274
+ headers = {
275
+ 'Content-Type' => 'application/x-www-form-urlencoded'
276
+ }
277
+ xml = build_xml_request(data)
278
+ parse(ssl_post(url, "entrada=#{CGI.escape(xml)}", headers))
279
+ end
280
+
281
+ def build_signature(data)
282
+ str = data[:amount] +
283
+ data[:order_id].to_s +
284
+ @options[:login].to_s +
285
+ data[:currency]
286
+
287
+ if card = data[:card]
288
+ str << card[:pan]
289
+ str << card[:cvv] if card[:cvv]
290
+ end
291
+
292
+ str << data[:action]
293
+ str << @options[:secret_key]
294
+
295
+ Digest::SHA1.hexdigest(str)
296
+ end
297
+
298
+ def build_xml_request(data)
299
+ xml = Builder::XmlMarkup.new :indent => 2
300
+ xml.DATOSENTRADA do
301
+ # Basic elements
302
+ xml.DS_Version 0.1
303
+ xml.DS_MERCHANT_CURRENCY data[:currency]
304
+ xml.DS_MERCHANT_AMOUNT data[:amount]
305
+ xml.DS_MERCHANT_ORDER data[:order_id]
306
+ xml.DS_MERCHANT_TRANSACTIONTYPE data[:action]
307
+ xml.DS_MERCHANT_TERMINAL @options[:terminal]
308
+ xml.DS_MERCHANT_MERCHANTCODE @options[:login]
309
+ xml.DS_MERCHANT_MERCHANTSIGNATURE build_signature(data)
310
+
311
+ # Only when card is present
312
+ if data[:card]
313
+ xml.DS_MERCHANT_TITULAR data[:card][:name]
314
+ xml.DS_MERCHANT_PAN data[:card][:pan]
315
+ xml.DS_MERCHANT_EXPIRYDATE data[:card][:date]
316
+ xml.DS_MERCHANT_CVV2 data[:card][:cvv]
317
+ end
318
+ end
319
+ xml.target!
320
+ end
321
+
322
+ def parse(data)
323
+ params = {}
324
+ success = false
325
+ message = ""
326
+ options = @options.merge(:test => test?)
327
+ xml = Nokogiri::XML(data)
328
+ code = xml.xpath("//RETORNOXML/CODIGO").text
329
+ if code == "0"
330
+ op = xml.xpath("//RETORNOXML/OPERACION")
331
+ op.children.each do |element|
332
+ params[element.name.downcase.to_sym] = element.text
333
+ end
334
+
335
+ if validate_signature(params)
336
+ message = response_text(params[:ds_response])
337
+ options[:authorization] = build_authorization(params)
338
+ success = is_success_response?(params[:ds_response])
339
+ else
340
+ message = "Response failed validation check"
341
+ end
342
+ else
343
+ # Some kind of programmer error with the request!
344
+ message = "#{code} ERROR"
345
+ end
346
+
347
+ Response.new(success, message, params, options)
348
+ end
349
+
350
+ def validate_signature(data)
351
+ str = data[:ds_amount] +
352
+ data[:ds_order].to_s +
353
+ data[:ds_merchantcode] +
354
+ data[:ds_currency] +
355
+ data[:ds_response] +
356
+ data[:ds_cardnumber].to_s +
357
+ data[:ds_transactiontype].to_s +
358
+ data[:ds_securepayment].to_s +
359
+ @options[:secret_key]
360
+
361
+ sig = Digest::SHA1.hexdigest(str)
362
+ data[:ds_signature].to_s.downcase == sig
363
+ end
364
+
365
+ def build_authorization(params)
366
+ [params[:ds_order], params[:ds_amount], params[:ds_currency]].join("|")
367
+ end
368
+
369
+ def split_authorization(authorization)
370
+ order_id, amount, currency = authorization.split("|")
371
+ [order_id, amount.to_i, currency]
372
+ end
373
+
374
+ def currency_code(currency)
375
+ return currency if currency =~ /^\d+$/
376
+ CURRENCY_CODES[currency]
377
+ end
378
+
379
+ def transaction_code(type)
380
+ SUPPORTED_TRANSACTIONS[type]
381
+ end
382
+
383
+ def response_text(code)
384
+ code = code.to_i
385
+ code = 0 if code < 100
386
+ RESPONSE_TEXTS[code] || "Unkown code, please check in manual"
387
+ end
388
+
389
+ def is_success_response?(code)
390
+ (code.to_i < 100) || [400, 481, 500, 900].include?(code.to_i)
391
+ end
392
+ end
393
+ end
394
+ end