activemerchant 1.38.0 → 1.79.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (400) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +1402 -3
  3. data/CONTRIBUTORS +154 -0
  4. data/README.md +157 -144
  5. data/lib/active_merchant/billing/apple_pay_payment_token.rb +22 -0
  6. data/lib/active_merchant/billing/base.rb +21 -17
  7. data/lib/active_merchant/billing/check.rb +32 -22
  8. data/lib/active_merchant/billing/compatibility.rb +120 -0
  9. data/lib/active_merchant/billing/credit_card.rb +215 -67
  10. data/lib/active_merchant/billing/credit_card_formatting.rb +4 -1
  11. data/lib/active_merchant/billing/credit_card_methods.rb +152 -53
  12. data/lib/active_merchant/billing/cvv_result.rb +15 -15
  13. data/lib/active_merchant/billing/gateway.rb +170 -24
  14. data/lib/active_merchant/billing/gateways/adyen.rb +299 -0
  15. data/lib/active_merchant/billing/gateways/allied_wallet.rb +206 -0
  16. data/lib/active_merchant/billing/gateways/authorize_net.rb +904 -606
  17. data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +417 -0
  18. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +43 -18
  19. data/lib/active_merchant/billing/gateways/axcessms.rb +181 -0
  20. data/lib/active_merchant/billing/gateways/balanced.rb +134 -346
  21. data/lib/active_merchant/billing/gateways/bank_frick.rb +225 -0
  22. data/lib/active_merchant/billing/gateways/banwire.rb +13 -2
  23. data/lib/active_merchant/billing/gateways/barclaycard_smartpay.rb +326 -0
  24. data/lib/active_merchant/billing/gateways/be2bill.rb +131 -0
  25. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +96 -15
  26. data/lib/active_merchant/billing/gateways/beanstream.rb +52 -9
  27. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +12 -8
  28. data/lib/active_merchant/billing/gateways/blue_pay.rb +520 -501
  29. data/lib/active_merchant/billing/gateways/blue_snap.rb +343 -0
  30. data/lib/active_merchant/billing/gateways/bogus.rb +94 -50
  31. data/lib/active_merchant/billing/gateways/borgun.rb +221 -0
  32. data/lib/active_merchant/billing/gateways/bpoint.rb +277 -0
  33. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +15 -2
  34. data/lib/active_merchant/billing/gateways/braintree.rb +2 -2
  35. data/lib/active_merchant/billing/gateways/braintree_blue.rb +387 -139
  36. data/lib/active_merchant/billing/gateways/braintree_orange.rb +4 -4
  37. data/lib/active_merchant/billing/gateways/bridge_pay.rb +245 -0
  38. data/lib/active_merchant/billing/gateways/cams.rb +230 -0
  39. data/lib/active_merchant/billing/gateways/card_connect.rb +286 -0
  40. data/lib/active_merchant/billing/gateways/card_stream.rb +269 -118
  41. data/lib/active_merchant/billing/gateways/cardknox.rb +328 -0
  42. data/lib/active_merchant/billing/gateways/cardprocess.rb +254 -0
  43. data/lib/active_merchant/billing/gateways/cashnet.rb +219 -0
  44. data/lib/active_merchant/billing/gateways/cc5.rb +45 -0
  45. data/lib/active_merchant/billing/gateways/cecabank.rb +239 -0
  46. data/lib/active_merchant/billing/gateways/cenpos.rb +327 -0
  47. data/lib/active_merchant/billing/gateways/checkout.rb +214 -0
  48. data/lib/active_merchant/billing/gateways/checkout_v2.rb +233 -0
  49. data/lib/active_merchant/billing/gateways/citrus_pay.rb +23 -0
  50. data/lib/active_merchant/billing/gateways/clearhaus.rb +220 -0
  51. data/lib/active_merchant/billing/gateways/commercegate.rb +143 -0
  52. data/lib/active_merchant/billing/gateways/conekta.rb +225 -0
  53. data/lib/active_merchant/billing/gateways/creditcall.rb +272 -0
  54. data/lib/active_merchant/billing/gateways/credorax.rb +345 -0
  55. data/lib/active_merchant/billing/gateways/culqi.rb +279 -0
  56. data/lib/active_merchant/billing/gateways/cyber_source.rb +237 -98
  57. data/lib/active_merchant/billing/gateways/data_cash.rb +41 -314
  58. data/lib/active_merchant/billing/gateways/dibs.rb +205 -0
  59. data/lib/active_merchant/billing/gateways/digitzs.rb +292 -0
  60. data/lib/active_merchant/billing/gateways/ebanx.rb +296 -0
  61. data/lib/active_merchant/billing/gateways/efsnet.rb +3 -14
  62. data/lib/active_merchant/billing/gateways/elavon.rb +143 -142
  63. data/lib/active_merchant/billing/gateways/element.rb +356 -0
  64. data/lib/active_merchant/billing/gateways/epay.rb +23 -12
  65. data/lib/active_merchant/billing/gateways/eway.rb +12 -12
  66. data/lib/active_merchant/billing/gateways/eway_managed.rb +1 -1
  67. data/lib/active_merchant/billing/gateways/eway_rapid.rb +417 -204
  68. data/lib/active_merchant/billing/gateways/exact.rb +10 -1
  69. data/lib/active_merchant/billing/gateways/ezic.rb +196 -0
  70. data/lib/active_merchant/billing/gateways/fat_zebra.rb +65 -37
  71. data/lib/active_merchant/billing/gateways/federated_canada.rb +1 -8
  72. data/lib/active_merchant/billing/gateways/finansbank.rb +3 -2
  73. data/lib/active_merchant/billing/gateways/first_giving.rb +143 -0
  74. data/lib/active_merchant/billing/gateways/first_pay.rb +110 -124
  75. data/lib/active_merchant/billing/gateways/firstdata_e4.rb +155 -29
  76. data/lib/active_merchant/billing/gateways/flo2cash.rb +215 -0
  77. data/lib/active_merchant/billing/gateways/flo2cash_simple.rb +20 -0
  78. data/lib/active_merchant/billing/gateways/forte.rb +256 -0
  79. data/lib/active_merchant/billing/gateways/garanti.rb +11 -5
  80. data/lib/active_merchant/billing/gateways/global_collect.rb +334 -0
  81. data/lib/active_merchant/billing/gateways/global_transport.rb +194 -0
  82. data/lib/active_merchant/billing/gateways/hps.rb +305 -0
  83. data/lib/active_merchant/billing/gateways/iats_payments.rb +271 -16
  84. data/lib/active_merchant/billing/gateways/ideal/ideal_base.rb +2 -5
  85. data/lib/active_merchant/billing/gateways/ideal/ideal_rabobank.pem +0 -0
  86. data/lib/active_merchant/billing/gateways/ideal_rabobank.rb +1 -1
  87. data/lib/active_merchant/billing/gateways/in_context_paypal_express.rb +15 -0
  88. data/lib/active_merchant/billing/gateways/inspire.rb +8 -10
  89. data/lib/active_merchant/billing/gateways/instapay.rb +0 -0
  90. data/lib/active_merchant/billing/gateways/ipp.rb +175 -0
  91. data/lib/active_merchant/billing/gateways/iridium.rb +210 -4
  92. data/lib/active_merchant/billing/gateways/iveri.rb +251 -0
  93. data/lib/active_merchant/billing/gateways/jetpay.rb +176 -49
  94. data/lib/active_merchant/billing/gateways/jetpay_v2.rb +437 -0
  95. data/lib/active_merchant/billing/gateways/komoju.rb +115 -0
  96. data/lib/active_merchant/billing/gateways/kushki.rb +227 -0
  97. data/lib/active_merchant/billing/gateways/latitude19.rb +416 -0
  98. data/lib/active_merchant/billing/gateways/linkpoint.rb +17 -13
  99. data/lib/active_merchant/billing/gateways/litle.rb +329 -439
  100. data/lib/active_merchant/billing/gateways/mastercard.rb +268 -0
  101. data/lib/active_merchant/billing/gateways/maxipago.rb +220 -0
  102. data/lib/active_merchant/billing/gateways/mercado_pago.rb +262 -0
  103. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +26 -7
  104. data/lib/active_merchant/billing/gateways/merchant_one.rb +0 -1
  105. data/lib/active_merchant/billing/gateways/merchant_partners.rb +245 -0
  106. data/lib/active_merchant/billing/gateways/merchant_ware.rb +12 -15
  107. data/lib/active_merchant/billing/gateways/merchant_ware_version_four.rb +24 -13
  108. data/lib/active_merchant/billing/gateways/merchant_warrior.rb +33 -14
  109. data/lib/active_merchant/billing/gateways/mercury.rb +74 -29
  110. data/lib/active_merchant/billing/gateways/metrics_global.rb +2 -21
  111. data/lib/active_merchant/billing/gateways/micropayment.rb +185 -0
  112. data/lib/active_merchant/billing/gateways/migs.rb +73 -14
  113. data/lib/active_merchant/billing/gateways/modern_payments.rb +1 -1
  114. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +1 -3
  115. data/lib/active_merchant/billing/gateways/monei.rb +307 -0
  116. data/lib/active_merchant/billing/gateways/moneris.rb +119 -36
  117. data/lib/active_merchant/billing/gateways/moneris_us.rb +146 -45
  118. data/lib/active_merchant/billing/gateways/money_movers.rb +152 -0
  119. data/lib/active_merchant/billing/gateways/mundipagg.rb +292 -0
  120. data/lib/active_merchant/billing/gateways/nab_transact.rb +81 -56
  121. data/lib/active_merchant/billing/gateways/ncr_secure_pay.rb +165 -0
  122. data/lib/active_merchant/billing/gateways/net_registry.rb +8 -3
  123. data/lib/active_merchant/billing/gateways/netbanx.rb +289 -0
  124. data/lib/active_merchant/billing/gateways/netbilling.rb +61 -26
  125. data/lib/active_merchant/billing/gateways/netpay.rb +1 -1
  126. data/lib/active_merchant/billing/gateways/network_merchants.rb +242 -0
  127. data/lib/active_merchant/billing/gateways/nmi.rb +265 -10
  128. data/lib/active_merchant/billing/gateways/ogone.rb +85 -27
  129. data/lib/active_merchant/billing/gateways/omise.rb +324 -0
  130. data/lib/active_merchant/billing/gateways/openpay.rb +227 -0
  131. data/lib/active_merchant/billing/gateways/opp.rb +372 -0
  132. data/lib/active_merchant/billing/gateways/optimal_payment.rb +59 -28
  133. data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +22 -21
  134. data/lib/active_merchant/billing/gateways/orbital.rb +346 -56
  135. data/lib/active_merchant/billing/gateways/pac_net_raven.rb +207 -0
  136. data/lib/active_merchant/billing/gateways/pagarme.rb +248 -0
  137. data/lib/active_merchant/billing/gateways/pago_facil.rb +122 -0
  138. data/lib/active_merchant/billing/gateways/pay_conex.rb +246 -0
  139. data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +30 -14
  140. data/lib/active_merchant/billing/gateways/pay_hub.rb +213 -0
  141. data/lib/active_merchant/billing/gateways/pay_junction.rb +19 -25
  142. data/lib/active_merchant/billing/gateways/pay_junction_v2.rb +190 -0
  143. data/lib/active_merchant/billing/gateways/pay_secure.rb +0 -7
  144. data/lib/active_merchant/billing/gateways/paybox_direct.rb +16 -12
  145. data/lib/active_merchant/billing/gateways/payeezy.rb +386 -0
  146. data/lib/active_merchant/billing/gateways/payex.rb +412 -0
  147. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +38 -17
  148. data/lib/active_merchant/billing/gateways/payflow.rb +100 -19
  149. data/lib/active_merchant/billing/gateways/payflow_express.rb +22 -22
  150. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +2 -2
  151. data/lib/active_merchant/billing/gateways/payflow_uk.rb +6 -6
  152. data/lib/active_merchant/billing/gateways/payment_express.rb +15 -3
  153. data/lib/active_merchant/billing/gateways/paymentez.rb +276 -0
  154. data/lib/active_merchant/billing/gateways/paymill.rb +237 -48
  155. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +55 -8
  156. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +4 -0
  157. data/lib/active_merchant/billing/gateways/paypal/paypal_recurring_api.rb +18 -4
  158. data/lib/active_merchant/billing/gateways/paypal.rb +37 -20
  159. data/lib/active_merchant/billing/gateways/paypal_ca.rb +1 -1
  160. data/lib/active_merchant/billing/gateways/paypal_digital_goods.rb +6 -5
  161. data/lib/active_merchant/billing/gateways/paypal_express.rb +32 -4
  162. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +3 -3
  163. data/lib/active_merchant/billing/gateways/payscout.rb +162 -0
  164. data/lib/active_merchant/billing/gateways/paystation.rb +32 -24
  165. data/lib/active_merchant/billing/gateways/payu_in.rb +248 -0
  166. data/lib/active_merchant/billing/gateways/payu_latam.rb +440 -0
  167. data/lib/active_merchant/billing/gateways/pin.rb +68 -13
  168. data/lib/active_merchant/billing/gateways/plugnpay.rb +1 -12
  169. data/lib/active_merchant/billing/gateways/pro_pay.rb +326 -0
  170. data/lib/active_merchant/billing/gateways/psigate.rb +14 -14
  171. data/lib/active_merchant/billing/gateways/psl_card.rb +3 -3
  172. data/lib/active_merchant/billing/gateways/qbms.rb +12 -1
  173. data/lib/active_merchant/billing/gateways/quantum.rb +2 -2
  174. data/lib/active_merchant/billing/gateways/quickbooks.rb +290 -0
  175. data/lib/active_merchant/billing/gateways/quickpay/quickpay_common.rb +188 -0
  176. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb +299 -0
  177. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v4to7.rb +227 -0
  178. data/lib/active_merchant/billing/gateways/quickpay.rb +10 -319
  179. data/lib/active_merchant/billing/gateways/qvalent.rb +236 -0
  180. data/lib/active_merchant/billing/gateways/realex.rb +40 -25
  181. data/lib/active_merchant/billing/gateways/redsys.rb +212 -80
  182. data/lib/active_merchant/billing/gateways/s5.rb +247 -0
  183. data/lib/active_merchant/billing/gateways/safe_charge.rb +262 -0
  184. data/lib/active_merchant/billing/gateways/sage.rb +412 -119
  185. data/lib/active_merchant/billing/gateways/sage_pay.rb +176 -59
  186. data/lib/active_merchant/billing/gateways/secure_net.rb +35 -29
  187. data/lib/active_merchant/billing/gateways/secure_pay.rb +182 -9
  188. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +21 -7
  189. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +0 -7
  190. data/lib/active_merchant/billing/gateways/securion_pay.rb +267 -0
  191. data/lib/active_merchant/billing/gateways/skip_jack.rb +1 -3
  192. data/lib/active_merchant/billing/gateways/smart_ps.rb +14 -3
  193. data/lib/active_merchant/billing/gateways/so_easy_pay.rb +194 -0
  194. data/lib/active_merchant/billing/gateways/spreedly_core.rb +74 -14
  195. data/lib/active_merchant/billing/gateways/stripe.rb +472 -83
  196. data/lib/active_merchant/billing/gateways/swipe_checkout.rb +156 -0
  197. data/lib/active_merchant/billing/gateways/telr.rb +275 -0
  198. data/lib/active_merchant/billing/gateways/tns.rb +22 -0
  199. data/lib/active_merchant/billing/gateways/trans_first.rb +142 -28
  200. data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +608 -0
  201. data/lib/active_merchant/billing/gateways/transact_pro.rb +224 -0
  202. data/lib/active_merchant/billing/gateways/transnational.rb +2 -231
  203. data/lib/active_merchant/billing/gateways/trexle.rb +217 -0
  204. data/lib/active_merchant/billing/gateways/trust_commerce.rb +17 -11
  205. data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +193 -75
  206. data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +156 -64
  207. data/lib/active_merchant/billing/gateways/vanco.rb +294 -0
  208. data/lib/active_merchant/billing/gateways/verifi.rb +1 -8
  209. data/lib/active_merchant/billing/gateways/viaklix.rb +1 -15
  210. data/lib/active_merchant/billing/gateways/visanet_peru.rb +209 -0
  211. data/lib/active_merchant/billing/gateways/webpay.rb +45 -28
  212. data/lib/active_merchant/billing/gateways/wepay.rb +238 -0
  213. data/lib/active_merchant/billing/gateways/wirecard.rb +167 -49
  214. data/lib/active_merchant/billing/gateways/world_net.rb +344 -0
  215. data/lib/active_merchant/billing/gateways/worldpay.rb +171 -45
  216. data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +218 -0
  217. data/lib/active_merchant/billing/gateways/worldpay_us.rb +221 -0
  218. data/lib/active_merchant/billing/gateways.rb +8 -11
  219. data/lib/active_merchant/billing/model.rb +30 -0
  220. data/lib/active_merchant/billing/network_tokenization_credit_card.rb +39 -0
  221. data/lib/active_merchant/billing/payment_token.rb +21 -0
  222. data/lib/active_merchant/billing/rails.rb +3 -0
  223. data/lib/active_merchant/billing/response.rb +24 -17
  224. data/lib/active_merchant/billing.rb +7 -1
  225. data/lib/active_merchant/connection.rb +208 -0
  226. data/lib/active_merchant/country.rb +334 -0
  227. data/lib/active_merchant/empty.rb +20 -0
  228. data/lib/active_merchant/errors.rb +35 -0
  229. data/lib/active_merchant/net_http_ssl_connection.rb +9 -0
  230. data/lib/active_merchant/network_connection_retries.rb +81 -0
  231. data/lib/active_merchant/post_data.rb +24 -0
  232. data/lib/active_merchant/posts_data.rb +94 -0
  233. data/lib/active_merchant/version.rb +1 -1
  234. data/lib/active_merchant.rb +22 -22
  235. data/lib/certs/cacert.pem +3951 -0
  236. data/lib/support/gateway_support.rb +16 -10
  237. data/lib/support/outbound_hosts.rb +13 -10
  238. data/lib/support/ssl_version.rb +87 -0
  239. metadata +164 -306
  240. data/gem-public_cert.pem +0 -20
  241. data/lib/active_merchant/billing/expiry_date.rb +0 -34
  242. data/lib/active_merchant/billing/gateways/barclays_epdq.rb +0 -314
  243. data/lib/active_merchant/billing/gateways/card_stream_modern.rb +0 -155
  244. data/lib/active_merchant/billing/gateways/certo_direct.rb +0 -277
  245. data/lib/active_merchant/billing/gateways/orbital/avs_result.rb +0 -93
  246. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +0 -93
  247. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +0 -114
  248. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +0 -102
  249. data/lib/active_merchant/billing/gateways/samurai.rb +0 -118
  250. data/lib/active_merchant/billing/gateways/vindicia.rb +0 -361
  251. data/lib/active_merchant/billing/integrations/a1agregator/helper.rb +0 -31
  252. data/lib/active_merchant/billing/integrations/a1agregator/notification.rb +0 -186
  253. data/lib/active_merchant/billing/integrations/a1agregator/status.rb +0 -38
  254. data/lib/active_merchant/billing/integrations/a1agregator.rb +0 -26
  255. data/lib/active_merchant/billing/integrations/action_view_helper.rb +0 -73
  256. data/lib/active_merchant/billing/integrations/authorize_net_sim/helper.rb +0 -229
  257. data/lib/active_merchant/billing/integrations/authorize_net_sim/notification.rb +0 -340
  258. data/lib/active_merchant/billing/integrations/authorize_net_sim.rb +0 -38
  259. data/lib/active_merchant/billing/integrations/bogus/helper.rb +0 -17
  260. data/lib/active_merchant/billing/integrations/bogus/notification.rb +0 -11
  261. data/lib/active_merchant/billing/integrations/bogus/return.rb +0 -10
  262. data/lib/active_merchant/billing/integrations/bogus.rb +0 -23
  263. data/lib/active_merchant/billing/integrations/chronopay/helper.rb +0 -120
  264. data/lib/active_merchant/billing/integrations/chronopay/notification.rb +0 -158
  265. data/lib/active_merchant/billing/integrations/chronopay/return.rb +0 -10
  266. data/lib/active_merchant/billing/integrations/chronopay.rb +0 -23
  267. data/lib/active_merchant/billing/integrations/direc_pay/helper.rb +0 -200
  268. data/lib/active_merchant/billing/integrations/direc_pay/notification.rb +0 -76
  269. data/lib/active_merchant/billing/integrations/direc_pay/return.rb +0 -32
  270. data/lib/active_merchant/billing/integrations/direc_pay/status.rb +0 -37
  271. data/lib/active_merchant/billing/integrations/direc_pay.rb +0 -41
  272. data/lib/active_merchant/billing/integrations/directebanking/helper.rb +0 -90
  273. data/lib/active_merchant/billing/integrations/directebanking/notification.rb +0 -120
  274. data/lib/active_merchant/billing/integrations/directebanking/return.rb +0 -11
  275. data/lib/active_merchant/billing/integrations/directebanking.rb +0 -47
  276. data/lib/active_merchant/billing/integrations/dotpay/helper.rb +0 -77
  277. data/lib/active_merchant/billing/integrations/dotpay/notification.rb +0 -86
  278. data/lib/active_merchant/billing/integrations/dotpay/return.rb +0 -11
  279. data/lib/active_merchant/billing/integrations/dotpay.rb +0 -22
  280. data/lib/active_merchant/billing/integrations/dwolla/common.rb +0 -23
  281. data/lib/active_merchant/billing/integrations/dwolla/helper.rb +0 -43
  282. data/lib/active_merchant/billing/integrations/dwolla/notification.rb +0 -64
  283. data/lib/active_merchant/billing/integrations/dwolla/return.rb +0 -49
  284. data/lib/active_merchant/billing/integrations/dwolla.rb +0 -23
  285. data/lib/active_merchant/billing/integrations/e_payment_plans/helper.rb +0 -34
  286. data/lib/active_merchant/billing/integrations/e_payment_plans/notification.rb +0 -84
  287. data/lib/active_merchant/billing/integrations/e_payment_plans.rb +0 -48
  288. data/lib/active_merchant/billing/integrations/easy_pay/common.rb +0 -40
  289. data/lib/active_merchant/billing/integrations/easy_pay/helper.rb +0 -36
  290. data/lib/active_merchant/billing/integrations/easy_pay/notification.rb +0 -59
  291. data/lib/active_merchant/billing/integrations/easy_pay.rb +0 -30
  292. data/lib/active_merchant/billing/integrations/epay/helper.rb +0 -55
  293. data/lib/active_merchant/billing/integrations/epay/notification.rb +0 -110
  294. data/lib/active_merchant/billing/integrations/epay.rb +0 -21
  295. data/lib/active_merchant/billing/integrations/first_data/helper.rb +0 -61
  296. data/lib/active_merchant/billing/integrations/first_data/notification.rb +0 -56
  297. data/lib/active_merchant/billing/integrations/first_data.rb +0 -38
  298. data/lib/active_merchant/billing/integrations/gestpay/common.rb +0 -42
  299. data/lib/active_merchant/billing/integrations/gestpay/helper.rb +0 -70
  300. data/lib/active_merchant/billing/integrations/gestpay/notification.rb +0 -85
  301. data/lib/active_merchant/billing/integrations/gestpay/return.rb +0 -10
  302. data/lib/active_merchant/billing/integrations/gestpay.rb +0 -25
  303. data/lib/active_merchant/billing/integrations/helper.rb +0 -117
  304. data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +0 -58
  305. data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +0 -59
  306. data/lib/active_merchant/billing/integrations/hi_trust/return.rb +0 -68
  307. data/lib/active_merchant/billing/integrations/hi_trust.rb +0 -27
  308. data/lib/active_merchant/billing/integrations/ipay88/helper.rb +0 -114
  309. data/lib/active_merchant/billing/integrations/ipay88/return.rb +0 -95
  310. data/lib/active_merchant/billing/integrations/ipay88.rb +0 -19
  311. data/lib/active_merchant/billing/integrations/liqpay/helper.rb +0 -43
  312. data/lib/active_merchant/billing/integrations/liqpay/notification.rb +0 -89
  313. data/lib/active_merchant/billing/integrations/liqpay/return.rb +0 -83
  314. data/lib/active_merchant/billing/integrations/liqpay.rb +0 -30
  315. data/lib/active_merchant/billing/integrations/maksuturva/helper.rb +0 -119
  316. data/lib/active_merchant/billing/integrations/maksuturva/notification.rb +0 -48
  317. data/lib/active_merchant/billing/integrations/maksuturva.rb +0 -86
  318. data/lib/active_merchant/billing/integrations/moneybookers/helper.rb +0 -75
  319. data/lib/active_merchant/billing/integrations/moneybookers/notification.rb +0 -129
  320. data/lib/active_merchant/billing/integrations/moneybookers.rb +0 -26
  321. data/lib/active_merchant/billing/integrations/nochex/helper.rb +0 -68
  322. data/lib/active_merchant/billing/integrations/nochex/notification.rb +0 -94
  323. data/lib/active_merchant/billing/integrations/nochex/return.rb +0 -10
  324. data/lib/active_merchant/billing/integrations/nochex.rb +0 -88
  325. data/lib/active_merchant/billing/integrations/notification.rb +0 -71
  326. data/lib/active_merchant/billing/integrations/paxum/common.rb +0 -24
  327. data/lib/active_merchant/billing/integrations/paxum/helper.rb +0 -42
  328. data/lib/active_merchant/billing/integrations/paxum/notification.rb +0 -33
  329. data/lib/active_merchant/billing/integrations/paxum.rb +0 -44
  330. data/lib/active_merchant/billing/integrations/pay_fast/common.rb +0 -42
  331. data/lib/active_merchant/billing/integrations/pay_fast/helper.rb +0 -50
  332. data/lib/active_merchant/billing/integrations/pay_fast/notification.rb +0 -134
  333. data/lib/active_merchant/billing/integrations/pay_fast/return.rb +0 -10
  334. data/lib/active_merchant/billing/integrations/pay_fast.rb +0 -70
  335. data/lib/active_merchant/billing/integrations/payflow_link/helper.rb +0 -116
  336. data/lib/active_merchant/billing/integrations/payflow_link/notification.rb +0 -78
  337. data/lib/active_merchant/billing/integrations/payflow_link.rb +0 -21
  338. data/lib/active_merchant/billing/integrations/paypal/helper.rb +0 -119
  339. data/lib/active_merchant/billing/integrations/paypal/notification.rb +0 -227
  340. data/lib/active_merchant/billing/integrations/paypal/return.rb +0 -10
  341. data/lib/active_merchant/billing/integrations/paypal.rb +0 -39
  342. data/lib/active_merchant/billing/integrations/paypal_payments_advanced/helper.rb +0 -15
  343. data/lib/active_merchant/billing/integrations/paypal_payments_advanced.rb +0 -20
  344. data/lib/active_merchant/billing/integrations/paysbuy/helper.rb +0 -15
  345. data/lib/active_merchant/billing/integrations/paysbuy/notification.rb +0 -28
  346. data/lib/active_merchant/billing/integrations/paysbuy.rb +0 -36
  347. data/lib/active_merchant/billing/integrations/payu_in/helper.rb +0 -74
  348. data/lib/active_merchant/billing/integrations/payu_in/notification.rb +0 -165
  349. data/lib/active_merchant/billing/integrations/payu_in/return.rb +0 -36
  350. data/lib/active_merchant/billing/integrations/payu_in.rb +0 -43
  351. data/lib/active_merchant/billing/integrations/platron/helper.rb +0 -32
  352. data/lib/active_merchant/billing/integrations/platron/notification.rb +0 -113
  353. data/lib/active_merchant/billing/integrations/platron.rb +0 -28
  354. data/lib/active_merchant/billing/integrations/pxpay/helper.rb +0 -112
  355. data/lib/active_merchant/billing/integrations/pxpay/notification.rb +0 -157
  356. data/lib/active_merchant/billing/integrations/pxpay/return.rb +0 -25
  357. data/lib/active_merchant/billing/integrations/pxpay.rb +0 -31
  358. data/lib/active_merchant/billing/integrations/quickpay/helper.rb +0 -74
  359. data/lib/active_merchant/billing/integrations/quickpay/notification.rb +0 -137
  360. data/lib/active_merchant/billing/integrations/quickpay.rb +0 -21
  361. data/lib/active_merchant/billing/integrations/rbkmoney/helper.rb +0 -23
  362. data/lib/active_merchant/billing/integrations/rbkmoney/notification.rb +0 -91
  363. data/lib/active_merchant/billing/integrations/rbkmoney.rb +0 -17
  364. data/lib/active_merchant/billing/integrations/return.rb +0 -42
  365. data/lib/active_merchant/billing/integrations/robokassa/common.rb +0 -19
  366. data/lib/active_merchant/billing/integrations/robokassa/helper.rb +0 -50
  367. data/lib/active_merchant/billing/integrations/robokassa/notification.rb +0 -55
  368. data/lib/active_merchant/billing/integrations/robokassa/return.rb +0 -17
  369. data/lib/active_merchant/billing/integrations/robokassa.rb +0 -49
  370. data/lib/active_merchant/billing/integrations/sage_pay_form/encryption.rb +0 -33
  371. data/lib/active_merchant/billing/integrations/sage_pay_form/helper.rb +0 -136
  372. data/lib/active_merchant/billing/integrations/sage_pay_form/notification.rb +0 -210
  373. data/lib/active_merchant/billing/integrations/sage_pay_form/return.rb +0 -31
  374. data/lib/active_merchant/billing/integrations/sage_pay_form.rb +0 -37
  375. data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +0 -91
  376. data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +0 -139
  377. data/lib/active_merchant/billing/integrations/two_checkout/return.rb +0 -17
  378. data/lib/active_merchant/billing/integrations/two_checkout.rb +0 -44
  379. data/lib/active_merchant/billing/integrations/valitor/helper.rb +0 -86
  380. data/lib/active_merchant/billing/integrations/valitor/notification.rb +0 -13
  381. data/lib/active_merchant/billing/integrations/valitor/response_fields.rb +0 -97
  382. data/lib/active_merchant/billing/integrations/valitor/return.rb +0 -13
  383. data/lib/active_merchant/billing/integrations/valitor.rb +0 -33
  384. data/lib/active_merchant/billing/integrations/verkkomaksut/helper.rb +0 -88
  385. data/lib/active_merchant/billing/integrations/verkkomaksut/notification.rb +0 -59
  386. data/lib/active_merchant/billing/integrations/verkkomaksut.rb +0 -20
  387. data/lib/active_merchant/billing/integrations/web_pay/common.rb +0 -50
  388. data/lib/active_merchant/billing/integrations/web_pay/helper.rb +0 -68
  389. data/lib/active_merchant/billing/integrations/web_pay/notification.rb +0 -51
  390. data/lib/active_merchant/billing/integrations/web_pay.rb +0 -45
  391. data/lib/active_merchant/billing/integrations/webmoney/common.rb +0 -17
  392. data/lib/active_merchant/billing/integrations/webmoney/helper.rb +0 -40
  393. data/lib/active_merchant/billing/integrations/webmoney/notification.rb +0 -47
  394. data/lib/active_merchant/billing/integrations/webmoney.rb +0 -43
  395. data/lib/active_merchant/billing/integrations/world_pay/helper.rb +0 -101
  396. data/lib/active_merchant/billing/integrations/world_pay/notification.rb +0 -160
  397. data/lib/active_merchant/billing/integrations/world_pay.rb +0 -34
  398. data/lib/active_merchant/billing/integrations.rb +0 -17
  399. data.tar.gz.sig +0 -0
  400. metadata.gz.sig +0 -0
@@ -2,7 +2,7 @@ module ActiveMerchant #:nodoc:
2
2
  module Billing #:nodoc:
3
3
  class MerchantWareVersionFourGateway < Gateway
4
4
  self.live_url = 'https://ps1.merchantware.net/Merchantware/ws/RetailTransaction/v4/Credit.asmx'
5
- self.test_url = 'https://staging.merchantware.net/Merchantware/ws/RetailTransaction/v4/Credit.asmx'
5
+ self.test_url = 'https://ps1.merchantware.net/Merchantware/ws/RetailTransaction/v4/Credit.asmx'
6
6
 
7
7
  self.supported_countries = ['US']
8
8
  self.supported_cardtypes = [:visa, :master, :american_express, :discover]
@@ -20,7 +20,7 @@ module ActiveMerchant #:nodoc:
20
20
  :reference_purchase => 'RepeatSale',
21
21
  :authorize => "PreAuthorizationKeyed",
22
22
  :capture => "PostAuthorization",
23
- :void => "VoidPreAuthorization",
23
+ :void => "Void",
24
24
  :refund => "Refund"
25
25
  }
26
26
 
@@ -108,6 +108,24 @@ module ActiveMerchant #:nodoc:
108
108
  commit(:refund, request)
109
109
  end
110
110
 
111
+ def verify(credit_card, options={})
112
+ MultiResponse.run(:use_first_response) do |r|
113
+ r.process { authorize(100, credit_card, options) }
114
+ r.process(:ignore_result) { void(r.authorization, options) }
115
+ end
116
+ end
117
+
118
+ def supports_scrubbing?
119
+ true
120
+ end
121
+
122
+ def scrub(transcript)
123
+ transcript.
124
+ gsub(%r((<merchantKey>).+?(</merchantKey>))i, '\1[FILTERED]\2').
125
+ gsub(%r((<cardNumber>).+?(</cardNumber>))i, '\1[FILTERED]\2').
126
+ gsub(%r((<cardSecurityCode>).+?(</cardSecurityCode>))i, '\1[FILTERED]\2')
127
+ end
128
+
111
129
  private
112
130
 
113
131
  def soap_request(action)
@@ -129,7 +147,7 @@ module ActiveMerchant #:nodoc:
129
147
  def build_purchase_request(action, money, payment_source, options)
130
148
  requires!(options, :order_id)
131
149
 
132
- request = soap_request(action) do |xml|
150
+ soap_request(action) do |xml|
133
151
  add_invoice(xml, options)
134
152
  add_amount(xml, money)
135
153
  add_payment_source(xml, payment_source)
@@ -140,22 +158,15 @@ module ActiveMerchant #:nodoc:
140
158
  def build_capture_request(action, money, identification, options)
141
159
  reference, options[:order_id] = split_reference(identification)
142
160
 
143
- request = soap_request(action) do |xml|
161
+ soap_request(action) do |xml|
144
162
  add_reference_token(xml, reference)
145
163
  add_invoice(xml, options)
146
164
  add_amount(xml, money)
147
165
  end
148
166
  end
149
167
 
150
- def expdate(credit_card)
151
- year = sprintf("%.4i", credit_card.year)
152
- month = sprintf("%.2i", credit_card.month)
153
-
154
- "#{month}#{year[-2..-1]}"
155
- end
156
-
157
168
  def add_invoice(xml, options)
158
- xml.tag! "invoiceNumber", options[:order_id].to_s.gsub(/[^\w]/, '').slice(0, 25)
169
+ xml.tag! "invoiceNumber", truncate(options[:order_id].to_s.gsub(/[^\w]/, ''), 8)
159
170
  end
160
171
 
161
172
  def add_amount(xml, money, tag = "amount")
@@ -234,7 +245,7 @@ module ActiveMerchant #:nodoc:
234
245
 
235
246
  response[:message] = response["ErrorMessage"].to_s.gsub("\n", " ")
236
247
  response
237
- rescue REXML::ParseException => e
248
+ rescue REXML::ParseException
238
249
  response[:http_body] = http_response.body
239
250
  response[:message] = "Failed to parse the failed response"
240
251
  response
@@ -12,9 +12,9 @@ module ActiveMerchant #:nodoc:
12
12
 
13
13
  self.supported_countries = ['AU']
14
14
  self.supported_cardtypes = [:visa, :master, :american_express,
15
- :diners_club, :discover]
16
- self.homepage_url = 'http://www.merchantwarrior.com/'
17
- self.display_name = 'MerchantWarrior'
15
+ :diners_club, :discover, :jcb]
16
+ self.homepage_url = 'https://www.merchantwarrior.com/'
17
+ self.display_name = 'Merchant Warrior'
18
18
 
19
19
  self.money_format = :dollars
20
20
  self.default_currency = 'AUD'
@@ -27,7 +27,7 @@ module ActiveMerchant #:nodoc:
27
27
  def authorize(money, payment_method, options = {})
28
28
  post = {}
29
29
  add_amount(post, money, options)
30
- add_product(post, options)
30
+ add_order_id(post, options)
31
31
  add_address(post, options)
32
32
  add_payment_method(post, payment_method)
33
33
  commit('processAuth', post)
@@ -36,13 +36,13 @@ module ActiveMerchant #:nodoc:
36
36
  def purchase(money, payment_method, options = {})
37
37
  post = {}
38
38
  add_amount(post, money, options)
39
- add_product(post, options)
39
+ add_order_id(post, options)
40
40
  add_address(post, options)
41
41
  add_payment_method(post, payment_method)
42
42
  commit('processCard', post)
43
43
  end
44
44
 
45
- def capture(money, identification)
45
+ def capture(money, identification, options = {})
46
46
  post = {}
47
47
  add_amount(post, money, options)
48
48
  add_transaction(post, identification)
@@ -50,7 +50,7 @@ module ActiveMerchant #:nodoc:
50
50
  commit('processCapture', post)
51
51
  end
52
52
 
53
- def refund(money, identification)
53
+ def refund(money, identification, options = {})
54
54
  post = {}
55
55
  add_amount(post, money, options)
56
56
  add_transaction(post, identification)
@@ -60,7 +60,7 @@ module ActiveMerchant #:nodoc:
60
60
 
61
61
  def store(creditcard, options = {})
62
62
  post = {
63
- 'cardName' => creditcard.name,
63
+ 'cardName' => scrub_name(creditcard.name),
64
64
  'cardNumber' => creditcard.number,
65
65
  'cardExpiryMonth' => format(creditcard.month, :two_digits),
66
66
  'cardExpiryYear' => format(creditcard.year, :two_digits)
@@ -68,6 +68,18 @@ module ActiveMerchant #:nodoc:
68
68
  commit('addCard', post)
69
69
  end
70
70
 
71
+ def supports_scrubbing?
72
+ true
73
+ end
74
+
75
+ def scrub(transcript)
76
+ transcript.
77
+ gsub(%r((&?paymentCardNumber=)[^&]*)i, '\1[FILTERED]').
78
+ gsub(%r((CardNumber=)[^&]*)i, '\1[FILTERED]').
79
+ gsub(%r((&?paymentCardCSC=)[^&]*)i, '\1[FILTERED]').
80
+ gsub(%r((&?apiKey=)[^&]*)i, '\1[FILTERED]')
81
+ end
82
+
71
83
  private
72
84
 
73
85
  def add_transaction(post, identification)
@@ -75,18 +87,21 @@ module ActiveMerchant #:nodoc:
75
87
  end
76
88
 
77
89
  def add_address(post, options)
78
- return unless(address = options[:address])
90
+ return unless(address = (options[:billing_address] || options[:address]))
79
91
 
80
- post['customerName'] = address[:name]
92
+ post['customerName'] = scrub_name(address[:name])
81
93
  post['customerCountry'] = address[:country]
82
- post['customerState'] = address[:state]
94
+ post['customerState'] = address[:state] || 'N/A'
83
95
  post['customerCity'] = address[:city]
84
96
  post['customerAddress'] = address[:address1]
85
97
  post['customerPostCode'] = address[:zip]
98
+ post['customerIP'] = address[:ip]
99
+ post['customerPhone'] = address[:phone]
100
+ post['customerEmail'] = address[:email]
86
101
  end
87
102
 
88
- def add_product(post, options)
89
- post['transactionProduct'] = options[:transaction_product]
103
+ def add_order_id(post, options)
104
+ post['transactionProduct'] = truncate(options[:order_id], 34) || SecureRandom.hex(15)
90
105
  end
91
106
 
92
107
  def add_payment_method(post, payment_method)
@@ -103,11 +118,15 @@ module ActiveMerchant #:nodoc:
103
118
 
104
119
  def add_creditcard(post, creditcard)
105
120
  post['paymentCardNumber'] = creditcard.number
106
- post['paymentCardName'] = creditcard.name
121
+ post['paymentCardName'] = scrub_name(creditcard.name)
107
122
  post['paymentCardExpiry'] = creditcard.expiry_date.expiration.strftime("%m%y")
108
123
  post['paymentCardCSC'] = creditcard.verification_value if creditcard.verification_value?
109
124
  end
110
125
 
126
+ def scrub_name(name)
127
+ name.gsub(/[^a-zA-Z\. -]/, '')
128
+ end
129
+
111
130
  def add_amount(post, money, options)
112
131
  currency = (options[:currency] || currency(money))
113
132
 
@@ -12,16 +12,22 @@ module ActiveMerchant #:nodoc:
12
12
  # and +refund+ will become mandatory.
13
13
  class MercuryGateway < Gateway
14
14
  URLS = {
15
- :test => 'https://w1.mercurydev.net/ws/ws.asmx',
15
+ :test => 'https://w1.mercurycert.net/ws/ws.asmx',
16
16
  :live => 'https://w1.mercurypay.com/ws/ws.asmx'
17
17
  }
18
18
 
19
19
  self.homepage_url = 'http://www.mercurypay.com'
20
20
  self.display_name = 'Mercury'
21
- self.supported_countries = ['US']
21
+ self.supported_countries = ['US','CA']
22
22
  self.supported_cardtypes = [:visa, :master, :american_express, :discover, :diners_club, :jcb]
23
23
  self.default_currency = 'USD'
24
24
 
25
+ STANDARD_ERROR_CODE_MAPPING = {
26
+ '100204' => STANDARD_ERROR_CODE[:invalid_number],
27
+ '100205' => STANDARD_ERROR_CODE[:invalid_expiry_date],
28
+ '000000' => STANDARD_ERROR_CODE[:card_declined]
29
+ }
30
+
25
31
  def initialize(options = {})
26
32
  requires!(options, :login, :password)
27
33
  @use_tokenization = (!options.has_key?(:tokenization) || options[:tokenization])
@@ -66,17 +72,28 @@ module ActiveMerchant #:nodoc:
66
72
  def void(authorization, options={})
67
73
  requires!(options, :credit_card) unless @use_tokenization
68
74
 
69
- if options[:try_reversal]
70
- request = build_authorized_request('VoidSale', nil, authorization, options[:credit_card], options.merge(:reversal => true))
71
- response = commit('VoidSale', request)
72
-
73
- return response if response.success?
74
- end
75
-
76
75
  request = build_authorized_request('VoidSale', nil, authorization, options[:credit_card], options)
77
76
  commit('VoidSale', request)
78
77
  end
79
78
 
79
+ def store(credit_card, options={})
80
+ request = build_card_lookup_request(credit_card, options)
81
+ commit('CardLookup', request)
82
+ end
83
+
84
+ def supports_scrubbing?
85
+ true
86
+ end
87
+
88
+ def scrub(transcript)
89
+ transcript.
90
+ gsub(%r(&lt;), "<").
91
+ gsub(%r(&gt;), ">").
92
+ gsub(%r((<pw>).*(</pw>))i, '\1[FILTERED]\2').
93
+ gsub(%r((<AcctNo>)(\d|x)*(</AcctNo>))i, '\1[FILTERED]\3').
94
+ gsub(%r((<CVVData>)\d*(</CVVData>))i, '\1[FILTERED]\2')
95
+ end
96
+
80
97
  private
81
98
 
82
99
  def build_non_authorized_request(action, money, credit_card, options)
@@ -86,7 +103,7 @@ module ActiveMerchant #:nodoc:
86
103
  xml.tag! "Transaction" do
87
104
  xml.tag! 'TranType', 'Credit'
88
105
  xml.tag! 'TranCode', action
89
- if action == 'PreAuth' || action == 'Sale'
106
+ if options[:allow_partial_auth] && (action == 'PreAuth' || action == 'Sale')
90
107
  xml.tag! "PartialAuth", "Allow"
91
108
  end
92
109
  add_invoice(xml, options[:order_id], nil, options)
@@ -94,7 +111,7 @@ module ActiveMerchant #:nodoc:
94
111
  add_customer_data(xml, options)
95
112
  add_amount(xml, money, options)
96
113
  add_credit_card(xml, credit_card, action)
97
- add_address(xml, options)
114
+ add_address(xml, options) unless credit_card.track_data.present?
98
115
  end
99
116
  end
100
117
  xml = xml.target!
@@ -104,12 +121,12 @@ module ActiveMerchant #:nodoc:
104
121
  xml = Builder::XmlMarkup.new
105
122
 
106
123
  invoice_no, ref_no, auth_code, acq_ref_data, process_data, record_no, amount = split_authorization(authorization)
107
- ref_no = invoice_no if options[:reversal]
124
+ ref_no = "1" if ref_no.blank?
108
125
 
109
126
  xml.tag! "TStream" do
110
127
  xml.tag! "Transaction" do
111
128
  xml.tag! 'TranType', 'Credit'
112
- if action == 'PreAuthCapture'
129
+ if options[:allow_partial_auth] && (action == 'PreAuthCapture')
113
130
  xml.tag! "PartialAuth", "Allow"
114
131
  end
115
132
  xml.tag! 'TranCode', (@use_tokenization ? (action + "ByRecordNo") : action)
@@ -121,19 +138,32 @@ module ActiveMerchant #:nodoc:
121
138
  add_address(xml, options)
122
139
  xml.tag! 'TranInfo' do
123
140
  xml.tag! "AuthCode", auth_code
124
- xml.tag! "AcqRefData", acq_ref_data if options[:reversal]
125
- xml.tag! "ProcessData", process_data if options[:reversal]
141
+ xml.tag! "AcqRefData", acq_ref_data
142
+ xml.tag! "ProcessData", process_data
126
143
  end
127
144
  end
128
145
  end
129
146
  xml = xml.target!
130
147
  end
131
148
 
132
- def add_invoice(xml, invoice_no, ref_no, options)
133
- if /^\d+$/ !~ invoice_no.to_s
134
- raise ArgumentError.new("order_id '#{invoice_no}' is not numeric as required by Mercury")
149
+ def build_card_lookup_request(credit_card, options)
150
+ xml = Builder::XmlMarkup.new
151
+
152
+ xml.tag! "TStream" do
153
+ xml.tag! "Transaction" do
154
+ xml.tag! 'TranType', 'CardLookup'
155
+ xml.tag! 'RecordNo', 'RecordNumberRequested'
156
+ xml.tag! 'Frequency', 'OneTime'
157
+
158
+ xml.tag! 'Memo', options[:description]
159
+ add_customer_data(xml, options)
160
+ add_credit_card(xml, credit_card, options)
161
+ end
135
162
  end
163
+ xml.target!
164
+ end
136
165
 
166
+ def add_invoice(xml, invoice_no, ref_no, options)
137
167
  xml.tag! 'InvoiceNo', invoice_no
138
168
  xml.tag! 'RefNo', (ref_no || invoice_no)
139
169
  xml.tag! 'OperatorID', options[:merchant] if options[:merchant]
@@ -177,22 +207,36 @@ module ActiveMerchant #:nodoc:
177
207
 
178
208
  def add_credit_card(xml, credit_card, action)
179
209
  xml.tag! 'Account' do
180
- xml.tag! 'AcctNo', credit_card.number
181
- xml.tag! 'ExpDate', expdate(credit_card)
210
+ if credit_card.track_data.present?
211
+ # Track 1 has a start sentinel (STX) of '%' and track 2 is ';'
212
+ # Track 1 and 2 have identical end sentinels (ETX) of '?'
213
+ # Tracks may or may not have checksum (LRC) after the ETX
214
+ # If the track has no STX or is corrupt, we send it as track 1, to let Mercury
215
+ #handle with the validation error as it sees fit.
216
+ # Track 2 requires having the STX and ETX stripped. Track 1 does not.
217
+ # Max-length track 1s require having the STX and ETX stripped. Max is 79 bytes including LRC.
218
+ is_track_2 = credit_card.track_data[0] == ';'
219
+ etx_index = credit_card.track_data.rindex('?') || credit_card.track_data.length
220
+ is_max_track1 = etx_index >= 77
221
+
222
+ if is_track_2
223
+ xml.tag! 'Track2', credit_card.track_data[1...etx_index]
224
+ elsif is_max_track1
225
+ xml.tag! 'Track1', credit_card.track_data[1...etx_index]
226
+ else
227
+ xml.tag! 'Track1', credit_card.track_data
228
+ end
229
+ else
230
+ xml.tag! 'AcctNo', credit_card.number
231
+ xml.tag! 'ExpDate', expdate(credit_card)
232
+ end
182
233
  end
183
234
  xml.tag! 'CardType', CARD_CODES[credit_card.brand] if credit_card.brand
184
235
 
185
- include_cvv = !%w(Return PreAuthCapture).include?(action)
236
+ include_cvv = !%w(Return PreAuthCapture).include?(action) && !credit_card.track_data.present?
186
237
  xml.tag! 'CVVData', credit_card.verification_value if(include_cvv && credit_card.verification_value)
187
238
  end
188
239
 
189
- def expdate(credit_card)
190
- year = sprintf("%.4i", credit_card.year)
191
- month = sprintf("%.2i", credit_card.month)
192
-
193
- "#{month}#{year[-2..-1]}"
194
- end
195
-
196
240
  def add_address(xml, options)
197
241
  if billing_address = options[:billing_address] || options[:address]
198
242
  xml.tag! 'AVS' do
@@ -266,7 +310,8 @@ module ActiveMerchant #:nodoc:
266
310
  :test => test?,
267
311
  :authorization => authorization_from(response),
268
312
  :avs_result => { :code => response[:avs_result] },
269
- :cvv_result => response[:cvv_result])
313
+ :cvv_result => response[:cvv_result],
314
+ :error_code => success ? nil : STANDARD_ERROR_CODE_MAPPING[response[:dsix_return_code]])
270
315
  end
271
316
 
272
317
  def message_from(response)
@@ -150,7 +150,7 @@ module ActiveMerchant #:nodoc:
150
150
  end
151
151
 
152
152
  def credit(money, identification, options = {})
153
- deprecated CREDIT_DEPRECATION_MESSAGE
153
+ ActiveMerchant.deprecated CREDIT_DEPRECATION_MESSAGE
154
154
  refund(money, identification, options)
155
155
  end
156
156
 
@@ -218,7 +218,7 @@ module ActiveMerchant #:nodoc:
218
218
  post[:delim_data] = "TRUE"
219
219
  post[:delim_char] = ","
220
220
  post[:encap_char] = "$"
221
- post[:solution_ID] = application_id if application_id.present? && application_id != "ActiveMerchant"
221
+ post[:solution_ID] = application_id if application_id
222
222
 
223
223
  request = post.merge(parameters).collect { |key, value| "x_#{key}=#{CGI.escape(value.to_s)}" }.join("&")
224
224
  request
@@ -284,17 +284,6 @@ module ActiveMerchant #:nodoc:
284
284
  end
285
285
  end
286
286
 
287
- # Make a ruby type out of the response string
288
- def normalize(field)
289
- case field
290
- when "true" then true
291
- when "false" then false
292
- when "" then nil
293
- when "null" then nil
294
- else field
295
- end
296
- end
297
-
298
287
  def message_from(results)
299
288
  if results[:response_code] == DECLINED
300
289
  return CVVResult.messages[ results[:card_code] ] if CARD_CODE_ERRORS.include?(results[:card_code])
@@ -306,17 +295,9 @@ module ActiveMerchant #:nodoc:
306
295
  (results[:response_reason_text] ? results[:response_reason_text].chomp('.') : '')
307
296
  end
308
297
 
309
- def expdate(creditcard)
310
- year = sprintf("%.4i", creditcard.year)
311
- month = sprintf("%.2i", creditcard.month)
312
-
313
- "#{month}#{year[-2..-1]}"
314
- end
315
-
316
298
  def split(response)
317
299
  response[1..-2].split(/\$,\$/)
318
300
  end
319
-
320
301
  end
321
302
  end
322
303
  end
@@ -0,0 +1,185 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class MicropaymentGateway < Gateway
4
+
5
+ self.display_name = "micropayment"
6
+ self.homepage_url = "https://www.micropayment.de/"
7
+
8
+ self.test_url = self.live_url = "https://sipg.micropayment.de/public/creditcardpsp/v1/nvp/"
9
+
10
+ self.supported_countries = %w(DE)
11
+ self.default_currency = "EUR"
12
+ self.money_format = :cents
13
+ self.supported_cardtypes = [:visa, :master, :american_express]
14
+
15
+
16
+ def initialize(options={})
17
+ requires!(options, :access_key)
18
+ super
19
+ end
20
+
21
+ def purchase(amount, payment_method, options={})
22
+ post = {}
23
+ add_invoice(post, amount, options)
24
+ add_payment_method(post, payment_method, options)
25
+ add_customer_data(post, options)
26
+ add_address(post, options)
27
+ commit("purchase", post)
28
+ end
29
+
30
+ def authorize(amount, payment_method, options={})
31
+ post = {}
32
+ add_invoice(post, amount, options)
33
+ add_payment_method(post, payment_method, options)
34
+ add_customer_data(post, options)
35
+ add_address(post, options)
36
+ commit("authorize", post)
37
+ end
38
+
39
+ def capture(amount, authorization, options={})
40
+ post = {}
41
+ add_reference(post, authorization)
42
+ add_invoice(post, amount, options)
43
+ commit("capture", post)
44
+ end
45
+
46
+ def void(authorization, options={})
47
+ post = {}
48
+ add_reference(post, authorization)
49
+ commit("void", post)
50
+ end
51
+
52
+ def refund(amount, authorization, options={})
53
+ post = {}
54
+ add_reference(post, authorization)
55
+ add_invoice(post, amount, options)
56
+ commit("refund", post)
57
+ end
58
+
59
+ def verify(credit_card, options={})
60
+
61
+ MultiResponse.run(:use_first_response) do |r|
62
+ r.process { authorize(250, credit_card, options) }
63
+ r.process(:ignore_result) { void(r.authorization, options) }
64
+ end
65
+ end
66
+
67
+ def supports_scrubbing?
68
+ true
69
+ end
70
+
71
+ def scrub(transcript)
72
+ transcript.
73
+ gsub(%r((accessKey=)\w+), '\1[FILTERED]').
74
+ gsub(%r((number=)\d+), '\1[FILTERED]').
75
+ gsub(%r((cvc2=)\d+), '\1[FILTERED]')
76
+ end
77
+
78
+ private
79
+
80
+ def add_invoice(post, money, options)
81
+ if money
82
+ post[:amount] = amount(money)
83
+ post[:currency] = options[:currency] || currency(money)
84
+ end
85
+ post[:project] = options[:project] if options[:project]
86
+ post["params[title]"] = options[:description] if options[:description]
87
+ end
88
+
89
+ def add_payment_method(post, payment_method, options={})
90
+ post[:number] = payment_method.number
91
+ post[:recurring] = 1 if options[:recurring] == true
92
+ post[:cvc2] = payment_method.verification_value
93
+ post[:expiryYear] = format(payment_method.year, :four_digits)
94
+ post[:expiryMonth] = format(payment_method.month, :two_digits)
95
+
96
+ post["params[firstname]"] = payment_method.first_name
97
+ post["params[surname]"] = payment_method.last_name
98
+ end
99
+
100
+ def add_customer_data(post, options)
101
+ post["params[email]"] = options[:email] if options[:email]
102
+ post["params[ip]"] = options[:ip] || "1.1.1.1"
103
+ post["params[sendMail]"] = options[:send_mail] || 'false'
104
+ end
105
+
106
+ def add_address(post, options)
107
+ address = options[:billing_address]
108
+ return unless address
109
+
110
+ post["params[address]"] = address[:address1] if address[:address1]
111
+ post["params[zipcode]"] = address[:zip] if address[:zip]
112
+ post["params[town]"] = address[:city] if address[:city]
113
+ post["params[country]"] = address[:country] if address[:country]
114
+ end
115
+
116
+ def add_reference(post, authorization)
117
+ session_id, transaction_id = split_authorization(authorization)
118
+ post[:sessionId] = session_id
119
+ post[:transactionId] = transaction_id
120
+ end
121
+
122
+ def commit(action, params)
123
+ params[:testMode] = 1 if test?
124
+ params[:accessKey] = @options[:access_key]
125
+ params[:apiKey] = @options[:api_key] || "af1fd841af792f4c50131414ff76e004"
126
+
127
+ response = parse(ssl_post(url(action), post_data(action, params), headers))
128
+
129
+ Response.new(
130
+ succeeded = success_from(response),
131
+ message_from(succeeded, response),
132
+ response,
133
+ authorization: authorization_from(response, params),
134
+ avs_result: AVSResult.new(code: response["some_avs_result_key"]),
135
+ cvv_result: CVVResult.new(response["some_cvv_result_key"]),
136
+ test: test?
137
+ )
138
+ end
139
+
140
+ def headers
141
+ { "Content-Type" => "application/x-www-form-urlencoded;charset=UTF-8" }
142
+ end
143
+
144
+ def post_data(action, params)
145
+ params.map {|k, v| "#{CGI.escape(k.to_s)}=#{CGI.escape(v.to_s)}"}.join('&')
146
+ end
147
+
148
+ def url(action)
149
+ action_url = test? ? test_url : live_url
150
+ "#{action_url}?action=#{action}"
151
+ end
152
+
153
+ def parse(body)
154
+ body.split(/\r?\n/).inject({}) do |acc, pair|
155
+ key, value = pair.split("=")
156
+ acc[key] = CGI.unescape(value)
157
+ acc
158
+ end
159
+ end
160
+
161
+ def success_from(response)
162
+ response["error"] == "0" &&
163
+ response["transactionResultCode"] == "00" &&
164
+ response["transactionStatus"] == "SUCCESS"
165
+ end
166
+
167
+ def message_from(succeeded, response)
168
+ if succeeded
169
+ "Succeeded"
170
+ else
171
+ response["errorMessage"] || response["transactionResultMessage"]
172
+ end
173
+ end
174
+
175
+ def split_authorization(authorization)
176
+ authorization.split("|")
177
+ end
178
+
179
+ def authorization_from(response, request_params)
180
+ session_id = response["sessionId"] ? response["sessionId"] : request_params[:sessionId]
181
+ "#{session_id}|#{response["transactionId"]}"
182
+ end
183
+ end
184
+ end
185
+ end