activemerchant 1.42.6 → 1.90.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 (450) hide show
  1. checksums.yaml +5 -13
  2. data/CHANGELOG +1420 -2
  3. data/CONTRIBUTORS +106 -0
  4. data/README.md +107 -103
  5. data/lib/active_merchant/billing/apple_pay_payment_token.rb +22 -0
  6. data/lib/active_merchant/billing/avs_result.rb +12 -13
  7. data/lib/active_merchant/billing/base.rb +13 -16
  8. data/lib/active_merchant/billing/check.rb +35 -24
  9. data/lib/active_merchant/billing/compatibility.rb +117 -0
  10. data/lib/active_merchant/billing/credit_card.rb +196 -81
  11. data/lib/active_merchant/billing/credit_card_formatting.rb +6 -4
  12. data/lib/active_merchant/billing/credit_card_methods.rb +199 -75
  13. data/lib/active_merchant/billing/cvv_result.rb +15 -15
  14. data/lib/active_merchant/billing/gateway.rb +171 -39
  15. data/lib/active_merchant/billing/gateways/adyen.rb +380 -0
  16. data/lib/active_merchant/billing/gateways/allied_wallet.rb +205 -0
  17. data/lib/active_merchant/billing/gateways/authorize_net.rb +933 -604
  18. data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +417 -0
  19. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +74 -54
  20. data/lib/active_merchant/billing/gateways/axcessms.rb +181 -0
  21. data/lib/active_merchant/billing/gateways/balanced.rb +130 -370
  22. data/lib/active_merchant/billing/gateways/bank_frick.rb +225 -0
  23. data/lib/active_merchant/billing/gateways/banwire.rb +23 -12
  24. data/lib/active_merchant/billing/gateways/barclaycard_smartpay.rb +351 -0
  25. data/lib/active_merchant/billing/gateways/barclays_epdq_extra_plus.rb +6 -6
  26. data/lib/active_merchant/billing/gateways/be2bill.rb +2 -2
  27. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +109 -32
  28. data/lib/active_merchant/billing/gateways/beanstream.rb +59 -13
  29. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +12 -9
  30. data/lib/active_merchant/billing/gateways/blue_pay.rb +520 -498
  31. data/lib/active_merchant/billing/gateways/blue_snap.rb +347 -0
  32. data/lib/active_merchant/billing/gateways/bogus.rb +80 -46
  33. data/lib/active_merchant/billing/gateways/borgun.rb +220 -0
  34. data/lib/active_merchant/billing/gateways/bpoint.rb +277 -0
  35. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +15 -2
  36. data/lib/active_merchant/billing/gateways/braintree.rb +2 -2
  37. data/lib/active_merchant/billing/gateways/braintree_blue.rb +311 -121
  38. data/lib/active_merchant/billing/gateways/braintree_orange.rb +4 -4
  39. data/lib/active_merchant/billing/gateways/bridge_pay.rb +244 -0
  40. data/lib/active_merchant/billing/gateways/cams.rb +230 -0
  41. data/lib/active_merchant/billing/gateways/card_connect.rb +311 -0
  42. data/lib/active_merchant/billing/gateways/card_save.rb +6 -7
  43. data/lib/active_merchant/billing/gateways/card_stream.rb +235 -89
  44. data/lib/active_merchant/billing/gateways/cardknox.rb +327 -0
  45. data/lib/active_merchant/billing/gateways/cardprocess.rb +254 -0
  46. data/lib/active_merchant/billing/gateways/cashnet.rb +219 -0
  47. data/lib/active_merchant/billing/gateways/cc5.rb +50 -8
  48. data/lib/active_merchant/billing/gateways/cecabank.rb +27 -14
  49. data/lib/active_merchant/billing/gateways/cenpos.rb +327 -0
  50. data/lib/active_merchant/billing/gateways/checkout.rb +214 -0
  51. data/lib/active_merchant/billing/gateways/checkout_v2.rb +233 -0
  52. data/lib/active_merchant/billing/gateways/citrus_pay.rb +22 -0
  53. data/lib/active_merchant/billing/gateways/clearhaus.rb +220 -0
  54. data/lib/active_merchant/billing/gateways/commercegate.rb +142 -0
  55. data/lib/active_merchant/billing/gateways/conekta.rb +91 -97
  56. data/lib/active_merchant/billing/gateways/creditcall.rb +271 -0
  57. data/lib/active_merchant/billing/gateways/credorax.rb +356 -0
  58. data/lib/active_merchant/billing/gateways/ct_payment.rb +268 -0
  59. data/lib/active_merchant/billing/gateways/culqi.rb +277 -0
  60. data/lib/active_merchant/billing/gateways/cyber_source.rb +294 -158
  61. data/lib/active_merchant/billing/gateways/d_local.rb +226 -0
  62. data/lib/active_merchant/billing/gateways/data_cash.rb +59 -347
  63. data/lib/active_merchant/billing/gateways/dibs.rb +199 -0
  64. data/lib/active_merchant/billing/gateways/digitzs.rb +292 -0
  65. data/lib/active_merchant/billing/gateways/ebanx.rb +296 -0
  66. data/lib/active_merchant/billing/gateways/efsnet.rb +24 -39
  67. data/lib/active_merchant/billing/gateways/elavon.rb +146 -147
  68. data/lib/active_merchant/billing/gateways/element.rb +356 -0
  69. data/lib/active_merchant/billing/gateways/epay.rb +41 -31
  70. data/lib/active_merchant/billing/gateways/evo_ca.rb +1 -1
  71. data/lib/active_merchant/billing/gateways/eway.rb +79 -78
  72. data/lib/active_merchant/billing/gateways/eway_managed.rb +35 -36
  73. data/lib/active_merchant/billing/gateways/eway_rapid.rb +369 -228
  74. data/lib/active_merchant/billing/gateways/exact.rb +32 -26
  75. data/lib/active_merchant/billing/gateways/ezic.rb +195 -0
  76. data/lib/active_merchant/billing/gateways/fat_zebra.rb +90 -64
  77. data/lib/active_merchant/billing/gateways/federated_canada.rb +6 -14
  78. data/lib/active_merchant/billing/gateways/finansbank.rb +3 -3
  79. data/lib/active_merchant/billing/gateways/first_giving.rb +142 -0
  80. data/lib/active_merchant/billing/gateways/first_pay.rb +128 -122
  81. data/lib/active_merchant/billing/gateways/firstdata_e4.rb +190 -64
  82. data/lib/active_merchant/billing/gateways/firstdata_e4_v27.rb +446 -0
  83. data/lib/active_merchant/billing/gateways/flo2cash.rb +215 -0
  84. data/lib/active_merchant/billing/gateways/flo2cash_simple.rb +20 -0
  85. data/lib/active_merchant/billing/gateways/forte.rb +270 -0
  86. data/lib/active_merchant/billing/gateways/garanti.rb +29 -27
  87. data/lib/active_merchant/billing/gateways/global_collect.rb +340 -0
  88. data/lib/active_merchant/billing/gateways/global_transport.rb +194 -0
  89. data/lib/active_merchant/billing/gateways/hdfc.rb +35 -36
  90. data/lib/active_merchant/billing/gateways/hps.rb +305 -0
  91. data/lib/active_merchant/billing/gateways/iats_payments.rb +271 -16
  92. data/lib/active_merchant/billing/gateways/in_context_paypal_express.rb +15 -0
  93. data/lib/active_merchant/billing/gateways/inspire.rb +29 -32
  94. data/lib/active_merchant/billing/gateways/instapay.rb +5 -6
  95. data/lib/active_merchant/billing/gateways/ipp.rb +175 -0
  96. data/lib/active_merchant/billing/gateways/iridium.rb +247 -41
  97. data/lib/active_merchant/billing/gateways/itransact.rb +4 -5
  98. data/lib/active_merchant/billing/gateways/iveri.rb +251 -0
  99. data/lib/active_merchant/billing/gateways/jetpay.rb +198 -71
  100. data/lib/active_merchant/billing/gateways/jetpay_v2.rb +437 -0
  101. data/lib/active_merchant/billing/gateways/komoju.rb +115 -0
  102. data/lib/active_merchant/billing/gateways/kushki.rb +219 -0
  103. data/lib/active_merchant/billing/gateways/latitude19.rb +411 -0
  104. data/lib/active_merchant/billing/gateways/linkpoint.rb +45 -43
  105. data/lib/active_merchant/billing/gateways/litle.rb +328 -444
  106. data/lib/active_merchant/billing/gateways/mastercard.rb +267 -0
  107. data/lib/active_merchant/billing/gateways/maxipago.rb +145 -115
  108. data/lib/active_merchant/billing/gateways/mercado_pago.rb +277 -0
  109. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +37 -19
  110. data/lib/active_merchant/billing/gateways/merchant_one.rb +13 -15
  111. data/lib/active_merchant/billing/gateways/merchant_partners.rb +245 -0
  112. data/lib/active_merchant/billing/gateways/merchant_ware.rb +57 -60
  113. data/lib/active_merchant/billing/gateways/merchant_ware_version_four.rb +59 -48
  114. data/lib/active_merchant/billing/gateways/merchant_warrior.rb +38 -19
  115. data/lib/active_merchant/billing/gateways/mercury.rb +77 -54
  116. data/lib/active_merchant/billing/gateways/metrics_global.rb +11 -30
  117. data/lib/active_merchant/billing/gateways/micropayment.rb +183 -0
  118. data/lib/active_merchant/billing/gateways/migs.rb +81 -22
  119. data/lib/active_merchant/billing/gateways/modern_payments.rb +3 -3
  120. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +23 -25
  121. data/lib/active_merchant/billing/gateways/monei.rb +307 -0
  122. data/lib/active_merchant/billing/gateways/moneris.rb +146 -64
  123. data/lib/active_merchant/billing/gateways/moneris_us.rb +197 -53
  124. data/lib/active_merchant/billing/gateways/money_movers.rb +6 -15
  125. data/lib/active_merchant/billing/gateways/mundipagg.rb +292 -0
  126. data/lib/active_merchant/billing/gateways/nab_transact.rb +86 -64
  127. data/lib/active_merchant/billing/gateways/ncr_secure_pay.rb +165 -0
  128. data/lib/active_merchant/billing/gateways/net_registry.rb +11 -5
  129. data/lib/active_merchant/billing/gateways/netaxept.rb +21 -22
  130. data/lib/active_merchant/billing/gateways/netbanx.rb +290 -0
  131. data/lib/active_merchant/billing/gateways/netbilling.rb +70 -35
  132. data/lib/active_merchant/billing/gateways/netpay.rb +5 -6
  133. data/lib/active_merchant/billing/gateways/network_merchants.rb +241 -0
  134. data/lib/active_merchant/billing/gateways/nmi.rb +274 -10
  135. data/lib/active_merchant/billing/gateways/ogone.rb +90 -47
  136. data/lib/active_merchant/billing/gateways/omise.rb +324 -0
  137. data/lib/active_merchant/billing/gateways/openpay.rb +48 -20
  138. data/lib/active_merchant/billing/gateways/opp.rb +369 -0
  139. data/lib/active_merchant/billing/gateways/optimal_payment.rb +79 -44
  140. data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +22 -21
  141. data/lib/active_merchant/billing/gateways/orbital.rb +346 -102
  142. data/lib/active_merchant/billing/gateways/pac_net_raven.rb +48 -29
  143. data/lib/active_merchant/billing/gateways/pagarme.rb +246 -0
  144. data/lib/active_merchant/billing/gateways/pago_facil.rb +122 -0
  145. data/lib/active_merchant/billing/gateways/pay_conex.rb +245 -0
  146. data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +67 -48
  147. data/lib/active_merchant/billing/gateways/pay_hub.rb +213 -0
  148. data/lib/active_merchant/billing/gateways/pay_junction.rb +20 -26
  149. data/lib/active_merchant/billing/gateways/pay_junction_v2.rb +188 -0
  150. data/lib/active_merchant/billing/gateways/pay_secure.rb +7 -15
  151. data/lib/active_merchant/billing/gateways/paybox_direct.rb +40 -36
  152. data/lib/active_merchant/billing/gateways/payeezy.rb +410 -0
  153. data/lib/active_merchant/billing/gateways/payex.rb +38 -30
  154. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +62 -36
  155. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +11 -7
  156. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +3 -3
  157. data/lib/active_merchant/billing/gateways/payflow.rb +74 -27
  158. data/lib/active_merchant/billing/gateways/payflow_express.rb +77 -81
  159. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +2 -3
  160. data/lib/active_merchant/billing/gateways/payflow_uk.rb +5 -6
  161. data/lib/active_merchant/billing/gateways/payment_express.rb +54 -45
  162. data/lib/active_merchant/billing/gateways/paymentez.rb +304 -0
  163. data/lib/active_merchant/billing/gateways/paymill.rb +160 -66
  164. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +54 -7
  165. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +4 -0
  166. data/lib/active_merchant/billing/gateways/paypal/paypal_recurring_api.rb +17 -3
  167. data/lib/active_merchant/billing/gateways/paypal.rb +36 -27
  168. data/lib/active_merchant/billing/gateways/paypal_ca.rb +1 -1
  169. data/lib/active_merchant/billing/gateways/paypal_digital_goods.rb +7 -6
  170. data/lib/active_merchant/billing/gateways/paypal_express.rb +32 -4
  171. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +3 -3
  172. data/lib/active_merchant/billing/gateways/payscout.rb +2 -13
  173. data/lib/active_merchant/billing/gateways/paystation.rb +96 -88
  174. data/lib/active_merchant/billing/gateways/payu_in.rb +248 -0
  175. data/lib/active_merchant/billing/gateways/payu_latam.rb +445 -0
  176. data/lib/active_merchant/billing/gateways/payway.rb +8 -8
  177. data/lib/active_merchant/billing/gateways/pin.rb +74 -18
  178. data/lib/active_merchant/billing/gateways/plugnpay.rb +66 -76
  179. data/lib/active_merchant/billing/gateways/pro_pay.rb +326 -0
  180. data/lib/active_merchant/billing/gateways/psigate.rb +30 -30
  181. data/lib/active_merchant/billing/gateways/psl_card.rb +27 -34
  182. data/lib/active_merchant/billing/gateways/qbms.rb +65 -54
  183. data/lib/active_merchant/billing/gateways/quantum.rb +18 -18
  184. data/lib/active_merchant/billing/gateways/quickbooks.rb +290 -0
  185. data/lib/active_merchant/billing/gateways/quickpay/quickpay_common.rb +184 -0
  186. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb +295 -0
  187. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v4to7.rb +226 -0
  188. data/lib/active_merchant/billing/gateways/quickpay.rb +10 -350
  189. data/lib/active_merchant/billing/gateways/qvalent.rb +236 -0
  190. data/lib/active_merchant/billing/gateways/realex.rb +78 -48
  191. data/lib/active_merchant/billing/gateways/redsys.rb +310 -170
  192. data/lib/active_merchant/billing/gateways/s5.rb +246 -0
  193. data/lib/active_merchant/billing/gateways/safe_charge.rb +262 -0
  194. data/lib/active_merchant/billing/gateways/sage.rb +415 -119
  195. data/lib/active_merchant/billing/gateways/sage_pay.rb +195 -90
  196. data/lib/active_merchant/billing/gateways/sallie_mae.rb +11 -12
  197. data/lib/active_merchant/billing/gateways/secure_net.rb +51 -43
  198. data/lib/active_merchant/billing/gateways/secure_pay.rb +182 -10
  199. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +25 -14
  200. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +10 -18
  201. data/lib/active_merchant/billing/gateways/securion_pay.rb +264 -0
  202. data/lib/active_merchant/billing/gateways/skip_jack.rb +35 -38
  203. data/lib/active_merchant/billing/gateways/smart_ps.rb +50 -42
  204. data/lib/active_merchant/billing/gateways/so_easy_pay.rb +9 -9
  205. data/lib/active_merchant/billing/gateways/spreedly_core.rb +62 -12
  206. data/lib/active_merchant/billing/gateways/stripe.rb +536 -103
  207. data/lib/active_merchant/billing/gateways/swipe_checkout.rb +12 -18
  208. data/lib/active_merchant/billing/gateways/telr.rb +274 -0
  209. data/lib/active_merchant/billing/gateways/tns.rb +22 -0
  210. data/lib/active_merchant/billing/gateways/trans_first.rb +143 -30
  211. data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +608 -0
  212. data/lib/active_merchant/billing/gateways/transact_pro.rb +224 -0
  213. data/lib/active_merchant/billing/gateways/transax.rb +5 -6
  214. data/lib/active_merchant/billing/gateways/transnational.rb +2 -232
  215. data/lib/active_merchant/billing/gateways/trexle.rb +218 -0
  216. data/lib/active_merchant/billing/gateways/trust_commerce.rb +86 -57
  217. data/lib/active_merchant/billing/gateways/usa_epay.rb +4 -4
  218. data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +196 -89
  219. data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +157 -32
  220. data/lib/active_merchant/billing/gateways/vanco.rb +294 -0
  221. data/lib/active_merchant/billing/gateways/verifi.rb +42 -49
  222. data/lib/active_merchant/billing/gateways/viaklix.rb +11 -24
  223. data/lib/active_merchant/billing/gateways/visanet_peru.rb +233 -0
  224. data/lib/active_merchant/billing/gateways/webpay.rb +26 -28
  225. data/lib/active_merchant/billing/gateways/wepay.rb +237 -0
  226. data/lib/active_merchant/billing/gateways/wirecard.rb +153 -31
  227. data/lib/active_merchant/billing/gateways/world_net.rb +344 -0
  228. data/lib/active_merchant/billing/gateways/worldpay.rb +207 -63
  229. data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +215 -0
  230. data/lib/active_merchant/billing/gateways/worldpay_us.rb +221 -0
  231. data/lib/active_merchant/billing/gateways.rb +8 -11
  232. data/lib/active_merchant/billing/model.rb +30 -0
  233. data/lib/active_merchant/billing/network_tokenization_credit_card.rb +39 -0
  234. data/lib/active_merchant/billing/payment_token.rb +21 -0
  235. data/lib/active_merchant/billing/rails.rb +3 -0
  236. data/lib/active_merchant/billing/response.rb +31 -24
  237. data/lib/active_merchant/billing.rb +7 -1
  238. data/lib/active_merchant/connection.rb +195 -0
  239. data/lib/active_merchant/country.rb +335 -0
  240. data/lib/active_merchant/empty.rb +20 -0
  241. data/lib/active_merchant/errors.rb +35 -0
  242. data/lib/active_merchant/net_http_ssl_connection.rb +10 -0
  243. data/lib/active_merchant/network_connection_retries.rb +80 -0
  244. data/lib/active_merchant/post_data.rb +25 -0
  245. data/lib/active_merchant/posts_data.rb +92 -0
  246. data/lib/active_merchant/version.rb +1 -1
  247. data/lib/active_merchant.rb +23 -27
  248. data/lib/activemerchant.rb +1 -1
  249. data/lib/certs/cacert.pem +3988 -0
  250. data/lib/support/gateway_support.rb +7 -9
  251. data/lib/support/outbound_hosts.rb +13 -10
  252. data/lib/support/ssl_verify.rb +6 -7
  253. data/lib/support/ssl_version.rb +87 -0
  254. metadata +148 -323
  255. checksums.yaml.gz.sig +0 -0
  256. data/gem-public_cert.pem +0 -21
  257. data/lib/active_merchant/billing/expiry_date.rb +0 -34
  258. data/lib/active_merchant/billing/gateways/app55.rb +0 -185
  259. data/lib/active_merchant/billing/gateways/barclays_epdq.rb +0 -314
  260. data/lib/active_merchant/billing/gateways/certo_direct.rb +0 -277
  261. data/lib/active_merchant/billing/gateways/ideal/ideal_base.rb +0 -249
  262. data/lib/active_merchant/billing/gateways/ideal/ideal_rabobank.pem +0 -13
  263. data/lib/active_merchant/billing/gateways/ideal/ideal_response.rb +0 -29
  264. data/lib/active_merchant/billing/gateways/ideal_rabobank.rb +0 -66
  265. data/lib/active_merchant/billing/gateways/orbital/avs_result.rb +0 -93
  266. data/lib/active_merchant/billing/gateways/orbital/cvv_result.rb +0 -34
  267. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +0 -93
  268. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +0 -114
  269. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +0 -102
  270. data/lib/active_merchant/billing/gateways/samurai.rb +0 -118
  271. data/lib/active_merchant/billing/gateways/vindicia.rb +0 -361
  272. data/lib/active_merchant/billing/integrations/a1agregator/helper.rb +0 -31
  273. data/lib/active_merchant/billing/integrations/a1agregator/notification.rb +0 -186
  274. data/lib/active_merchant/billing/integrations/a1agregator/status.rb +0 -38
  275. data/lib/active_merchant/billing/integrations/a1agregator.rb +0 -26
  276. data/lib/active_merchant/billing/integrations/action_view_helper.rb +0 -74
  277. data/lib/active_merchant/billing/integrations/alipay/helper.rb +0 -34
  278. data/lib/active_merchant/billing/integrations/alipay/notification.rb +0 -101
  279. data/lib/active_merchant/billing/integrations/alipay.rb +0 -18
  280. data/lib/active_merchant/billing/integrations/authorize_net_sim/helper.rb +0 -229
  281. data/lib/active_merchant/billing/integrations/authorize_net_sim/notification.rb +0 -340
  282. data/lib/active_merchant/billing/integrations/authorize_net_sim.rb +0 -38
  283. data/lib/active_merchant/billing/integrations/bit_pay/helper.rb +0 -64
  284. data/lib/active_merchant/billing/integrations/bit_pay/notification.rb +0 -74
  285. data/lib/active_merchant/billing/integrations/bit_pay/return.rb +0 -10
  286. data/lib/active_merchant/billing/integrations/bit_pay.rb +0 -30
  287. data/lib/active_merchant/billing/integrations/bogus/helper.rb +0 -17
  288. data/lib/active_merchant/billing/integrations/bogus/notification.rb +0 -11
  289. data/lib/active_merchant/billing/integrations/bogus/return.rb +0 -10
  290. data/lib/active_merchant/billing/integrations/bogus.rb +0 -23
  291. data/lib/active_merchant/billing/integrations/chronopay/helper.rb +0 -120
  292. data/lib/active_merchant/billing/integrations/chronopay/notification.rb +0 -158
  293. data/lib/active_merchant/billing/integrations/chronopay/return.rb +0 -10
  294. data/lib/active_merchant/billing/integrations/chronopay.rb +0 -23
  295. data/lib/active_merchant/billing/integrations/citrus/helper.rb +0 -40
  296. data/lib/active_merchant/billing/integrations/citrus/notification.rb +0 -133
  297. data/lib/active_merchant/billing/integrations/citrus/return.rb +0 -40
  298. data/lib/active_merchant/billing/integrations/citrus.rb +0 -51
  299. data/lib/active_merchant/billing/integrations/direc_pay/helper.rb +0 -200
  300. data/lib/active_merchant/billing/integrations/direc_pay/notification.rb +0 -76
  301. data/lib/active_merchant/billing/integrations/direc_pay/return.rb +0 -32
  302. data/lib/active_merchant/billing/integrations/direc_pay/status.rb +0 -37
  303. data/lib/active_merchant/billing/integrations/direc_pay.rb +0 -41
  304. data/lib/active_merchant/billing/integrations/directebanking/helper.rb +0 -90
  305. data/lib/active_merchant/billing/integrations/directebanking/notification.rb +0 -120
  306. data/lib/active_merchant/billing/integrations/directebanking/return.rb +0 -11
  307. data/lib/active_merchant/billing/integrations/directebanking.rb +0 -47
  308. data/lib/active_merchant/billing/integrations/doku/helper.rb +0 -102
  309. data/lib/active_merchant/billing/integrations/doku/notification.rb +0 -69
  310. data/lib/active_merchant/billing/integrations/doku/return.rb +0 -10
  311. data/lib/active_merchant/billing/integrations/doku.rb +0 -24
  312. data/lib/active_merchant/billing/integrations/dotpay/helper.rb +0 -77
  313. data/lib/active_merchant/billing/integrations/dotpay/notification.rb +0 -86
  314. data/lib/active_merchant/billing/integrations/dotpay/return.rb +0 -11
  315. data/lib/active_merchant/billing/integrations/dotpay.rb +0 -22
  316. data/lib/active_merchant/billing/integrations/dwolla/common.rb +0 -23
  317. data/lib/active_merchant/billing/integrations/dwolla/helper.rb +0 -43
  318. data/lib/active_merchant/billing/integrations/dwolla/notification.rb +0 -64
  319. data/lib/active_merchant/billing/integrations/dwolla/return.rb +0 -49
  320. data/lib/active_merchant/billing/integrations/dwolla.rb +0 -23
  321. data/lib/active_merchant/billing/integrations/e_payment_plans/helper.rb +0 -34
  322. data/lib/active_merchant/billing/integrations/e_payment_plans/notification.rb +0 -84
  323. data/lib/active_merchant/billing/integrations/e_payment_plans.rb +0 -48
  324. data/lib/active_merchant/billing/integrations/easy_pay/common.rb +0 -40
  325. data/lib/active_merchant/billing/integrations/easy_pay/helper.rb +0 -36
  326. data/lib/active_merchant/billing/integrations/easy_pay/notification.rb +0 -59
  327. data/lib/active_merchant/billing/integrations/easy_pay.rb +0 -30
  328. data/lib/active_merchant/billing/integrations/epay/helper.rb +0 -55
  329. data/lib/active_merchant/billing/integrations/epay/notification.rb +0 -110
  330. data/lib/active_merchant/billing/integrations/epay.rb +0 -21
  331. data/lib/active_merchant/billing/integrations/first_data/helper.rb +0 -61
  332. data/lib/active_merchant/billing/integrations/first_data/notification.rb +0 -56
  333. data/lib/active_merchant/billing/integrations/first_data.rb +0 -38
  334. data/lib/active_merchant/billing/integrations/gestpay/common.rb +0 -42
  335. data/lib/active_merchant/billing/integrations/gestpay/helper.rb +0 -70
  336. data/lib/active_merchant/billing/integrations/gestpay/notification.rb +0 -85
  337. data/lib/active_merchant/billing/integrations/gestpay/return.rb +0 -10
  338. data/lib/active_merchant/billing/integrations/gestpay.rb +0 -25
  339. data/lib/active_merchant/billing/integrations/helper.rb +0 -117
  340. data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +0 -58
  341. data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +0 -59
  342. data/lib/active_merchant/billing/integrations/hi_trust/return.rb +0 -68
  343. data/lib/active_merchant/billing/integrations/hi_trust.rb +0 -27
  344. data/lib/active_merchant/billing/integrations/ipay88/helper.rb +0 -118
  345. data/lib/active_merchant/billing/integrations/ipay88/notification.rb +0 -103
  346. data/lib/active_merchant/billing/integrations/ipay88/return.rb +0 -29
  347. data/lib/active_merchant/billing/integrations/ipay88.rb +0 -23
  348. data/lib/active_merchant/billing/integrations/liqpay/helper.rb +0 -43
  349. data/lib/active_merchant/billing/integrations/liqpay/notification.rb +0 -89
  350. data/lib/active_merchant/billing/integrations/liqpay/return.rb +0 -83
  351. data/lib/active_merchant/billing/integrations/liqpay.rb +0 -30
  352. data/lib/active_merchant/billing/integrations/maksuturva/helper.rb +0 -119
  353. data/lib/active_merchant/billing/integrations/maksuturva/notification.rb +0 -48
  354. data/lib/active_merchant/billing/integrations/maksuturva.rb +0 -86
  355. data/lib/active_merchant/billing/integrations/moneybookers/helper.rb +0 -75
  356. data/lib/active_merchant/billing/integrations/moneybookers/notification.rb +0 -123
  357. data/lib/active_merchant/billing/integrations/moneybookers.rb +0 -26
  358. data/lib/active_merchant/billing/integrations/nochex/helper.rb +0 -68
  359. data/lib/active_merchant/billing/integrations/nochex/notification.rb +0 -94
  360. data/lib/active_merchant/billing/integrations/nochex/return.rb +0 -10
  361. data/lib/active_merchant/billing/integrations/nochex.rb +0 -88
  362. data/lib/active_merchant/billing/integrations/notification.rb +0 -71
  363. data/lib/active_merchant/billing/integrations/paxum/common.rb +0 -24
  364. data/lib/active_merchant/billing/integrations/paxum/helper.rb +0 -42
  365. data/lib/active_merchant/billing/integrations/paxum/notification.rb +0 -33
  366. data/lib/active_merchant/billing/integrations/paxum.rb +0 -44
  367. data/lib/active_merchant/billing/integrations/pay_fast/common.rb +0 -42
  368. data/lib/active_merchant/billing/integrations/pay_fast/helper.rb +0 -50
  369. data/lib/active_merchant/billing/integrations/pay_fast/notification.rb +0 -134
  370. data/lib/active_merchant/billing/integrations/pay_fast/return.rb +0 -10
  371. data/lib/active_merchant/billing/integrations/pay_fast.rb +0 -70
  372. data/lib/active_merchant/billing/integrations/paydollar/helper.rb +0 -41
  373. data/lib/active_merchant/billing/integrations/paydollar/notification.rb +0 -60
  374. data/lib/active_merchant/billing/integrations/paydollar/return.rb +0 -15
  375. data/lib/active_merchant/billing/integrations/paydollar.rb +0 -59
  376. data/lib/active_merchant/billing/integrations/payflow_link/helper.rb +0 -116
  377. data/lib/active_merchant/billing/integrations/payflow_link/notification.rb +0 -78
  378. data/lib/active_merchant/billing/integrations/payflow_link.rb +0 -21
  379. data/lib/active_merchant/billing/integrations/paypal/helper.rb +0 -119
  380. data/lib/active_merchant/billing/integrations/paypal/notification.rb +0 -227
  381. data/lib/active_merchant/billing/integrations/paypal/return.rb +0 -10
  382. data/lib/active_merchant/billing/integrations/paypal.rb +0 -39
  383. data/lib/active_merchant/billing/integrations/paypal_payments_advanced/helper.rb +0 -15
  384. data/lib/active_merchant/billing/integrations/paypal_payments_advanced.rb +0 -20
  385. data/lib/active_merchant/billing/integrations/paysbuy/helper.rb +0 -15
  386. data/lib/active_merchant/billing/integrations/paysbuy/notification.rb +0 -39
  387. data/lib/active_merchant/billing/integrations/paysbuy.rb +0 -36
  388. data/lib/active_merchant/billing/integrations/payu_in/helper.rb +0 -76
  389. data/lib/active_merchant/billing/integrations/payu_in/notification.rb +0 -154
  390. data/lib/active_merchant/billing/integrations/payu_in/return.rb +0 -36
  391. data/lib/active_merchant/billing/integrations/payu_in.rb +0 -36
  392. data/lib/active_merchant/billing/integrations/payu_in_paisa/helper.rb +0 -19
  393. data/lib/active_merchant/billing/integrations/payu_in_paisa/notification.rb +0 -13
  394. data/lib/active_merchant/billing/integrations/payu_in_paisa/return.rb +0 -16
  395. data/lib/active_merchant/billing/integrations/payu_in_paisa.rb +0 -30
  396. data/lib/active_merchant/billing/integrations/platron/helper.rb +0 -32
  397. data/lib/active_merchant/billing/integrations/platron/notification.rb +0 -113
  398. data/lib/active_merchant/billing/integrations/platron.rb +0 -28
  399. data/lib/active_merchant/billing/integrations/pxpay/helper.rb +0 -112
  400. data/lib/active_merchant/billing/integrations/pxpay/notification.rb +0 -157
  401. data/lib/active_merchant/billing/integrations/pxpay/return.rb +0 -25
  402. data/lib/active_merchant/billing/integrations/pxpay.rb +0 -31
  403. data/lib/active_merchant/billing/integrations/quickpay/helper.rb +0 -96
  404. data/lib/active_merchant/billing/integrations/quickpay/notification.rb +0 -137
  405. data/lib/active_merchant/billing/integrations/quickpay.rb +0 -21
  406. data/lib/active_merchant/billing/integrations/rbkmoney/helper.rb +0 -23
  407. data/lib/active_merchant/billing/integrations/rbkmoney/notification.rb +0 -91
  408. data/lib/active_merchant/billing/integrations/rbkmoney.rb +0 -17
  409. data/lib/active_merchant/billing/integrations/return.rb +0 -42
  410. data/lib/active_merchant/billing/integrations/robokassa/common.rb +0 -19
  411. data/lib/active_merchant/billing/integrations/robokassa/helper.rb +0 -50
  412. data/lib/active_merchant/billing/integrations/robokassa/notification.rb +0 -55
  413. data/lib/active_merchant/billing/integrations/robokassa/return.rb +0 -17
  414. data/lib/active_merchant/billing/integrations/robokassa.rb +0 -49
  415. data/lib/active_merchant/billing/integrations/sage_pay_form/encryption.rb +0 -33
  416. data/lib/active_merchant/billing/integrations/sage_pay_form/helper.rb +0 -136
  417. data/lib/active_merchant/billing/integrations/sage_pay_form/notification.rb +0 -210
  418. data/lib/active_merchant/billing/integrations/sage_pay_form/return.rb +0 -31
  419. data/lib/active_merchant/billing/integrations/sage_pay_form.rb +0 -37
  420. data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +0 -107
  421. data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +0 -171
  422. data/lib/active_merchant/billing/integrations/two_checkout/return.rb +0 -58
  423. data/lib/active_merchant/billing/integrations/two_checkout.rb +0 -44
  424. data/lib/active_merchant/billing/integrations/valitor/helper.rb +0 -86
  425. data/lib/active_merchant/billing/integrations/valitor/notification.rb +0 -13
  426. data/lib/active_merchant/billing/integrations/valitor/response_fields.rb +0 -97
  427. data/lib/active_merchant/billing/integrations/valitor/return.rb +0 -13
  428. data/lib/active_merchant/billing/integrations/valitor.rb +0 -33
  429. data/lib/active_merchant/billing/integrations/verkkomaksut/helper.rb +0 -88
  430. data/lib/active_merchant/billing/integrations/verkkomaksut/notification.rb +0 -59
  431. data/lib/active_merchant/billing/integrations/verkkomaksut.rb +0 -20
  432. data/lib/active_merchant/billing/integrations/web_pay/common.rb +0 -50
  433. data/lib/active_merchant/billing/integrations/web_pay/helper.rb +0 -68
  434. data/lib/active_merchant/billing/integrations/web_pay/notification.rb +0 -51
  435. data/lib/active_merchant/billing/integrations/web_pay.rb +0 -45
  436. data/lib/active_merchant/billing/integrations/webmoney/common.rb +0 -17
  437. data/lib/active_merchant/billing/integrations/webmoney/helper.rb +0 -40
  438. data/lib/active_merchant/billing/integrations/webmoney/notification.rb +0 -47
  439. data/lib/active_merchant/billing/integrations/webmoney.rb +0 -43
  440. data/lib/active_merchant/billing/integrations/wirecard_checkout_page/common.rb +0 -104
  441. data/lib/active_merchant/billing/integrations/wirecard_checkout_page/helper.rb +0 -145
  442. data/lib/active_merchant/billing/integrations/wirecard_checkout_page/notification.rb +0 -101
  443. data/lib/active_merchant/billing/integrations/wirecard_checkout_page/return.rb +0 -35
  444. data/lib/active_merchant/billing/integrations/wirecard_checkout_page.rb +0 -39
  445. data/lib/active_merchant/billing/integrations/world_pay/helper.rb +0 -101
  446. data/lib/active_merchant/billing/integrations/world_pay/notification.rb +0 -160
  447. data/lib/active_merchant/billing/integrations/world_pay.rb +0 -34
  448. data/lib/active_merchant/billing/integrations.rb +0 -17
  449. data.tar.gz.sig +0 -0
  450. metadata.gz.sig +0 -1
@@ -0,0 +1,245 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class PayConexGateway < Gateway
4
+ include Empty
5
+
6
+ self.test_url = 'https://cert.payconex.net/api/qsapi/3.8/'
7
+ self.live_url = 'https://secure.payconex.net/api/qsapi/3.8/'
8
+
9
+ self.supported_countries = %w(US CA)
10
+ self.default_currency = 'USD'
11
+ self.supported_cardtypes = [:visa, :master, :american_express, :discover, :jcb, :diners_club]
12
+
13
+ self.homepage_url = 'http://www.bluefincommerce.com/'
14
+ self.display_name = 'PayConex'
15
+
16
+ def initialize(options={})
17
+ requires!(options, :account_id, :api_accesskey)
18
+ super
19
+ end
20
+
21
+ def purchase(money, payment_method, options={})
22
+ post = {}
23
+ add_auth_purchase_params(post, money, payment_method, options)
24
+ commit('SALE', post)
25
+ end
26
+
27
+ def authorize(money, payment_method, options={})
28
+ post = {}
29
+ add_auth_purchase_params(post, money, payment_method, options)
30
+ commit('AUTHORIZATION', post)
31
+ end
32
+
33
+ def capture(money, authorization, options={})
34
+ post = {}
35
+ add_reference_params(post, authorization, options)
36
+ add_amount(post, money, options)
37
+ commit('CAPTURE', post)
38
+ end
39
+
40
+ def refund(money, authorization, options={})
41
+ post = {}
42
+ add_reference_params(post, authorization, options)
43
+ add_amount(post, money, options)
44
+ commit('REFUND', post)
45
+ end
46
+
47
+ def void(authorization, options = {})
48
+ post = {}
49
+ add_reference_params(post, authorization, options)
50
+ commit('REVERSAL', post)
51
+ end
52
+
53
+ def credit(money, payment_method, options={})
54
+ if payment_method.is_a?(String)
55
+ raise ArgumentError, 'Reference credits are not supported. Please supply the original credit card or use the #refund method.'
56
+ end
57
+
58
+ post = {}
59
+ add_auth_purchase_params(post, money, payment_method, options)
60
+ commit('CREDIT', post)
61
+ end
62
+
63
+ def verify(payment_method, options={})
64
+ authorize(0, payment_method, options)
65
+ end
66
+
67
+ def store(payment_method, options={})
68
+ post = {}
69
+ add_credentials(post)
70
+ add_payment_method(post, payment_method)
71
+ add_address(post, options)
72
+ add_common_options(post, options)
73
+ commit('STORE', post)
74
+ end
75
+
76
+ def supports_scrubbing?
77
+ true
78
+ end
79
+
80
+ def scrub(transcript)
81
+ force_utf8(transcript).
82
+ gsub(%r((api_accesskey=)\w+), '\1[FILTERED]').
83
+ gsub(%r((card_number=)\w+), '\1[FILTERED]').
84
+ gsub(%r((card_verification=)\w+), '\1[FILTERED]')
85
+ end
86
+
87
+ private
88
+
89
+ def force_utf8(string)
90
+ return nil unless string
91
+ binary = string.encode('BINARY', invalid: :replace, undef: :replace, replace: '?') # Needed for Ruby 2.0 since #encode is a no-op if the string is already UTF-8. It's not needed for Ruby 2.1 and up since it's not a no-op there.
92
+ binary.encode('UTF-8', invalid: :replace, undef: :replace, replace: '?')
93
+ end
94
+
95
+ def add_credentials(post)
96
+ post[:account_id] = @options[:account_id]
97
+ post[:api_accesskey] = @options[:api_accesskey]
98
+ end
99
+
100
+ def add_auth_purchase_params(post, money, payment_method, options)
101
+ add_credentials(post)
102
+ add_payment_method(post, payment_method)
103
+ add_address(post, options)
104
+ add_common_options(post, options)
105
+ add_amount(post, money, options)
106
+ add_if_present(post, :email, options[:email])
107
+ end
108
+
109
+ def add_reference_params(post, authorization, options)
110
+ add_credentials(post)
111
+ add_common_options(post, options)
112
+ add_token_id(post, authorization)
113
+ end
114
+
115
+ def add_amount(post, money, options)
116
+ post[:transaction_amount] = amount(money)
117
+ currency_code = (options[:currency] || currency(money))
118
+ add_if_present(post, :currency, currency_code)
119
+ end
120
+
121
+ def add_payment_method(post, payment_method)
122
+ case payment_method
123
+ when String
124
+ add_token_payment_method(post, payment_method)
125
+ when Check
126
+ add_check(post, payment_method)
127
+ else
128
+ if payment_method.respond_to?(:track_data) && payment_method.track_data.present?
129
+ add_card_present_payment_method(post, payment_method)
130
+ else
131
+ add_credit_card(post, payment_method)
132
+ end
133
+ end
134
+ end
135
+
136
+ def add_credit_card(post, payment_method)
137
+ post[:tender_type] = 'CARD'
138
+ post[:card_number] = payment_method.number
139
+ post[:card_expiration] = expdate(payment_method)
140
+ post[:card_verification] = payment_method.verification_value
141
+ post[:first_name] = payment_method.first_name
142
+ post[:last_name] = payment_method.last_name
143
+ end
144
+
145
+ def add_token_payment_method(post, payment_method)
146
+ post[:tender_type] = 'CARD'
147
+ post[:token_id] = payment_method
148
+ post[:reissue] = true
149
+ end
150
+
151
+ def add_card_present_payment_method(post, payment_method)
152
+ post[:tender_type] = 'CARD'
153
+ post[:card_tracks] = payment_method.track_data
154
+ end
155
+
156
+ def add_check(post, payment_method)
157
+ post[:tender_type] = 'ACH'
158
+ post[:first_name] = payment_method.first_name
159
+ post[:last_name] = payment_method.last_name
160
+ post[:bank_account_number] = payment_method.account_number
161
+ post[:bank_routing_number] = payment_method.routing_number
162
+ post[:check_number] = payment_method.number
163
+ add_if_present(post, :ach_account_type, payment_method.account_type)
164
+ end
165
+
166
+ def add_address(post, options)
167
+ address = options[:billing_address]
168
+ return unless address
169
+
170
+ add_if_present(post, :street_address1, address[:address1])
171
+ add_if_present(post, :street_address2, address[:address2])
172
+ add_if_present(post, :city, address[:city])
173
+ add_if_present(post, :state, address[:state])
174
+ add_if_present(post, :zip, address[:zip])
175
+ add_if_present(post, :country, address[:country])
176
+ add_if_present(post, :phone, address[:phone])
177
+ end
178
+
179
+ def add_common_options(post, options)
180
+ add_if_present(post, :transaction_description, options[:description])
181
+ add_if_present(post, :custom_id, options[:custom_id])
182
+ add_if_present(post, :custom_data, options[:custom_data])
183
+ add_if_present(post, :ip_address, options[:ip])
184
+ add_if_present(post, :payment_type, options[:payment_type])
185
+ add_if_present(post, :cashier, options[:cashier])
186
+
187
+ post[:disable_cvv] = options[:disable_cvv] unless options[:disable_cvv].nil?
188
+ post[:response_format] = 'JSON'
189
+ end
190
+
191
+ def add_if_present(post, key, value)
192
+ post[key] = value unless empty?(value)
193
+ end
194
+
195
+ def add_token_id(post, authorization)
196
+ post[:token_id] = authorization
197
+ end
198
+
199
+ def parse(body)
200
+ JSON.parse(body)
201
+ end
202
+
203
+ def commit(action, params)
204
+ raw_response = ssl_post(url, post_data(action, params))
205
+ response = parse(raw_response)
206
+
207
+ Response.new(
208
+ success_from(response),
209
+ message_from(response),
210
+ response,
211
+ authorization: response['transaction_id'],
212
+ :avs_result => AVSResult.new(code: response['avs_response']),
213
+ :cvv_result => CVVResult.new(response['cvv2_response']),
214
+ test: test?
215
+ )
216
+ rescue JSON::ParserError
217
+ unparsable_response(raw_response)
218
+ end
219
+
220
+ def url
221
+ test? ? test_url : live_url
222
+ end
223
+
224
+ def success_from(response)
225
+ response['transaction_approved'] || !response['error']
226
+ end
227
+
228
+ def message_from(response)
229
+ success_from(response) ? response['authorization_message'] : response['error_message']
230
+ end
231
+
232
+ def post_data(action, params)
233
+ params[:transaction_type] = action
234
+ params.map { |k, v| "#{k}=#{CGI.escape(v.to_s)}" }.join('&')
235
+ end
236
+
237
+ def unparsable_response(raw_response)
238
+ message = 'Invalid JSON response received from PayConex. Please contact PayConex if you continue to receive this message.'
239
+ message += " (The raw response returned by the API was #{raw_response.inspect})"
240
+ return Response.new(false, message)
241
+ end
242
+
243
+ end
244
+ end
245
+ end
@@ -52,7 +52,7 @@ module ActiveMerchant #:nodoc:
52
52
  #
53
53
  # PayGateXML Field ActiveMerchant Use
54
54
  #
55
- # pgid use :login value to gateway instantation
55
+ # pgid use :login value to gateway instantiation
56
56
  # pwd use :password value to gateway instantiation
57
57
  #
58
58
  # cname credit_card.name
@@ -102,45 +102,45 @@ module ActiveMerchant #:nodoc:
102
102
 
103
103
  DECLINE_CODES = {
104
104
  # Credit Card Errors - These RESULT_CODEs are returned if the transaction cannot be authorized due to a problem with the card. The TRANSACTION_STATUS will be 2
105
- 900001 => "Call for Approval",
106
- 900002 => "Card Expired",
107
- 900003 => "Insufficient Funds",
108
- 900004 => "Invalid Card Number",
109
- 900005 => "Bank Interface Timeout", # indicates a communications failure between the banks systems
110
- 900006 => "Invalid Card",
111
- 900007 => "Declined",
112
- 900009 => "Lost Card",
113
- 900010 => "Invalid Card Length",
114
- 900011 => "Suspected Fraud",
115
- 900012 => "Card Reported As Stolen",
116
- 900013 => "Restricted Card",
117
- 900014 => "Excessive Card Usage",
118
- 900015 => "Card Blacklisted",
119
-
120
- 900207 => "Declined; authentication failed", # indicates the cardholder did not enter their MasterCard SecureCode / Verified by Visa password correctly
121
-
122
- 990020 => "Auth Declined",
123
-
124
- 991001 => "Invalid expiry date",
125
- 991002 => "Invalid amount",
105
+ 900001 => 'Call for Approval',
106
+ 900002 => 'Card Expired',
107
+ 900003 => 'Insufficient Funds',
108
+ 900004 => 'Invalid Card Number',
109
+ 900005 => 'Bank Interface Timeout', # indicates a communications failure between the banks systems
110
+ 900006 => 'Invalid Card',
111
+ 900007 => 'Declined',
112
+ 900009 => 'Lost Card',
113
+ 900010 => 'Invalid Card Length',
114
+ 900011 => 'Suspected Fraud',
115
+ 900012 => 'Card Reported As Stolen',
116
+ 900013 => 'Restricted Card',
117
+ 900014 => 'Excessive Card Usage',
118
+ 900015 => 'Card Blacklisted',
119
+
120
+ 900207 => 'Declined; authentication failed', # indicates the cardholder did not enter their MasterCard SecureCode / Verified by Visa password correctly
121
+
122
+ 990020 => 'Auth Declined',
123
+
124
+ 991001 => 'Invalid expiry date',
125
+ 991002 => 'Invalid amount',
126
126
 
127
127
  # Communication Errors - These RESULT_CODEs are returned if the transaction cannot be completed due to an unexpected error. TRANSACTION_STATUS will be 0.
128
- 900205 => "Unexpected authentication result (phase 1)",
129
- 900206 => "Unexpected authentication result (phase 1)",
128
+ 900205 => 'Unexpected authentication result (phase 1)',
129
+ 900206 => 'Unexpected authentication result (phase 1)',
130
130
 
131
- 990001 => "Could not insert into Database",
131
+ 990001 => 'Could not insert into Database',
132
132
 
133
- 990022 => "Bank not available",
133
+ 990022 => 'Bank not available',
134
134
 
135
- 990053 => "Error processing transaction",
135
+ 990053 => 'Error processing transaction',
136
136
 
137
137
  # Miscellaneous - Unless otherwise noted, the TRANSACTION_STATUS will be 0.
138
- 900209 => "Transaction verification failed (phase 2)", # Indicates the verification data returned from MasterCard SecureCode / Verified by Visa has been altered
139
- 900210 => "Authentication complete; transaction must be restarted", # Indicates that the MasterCard SecuerCode / Verified by Visa transaction has already been completed. Most likely caused by the customer clicking the refresh button
138
+ 900209 => 'Transaction verification failed (phase 2)', # Indicates the verification data returned from MasterCard SecureCode / Verified by Visa has been altered
139
+ 900210 => 'Authentication complete; transaction must be restarted', # Indicates that the MasterCard SecuerCode / Verified by Visa transaction has already been completed. Most likely caused by the customer clicking the refresh button
140
140
 
141
- 990024 => "Duplicate Transaction Detected. Please check before submitting",
141
+ 990024 => 'Duplicate Transaction Detected. Please check before submitting',
142
142
 
143
- 990028 => "Transaction cancelled" # Customer clicks the 'Cancel' button on the payment page
143
+ 990028 => 'Transaction cancelled' # Customer clicks the 'Cancel' button on the payment page
144
144
  }
145
145
 
146
146
  SUCCESS_CODES = %w( 990004 990005 990017 990012 990018 990031 )
@@ -162,22 +162,32 @@ module ActiveMerchant #:nodoc:
162
162
 
163
163
  def purchase(money, creditcard, options = {})
164
164
  MultiResponse.run do |r|
165
- r.process{authorize(money, creditcard, options)}
166
- r.process{capture(money, r.authorization, options)}
165
+ r.process { authorize(money, creditcard, options) }
166
+ r.process { capture(money, r.authorization, options) }
167
167
  end
168
168
  end
169
169
 
170
170
  def authorize(money, creditcard, options = {})
171
171
  action = 'authtx'
172
172
 
173
- options.merge!(:money => money, :creditcard => creditcard)
173
+ options[:money] = money
174
+ options[:creditcard] = creditcard
174
175
  commit(action, build_request(action, options))
175
176
  end
176
177
 
177
178
  def capture(money, authorization, options = {})
178
179
  action = 'settletx'
179
180
 
180
- options.merge!(:money => money, :authorization => authorization)
181
+ options[:money] = money
182
+ options[:authorization] = authorization
183
+ commit(action, build_request(action, options), authorization)
184
+ end
185
+
186
+ def refund(money, authorization, options={})
187
+ action = 'refundtx'
188
+
189
+ options[:money] = money
190
+ options[:authorization] = authorization
181
191
  commit(action, build_request(action, options))
182
192
  end
183
193
 
@@ -192,17 +202,18 @@ module ActiveMerchant #:nodoc:
192
202
  xml.instruct!
193
203
 
194
204
  xml.tag! 'protocol', :ver => API_VERSION, :pgid => (test? ? TEST_ID : @options[:login]), :pwd => @options[:password] do |protocol|
205
+ money = options.delete(:money)
206
+ authorization = options.delete(:authorization)
207
+ creditcard = options.delete(:creditcard)
195
208
  case action
196
- when 'authtx'
197
- money = options.delete(:money)
198
- creditcard = options.delete(:creditcard)
199
- build_authorization(protocol, money, creditcard, options)
200
- when 'settletx'
201
- money = options.delete(:money)
202
- authorization = options.delete(:authorization)
203
- build_capture(protocol, money, authorization, options)
209
+ when 'authtx'
210
+ build_authorization(protocol, money, creditcard, options)
211
+ when 'settletx'
212
+ build_capture(protocol, money, authorization, options)
213
+ when 'refundtx'
214
+ build_refund(protocol, money, authorization, options)
204
215
  else
205
- raise "no action specified for build_request"
216
+ raise 'no action specified for build_request'
206
217
  end
207
218
  end
208
219
 
@@ -218,7 +229,9 @@ module ActiveMerchant #:nodoc:
218
229
  :budp => 0,
219
230
  :amt => amount(money),
220
231
  :cur => (options[:currency] || currency(money)),
221
- :cvv => creditcard.verification_value
232
+ :cvv => creditcard.verification_value,
233
+ :email => options[:email],
234
+ :ip => options[:ip]
222
235
  }
223
236
  end
224
237
 
@@ -228,6 +241,13 @@ module ActiveMerchant #:nodoc:
228
241
  }
229
242
  end
230
243
 
244
+ def build_refund(xml, money, authorization, options={})
245
+ xml.tag! 'refundtx', {
246
+ :tid => authorization,
247
+ :amt => amount(money)
248
+ }
249
+ end
250
+
231
251
  def parse(action, body)
232
252
  hash = {}
233
253
  xml = REXML::Document.new(body)
@@ -244,11 +264,11 @@ module ActiveMerchant #:nodoc:
244
264
  hash
245
265
  end
246
266
 
247
- def commit(action, request)
267
+ def commit(action, request, authorization = nil)
248
268
  response = parse(action, ssl_post(self.live_url, request))
249
269
  Response.new(successful?(response), message_from(response), response,
250
270
  :test => test?,
251
- :authorization => response[:tid]
271
+ :authorization => authorization || response[:tid]
252
272
  )
253
273
  end
254
274
 
@@ -258,4 +278,3 @@ module ActiveMerchant #:nodoc:
258
278
  end
259
279
  end
260
280
  end
261
-
@@ -0,0 +1,213 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class PayHubGateway < Gateway
4
+ self.live_url = 'https://checkout.payhub.com/transaction/api'
5
+
6
+ self.supported_countries = ['US']
7
+ self.default_currency = 'USD'
8
+ self.supported_cardtypes = [:visa, :master, :american_express, :discover]
9
+
10
+ self.homepage_url = 'http://www.payhub.com/'
11
+ self.display_name = 'PayHub'
12
+
13
+ CVV_CODE_TRANSLATOR = {
14
+ 'M' => 'CVV matches',
15
+ 'N' => 'CVV does not match',
16
+ 'P' => 'CVV not processed',
17
+ 'S' => 'CVV should have been present',
18
+ 'U' => 'CVV request unable to be processed by issuer'
19
+ }
20
+
21
+ AVS_CODE_TRANSLATOR = {
22
+ '0' => 'Approved, Address verification was not requested.',
23
+ 'A' => 'Approved, Address matches only.',
24
+ 'B' => 'Address Match. Street Address math for international transaction Postal Code not verified because of incompatible formats (Acquirer sent both street address and Postal Code)',
25
+ 'C' => 'Serv Unavailable. Street address and Postal Code not verified for international transaction because of incompatible formats (Acquirer sent both street and Postal Code).',
26
+ 'D' => 'Exact Match, Street Address and Postal Code match for international transaction.',
27
+ 'F' => 'Exact Match, Street Address and Postal Code match. Applies to UK only.',
28
+ 'G' => 'Ver Unavailable, Non-U.S. Issuer does not participate.',
29
+ 'I' => 'Ver Unavailable, Address information not verified for international transaction',
30
+ 'M' => 'Exact Match, Street Address and Postal Code match for international transaction',
31
+ 'N' => 'No - Address and ZIP Code does not match',
32
+ 'P' => 'Zip Match, Postal Codes match for international transaction Street address not verified because of incompatible formats (Acquirer sent both street address and Postal Code).',
33
+ 'R' => 'Retry - Issuer system unavailable',
34
+ 'S' => 'Serv Unavailable, Service not supported',
35
+ 'U' => 'Ver Unavailable, Address unavailable.',
36
+ 'W' => 'ZIP match - Nine character numeric ZIP match only.',
37
+ 'X' => 'Exact match, Address and nine-character ZIP match.',
38
+ 'Y' => 'Exact Match, Address and five character ZIP match.',
39
+ 'Z' => 'Zip Match, Five character numeric ZIP match only.',
40
+ '1' => 'Cardholder name and ZIP match AMEX only.',
41
+ '2' => 'Cardholder name, address, and ZIP match AMEX only.',
42
+ '3' => 'Cardholder name and address match AMEX only.',
43
+ '4' => 'Cardholder name match AMEX only.',
44
+ '5' => 'Cardholder name incorrect, ZIP match AMEX only.',
45
+ '6' => 'Cardholder name incorrect, address and ZIP match AMEX only.',
46
+ '7' => 'Cardholder name incorrect, address match AMEX only.',
47
+ '8' => 'Cardholder, all do not match AMEX only.'
48
+ }
49
+
50
+ STANDARD_ERROR_CODE_MAPPING = {
51
+ '14' => STANDARD_ERROR_CODE[:invalid_number],
52
+ '80' => STANDARD_ERROR_CODE[:invalid_expiry_date],
53
+ '82' => STANDARD_ERROR_CODE[:invalid_cvc],
54
+ '54' => STANDARD_ERROR_CODE[:expired_card],
55
+ '51' => STANDARD_ERROR_CODE[:card_declined],
56
+ '05' => STANDARD_ERROR_CODE[:card_declined],
57
+ '61' => STANDARD_ERROR_CODE[:card_declined],
58
+ '62' => STANDARD_ERROR_CODE[:card_declined],
59
+ '65' => STANDARD_ERROR_CODE[:card_declined],
60
+ '93' => STANDARD_ERROR_CODE[:card_declined],
61
+ '01' => STANDARD_ERROR_CODE[:call_issuer],
62
+ '02' => STANDARD_ERROR_CODE[:call_issuer],
63
+ '04' => STANDARD_ERROR_CODE[:pickup_card],
64
+ '07' => STANDARD_ERROR_CODE[:pickup_card],
65
+ '41' => STANDARD_ERROR_CODE[:pickup_card],
66
+ '43' => STANDARD_ERROR_CODE[:pickup_card]
67
+ }
68
+
69
+ def initialize(options={})
70
+ requires!(options, :orgid, :username, :password, :tid)
71
+
72
+ super
73
+ end
74
+
75
+ def authorize(amount, creditcard, options = {})
76
+ post = setup_post('auth')
77
+ add_creditcard(post, creditcard)
78
+ add_amount(post, amount)
79
+ add_address(post, (options[:address] || options[:billing_address]))
80
+ add_customer_data(post, options)
81
+
82
+ commit(post)
83
+ end
84
+
85
+ def purchase(amount, creditcard, options={})
86
+ post = setup_post('sale')
87
+ add_creditcard(post, creditcard)
88
+ add_amount(post, amount)
89
+ add_address(post, (options[:address] || options[:billing_address]))
90
+ add_customer_data(post, options)
91
+
92
+ commit(post)
93
+ end
94
+
95
+ def refund(amount, trans_id, options={})
96
+ # Attempt a void in case the transaction is unsettled
97
+ post = setup_post('void')
98
+ add_reference(post, trans_id)
99
+ response = commit(post)
100
+ return response if response.success?
101
+
102
+ post = setup_post('refund')
103
+ add_reference(post, trans_id)
104
+ commit(post)
105
+ end
106
+
107
+ def capture(amount, trans_id, options = {})
108
+ post = setup_post('capture')
109
+
110
+ add_reference(post, trans_id)
111
+ add_amount(post, amount)
112
+
113
+ commit(post)
114
+ end
115
+
116
+ # No void, as PayHub's void does not work on authorizations
117
+
118
+ def verify(creditcard, options={})
119
+ authorize(100, creditcard, options)
120
+ end
121
+
122
+ private
123
+
124
+ def setup_post(action)
125
+ post = {}
126
+ post[:orgid] = @options[:orgid]
127
+ post[:tid] = @options[:tid]
128
+ post[:username] = @options[:username]
129
+ post[:password] = @options[:password]
130
+ post[:mode] = (test? ? 'demo' : 'live')
131
+ post[:trans_type] = action
132
+ post
133
+ end
134
+
135
+ def add_reference(post, trans_id)
136
+ post[:trans_id] = trans_id
137
+ end
138
+
139
+ def add_customer_data(post, options = {})
140
+ post[:first_name] = options[:first_name]
141
+ post[:last_name] = options[:last_name]
142
+ post[:phone] = options[:phone]
143
+ post[:email] = options[:email]
144
+ end
145
+
146
+ def add_address(post, address)
147
+ return unless address
148
+ post[:address1] = address[:address1]
149
+ post[:address2] = address[:address2]
150
+ post[:zip] = address[:zip]
151
+ post[:state] = address[:state]
152
+ post[:city] = address[:city]
153
+ end
154
+
155
+ def add_amount(post, amount)
156
+ post[:amount] = amount(amount)
157
+ end
158
+
159
+ def add_creditcard(post, creditcard)
160
+ post[:cc] = creditcard.number
161
+ post[:month] = creditcard.month.to_s
162
+ post[:year] = creditcard.year.to_s
163
+ post[:cvv] = creditcard.verification_value
164
+ end
165
+
166
+ def parse(body)
167
+ JSON.parse(body)
168
+ end
169
+
170
+ def commit(post)
171
+ success = false
172
+
173
+ begin
174
+ raw_response = ssl_post(live_url, post.to_json, {'Content-Type' => 'application/json'})
175
+ response = parse(raw_response)
176
+ success = (response['RESPONSE_CODE'] == '00')
177
+ rescue ResponseError => e
178
+ raw_response = e.response.body
179
+ response = response_error(raw_response)
180
+ rescue JSON::ParserError
181
+ response = json_error(raw_response)
182
+ end
183
+
184
+ Response.new(success,
185
+ response_message(response),
186
+ response,
187
+ test: test?,
188
+ avs_result: {code: response['AVS_RESULT_CODE']},
189
+ cvv_result: response['VERIFICATION_RESULT_CODE'],
190
+ error_code: (success ? nil : STANDARD_ERROR_CODE_MAPPING[response['RESPONSE_CODE']]),
191
+ authorization: response['TRANSACTION_ID']
192
+ )
193
+ end
194
+
195
+ def response_error(raw_response)
196
+ parse(raw_response)
197
+ rescue JSON::ParserError
198
+ json_error(raw_response)
199
+ end
200
+
201
+ def json_error(raw_response)
202
+ {
203
+ error_message: 'Invalid response received from the Payhub API. Please contact wecare@payhub.com if you continue to receive this message.' \
204
+ " (The raw response returned by the API was #{raw_response.inspect})"
205
+ }
206
+ end
207
+
208
+ def response_message(response)
209
+ (response['RESPONSE_TEXT'] || response['RESPONSE_CODE'] || response[:error_message])
210
+ end
211
+ end
212
+ end
213
+ end