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,237 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class WepayGateway < Gateway
4
+ self.test_url = 'https://stage.wepayapi.com/v2'
5
+ self.live_url = 'https://wepayapi.com/v2'
6
+
7
+ self.supported_countries = ['US', 'CA']
8
+ self.supported_cardtypes = [:visa, :master, :american_express, :discover]
9
+ self.homepage_url = 'https://www.wepay.com/'
10
+ self.default_currency = 'USD'
11
+ self.display_name = 'WePay'
12
+
13
+ def initialize(options = {})
14
+ requires!(options, :client_id, :account_id, :access_token)
15
+ super(options)
16
+ end
17
+
18
+ def purchase(money, payment_method, options = {})
19
+ post = {}
20
+ if payment_method.is_a?(String)
21
+ MultiResponse.run do |r|
22
+ r.process { authorize_with_token(post, money, payment_method, options) }
23
+ r.process { capture(money, r.authorization, options) }
24
+ end
25
+ else
26
+ MultiResponse.run do |r|
27
+ r.process { store(payment_method, options) }
28
+ r.process { authorize_with_token(post, money, r.authorization, options) }
29
+ r.process { capture(money, r.authorization, options) }
30
+ end
31
+ end
32
+ end
33
+
34
+ def authorize(money, payment_method, options = {})
35
+ post = {}
36
+ if payment_method.is_a?(String)
37
+ authorize_with_token(post, money, payment_method, options)
38
+ else
39
+ MultiResponse.run do |r|
40
+ r.process { store(payment_method, options) }
41
+ r.process { authorize_with_token(post, money, r.authorization, options) }
42
+ end
43
+ end
44
+ end
45
+
46
+ def capture(money, identifier, options = {})
47
+ checkout_id, original_amount = split_authorization(identifier)
48
+
49
+ post = {}
50
+ post[:checkout_id] = checkout_id
51
+ if(money && (original_amount != amount(money)))
52
+ post[:amount] = amount(money)
53
+ end
54
+ commit('/checkout/capture', post, options)
55
+ end
56
+
57
+ def void(identifier, options = {})
58
+ post = {}
59
+ post[:checkout_id] = split_authorization(identifier).first
60
+ post[:cancel_reason] = (options[:description] || 'Void')
61
+ commit('/checkout/cancel', post, options)
62
+ end
63
+
64
+ def refund(money, identifier, options = {})
65
+ checkout_id, original_amount = split_authorization(identifier)
66
+
67
+ post = {}
68
+ post[:checkout_id] = checkout_id
69
+ if(money && (original_amount != amount(money)))
70
+ post[:amount] = amount(money)
71
+ end
72
+ post[:refund_reason] = (options[:description] || 'Refund')
73
+ post[:payer_email_message] = options[:payer_email_message] if options[:payer_email_message]
74
+ post[:payee_email_message] = options[:payee_email_message] if options[:payee_email_message]
75
+ commit('/checkout/refund', post, options)
76
+ end
77
+
78
+ def store(creditcard, options = {})
79
+ post = {}
80
+ post[:client_id] = @options[:client_id]
81
+ post[:user_name] = "#{creditcard.first_name} #{creditcard.last_name}"
82
+ post[:email] = options[:email] || 'unspecified@example.com'
83
+ post[:cc_number] = creditcard.number
84
+ post[:cvv] = creditcard.verification_value unless options[:recurring]
85
+ post[:expiration_month] = creditcard.month
86
+ post[:expiration_year] = creditcard.year
87
+
88
+ if(billing_address = (options[:billing_address] || options[:address]))
89
+ post[:address] = {}
90
+ post[:address]['address1'] = billing_address[:address1] if billing_address[:address1]
91
+ post[:address]['city'] = billing_address[:city] if billing_address[:city]
92
+ post[:address]['country'] = billing_address[:country] if billing_address[:country]
93
+ post[:address]['region'] = billing_address[:state] if billing_address[:state]
94
+ post[:address]['postal_code'] = billing_address[:zip]
95
+ end
96
+
97
+ if options[:recurring] == true
98
+ post[:client_secret] = @options[:client_secret]
99
+ commit('/credit_card/transfer', post, options)
100
+ else
101
+ post[:original_device] = options[:device_fingerprint] if options[:device_fingerprint]
102
+ post[:original_ip] = options[:ip] if options[:ip]
103
+ commit('/credit_card/create', post, options)
104
+ end
105
+ end
106
+
107
+ def supports_scrubbing?
108
+ true
109
+ end
110
+
111
+ def scrub(transcript)
112
+ transcript.
113
+ gsub(%r((\\?"cc_number\\?":\\?")[^\\"]+(\\?"))i, '\1[FILTERED]\2').
114
+ gsub(%r((\\?"cvv\\?":\\?")[^\\"]+(\\?"))i, '\1[FILTERED]\2').
115
+ gsub(%r((Authorization: Bearer )\w+)i, '\1[FILTERED]\2')
116
+ end
117
+
118
+ private
119
+
120
+ def authorize_with_token(post, money, token, options)
121
+ add_token(post, token)
122
+ add_product_data(post, money, options)
123
+ commit('/checkout/create', post, options)
124
+ end
125
+
126
+ def add_product_data(post, money, options)
127
+ post[:account_id] = @options[:account_id]
128
+ post[:amount] = amount(money)
129
+ post[:short_description] = (options[:description] || 'Purchase')
130
+ post[:type] = (options[:type] || 'goods')
131
+ post[:currency] = (options[:currency] || currency(money))
132
+ post[:long_description] = options[:long_description] if options[:long_description]
133
+ post[:payer_email_message] = options[:payer_email_message] if options[:payer_email_message]
134
+ post[:payee_email_message] = options[:payee_email_message] if options[:payee_email_message]
135
+ post[:reference_id] = options[:order_id] if options[:order_id]
136
+ post[:unique_id] = options[:unique_id] if options[:unique_id]
137
+ post[:redirect_uri] = options[:redirect_uri] if options[:redirect_uri]
138
+ post[:callback_uri] = options[:callback_uri] if options[:callback_uri]
139
+ post[:fallback_uri] = options[:fallback_uri] if options[:fallback_uri]
140
+ post[:require_shipping] = options[:require_shipping] if options[:require_shipping]
141
+ post[:shipping_fee] = options[:shipping_fee] if options[:shipping_fee]
142
+ post[:charge_tax] = options[:charge_tax] if options[:charge_tax]
143
+ post[:mode] = options[:mode] if options[:mode]
144
+ post[:preapproval_id] = options[:preapproval_id] if options[:preapproval_id]
145
+ post[:prefill_info] = options[:prefill_info] if options[:prefill_info]
146
+ post[:funding_sources] = options[:funding_sources] if options[:funding_sources]
147
+ post[:payer_rbits] = options[:payer_rbits] if options[:payer_rbits]
148
+ post[:transaction_rbits] = options[:transaction_rbits] if options[:transaction_rbits]
149
+ add_fee(post, options)
150
+ end
151
+
152
+ def add_token(post, token)
153
+ payment_method = {}
154
+ payment_method[:type] = 'credit_card'
155
+ payment_method[:credit_card] = {
156
+ id: token,
157
+ auto_capture: false
158
+ }
159
+
160
+ post[:payment_method] = payment_method
161
+ end
162
+
163
+ def add_fee(post, options)
164
+ if options[:application_fee] || options[:fee_payer]
165
+ post[:fee] = {}
166
+ post[:fee][:app_fee] = options[:application_fee] if options[:application_fee]
167
+ post[:fee][:fee_payer] = options[:fee_payer] if options[:fee_payer]
168
+ end
169
+ end
170
+
171
+ def parse(response)
172
+ JSON.parse(response)
173
+ end
174
+
175
+ def commit(action, params, options={})
176
+ begin
177
+ response = parse(ssl_post(
178
+ ((test? ? test_url : live_url) + action),
179
+ params.to_json,
180
+ headers(options)
181
+ ))
182
+ rescue ResponseError => e
183
+ response = parse(e.response.body)
184
+ end
185
+
186
+ return Response.new(
187
+ success_from(response),
188
+ message_from(response),
189
+ response,
190
+ authorization: authorization_from(response, params),
191
+ test: test?
192
+ )
193
+ rescue JSON::ParserError
194
+ return unparsable_response(response)
195
+ end
196
+
197
+ def success_from(response)
198
+ (!response['error'])
199
+ end
200
+
201
+ def message_from(response)
202
+ (response['error'] ? response['error_description'] : 'Success')
203
+ end
204
+
205
+ def authorization_from(response, params)
206
+ return response['credit_card_id'].to_s if response['credit_card_id']
207
+
208
+ original_amount = response['amount'].nil? ? nil : sprintf('%0.02f', response['amount'])
209
+ [response['checkout_id'], original_amount].join('|')
210
+ end
211
+
212
+ def split_authorization(authorization)
213
+ auth, original_amount = authorization.to_s.split('|')
214
+ [auth, original_amount]
215
+ end
216
+
217
+ def unparsable_response(raw_response)
218
+ message = 'Invalid JSON response received from WePay. Please contact WePay support if you continue to receive this message.'
219
+ message += " (The raw response returned by the API was #{raw_response.inspect})"
220
+ return Response.new(false, message)
221
+ end
222
+
223
+ def headers(options)
224
+ headers = {
225
+ 'Content-Type' => 'application/json',
226
+ 'User-Agent' => "ActiveMerchantBindings/#{ActiveMerchant::VERSION}",
227
+ 'Authorization' => "Bearer #{@options[:access_token]}"
228
+ }
229
+ headers['Api-Version'] = options[:version] if options[:version]
230
+ headers['Client-IP'] = options[:ip] if options[:ip]
231
+ headers['WePay-Risk-Token'] = options[:risk_token] if options[:risk_token]
232
+
233
+ headers
234
+ end
235
+ end
236
+ end
237
+ end
@@ -26,7 +26,7 @@ module ActiveMerchant #:nodoc:
26
26
  # number 5551234 within area code 202 (country code 1).
27
27
  VALID_PHONE_FORMAT = /\+\d{1,3}(\(?\d{3}\)?)?\d{3}-\d{4}-\d{3}/
28
28
 
29
- self.supported_cardtypes = [ :visa, :master, :american_express, :diners_club, :jcb, :switch ]
29
+ self.supported_cardtypes = [ :visa, :master, :american_express, :diners_club, :jcb ]
30
30
  self.supported_countries = %w(AD CY GI IM MT RO CH AT DK GR IT MC SM TR BE EE HU LV NL SK GB BG FI IS LI NO SI VA FR IL LT PL ES CZ DE IE LU PT SE)
31
31
  self.homepage_url = 'http://www.wirecard.com'
32
32
  self.display_name = 'Wirecard'
@@ -44,8 +44,16 @@ module ActiveMerchant #:nodoc:
44
44
  super
45
45
  end
46
46
 
47
- def authorize(money, creditcard, options = {})
48
- options[:credit_card] = creditcard
47
+ # Authorization - the second parameter may be a CreditCard or
48
+ # a String which represents a GuWID reference to an earlier
49
+ # transaction. If a GuWID is given, rather than a CreditCard,
50
+ # then then the :recurring option will be forced to "Repeated"
51
+ def authorize(money, payment_method, options = {})
52
+ if payment_method.respond_to?(:number)
53
+ options[:credit_card] = payment_method
54
+ else
55
+ options[:preauthorization] = payment_method
56
+ end
49
57
  commit(:preauthorization, money, options)
50
58
  end
51
59
 
@@ -54,8 +62,16 @@ module ActiveMerchant #:nodoc:
54
62
  commit(:capture, money, options)
55
63
  end
56
64
 
57
- def purchase(money, creditcard, options = {})
58
- options[:credit_card] = creditcard
65
+ # Purchase - the second parameter may be a CreditCard or
66
+ # a String which represents a GuWID reference to an earlier
67
+ # transaction. If a GuWID is given, rather than a CreditCard,
68
+ # then then the :recurring option will be forced to "Repeated"
69
+ def purchase(money, payment_method, options = {})
70
+ if payment_method.respond_to?(:number)
71
+ options[:credit_card] = payment_method
72
+ else
73
+ options[:preauthorization] = payment_method
74
+ end
59
75
  commit(:purchase, money, options)
60
76
  end
61
77
 
@@ -69,10 +85,62 @@ module ActiveMerchant #:nodoc:
69
85
  commit(:bookback, money, options)
70
86
  end
71
87
 
88
+ # Store card - Wirecard supports the notion of "Recurring
89
+ # Transactions" by allowing the merchant to provide a reference
90
+ # to an earlier transaction (the GuWID) rather than a credit
91
+ # card. A reusable reference (GuWID) can be obtained by sending
92
+ # a purchase or authorization transaction with the element
93
+ # "RECURRING_TRANSACTION/Type" set to "Initial". Subsequent
94
+ # transactions can then use the GuWID in place of a credit
95
+ # card by setting "RECURRING_TRANSACTION/Type" to "Repeated".
96
+ #
97
+ # This implementation of card store utilizes a Wirecard
98
+ # "Authorization Check" (a Preauthorization that is automatically
99
+ # reversed). It defaults to a check amount of "100" (i.e.
100
+ # $1.00) but this can be overriden (see below).
101
+ #
102
+ # IMPORTANT: In order to reuse the stored reference, the
103
+ # +authorization+ from the response should be saved by
104
+ # your application code.
105
+ #
106
+ # ==== Options specific to +store+
107
+ #
108
+ # * <tt>:amount</tt> -- The amount, in cents, that should be
109
+ # "validated" by the Authorization Check. This amount will
110
+ # be reserved and then reversed. Default is 100.
111
+ #
112
+ # Note: This is not the only way to achieve a card store
113
+ # operation at Wirecard. Any +purchase+ or +authorize+
114
+ # can be sent with +options[:recurring] = 'Initial'+ to make
115
+ # the returned authorization/GuWID usable in later transactions
116
+ # with +options[:recurring] = 'Repeated'+.
117
+ def store(creditcard, options = {})
118
+ options[:credit_card] = creditcard
119
+ options[:recurring] = 'Initial'
120
+ money = options.delete(:amount) || 100
121
+ # Amex does not support authorization_check
122
+ if creditcard.brand == 'american_express'
123
+ commit(:preauthorization, money, options)
124
+ else
125
+ commit(:authorization_check, money, options)
126
+ end
127
+ end
128
+
129
+ def supports_scrubbing
130
+ true
131
+ end
132
+
133
+ def scrub(transcript)
134
+ transcript.
135
+ gsub(%r((Authorization: Basic )\w+), '\1[FILTERED]').
136
+ gsub(%r((<CreditCardNumber>)\d+(</CreditCardNumber>)), '\1[FILTERED]\2').
137
+ gsub(%r((<CVC2>)[^<]+(</CVC2>)), '\1[FILTERED]\2')
138
+ end
72
139
 
73
140
  private
141
+
74
142
  def clean_description(description)
75
- description.to_s.slice(0,32).encode("US-ASCII", invalid: :replace, undef: :replace, replace: '?')
143
+ description.to_s.slice(0, 32).encode('US-ASCII', invalid: :replace, undef: :replace, replace: '?')
76
144
  end
77
145
 
78
146
  def prepare_options_hash(options)
@@ -90,6 +158,13 @@ module ActiveMerchant #:nodoc:
90
158
  options[:billing_address][:email] = options[:email] if options[:email]
91
159
  end
92
160
 
161
+ # If a GuWID (string-based reference) is passed rather than a
162
+ # credit card, then the :recurring type needs to be forced to
163
+ # "Repeated"
164
+ def setup_recurring_flag(options)
165
+ options[:recurring] = 'Repeated' if options[:preauthorization].present?
166
+ end
167
+
93
168
  # Contact WireCard, make the XML request, and parse the
94
169
  # reply into a Response object
95
170
  def commit(action, money, options)
@@ -100,19 +175,19 @@ module ActiveMerchant #:nodoc:
100
175
 
101
176
  response = parse(ssl_post(test? ? self.test_url : self.live_url, request, headers))
102
177
  # Pending Status also means Acknowledged (as stated in their specification)
103
- success = response[:FunctionResult] == "ACK" || response[:FunctionResult] == "PENDING"
178
+ success = response[:FunctionResult] == 'ACK' || response[:FunctionResult] == 'PENDING'
104
179
  message = response[:Message]
105
180
  authorization = response[:GuWID]
106
181
 
107
182
  Response.new(success, message, response,
108
183
  :test => test?,
109
184
  :authorization => authorization,
110
- :avs_result => { :code => response[:avsCode] },
111
- :cvv_result => response[:cvCode]
185
+ :avs_result => { :code => avs_code(response, options) },
186
+ :cvv_result => response[:CVCResponseCode]
112
187
  )
113
188
  rescue ResponseError => e
114
- if e.response.code == "401"
115
- return Response.new(false, "Invalid Login")
189
+ if e.response.code == '401'
190
+ return Response.new(false, 'Invalid Login')
116
191
  else
117
192
  raise
118
193
  end
@@ -126,7 +201,7 @@ module ActiveMerchant #:nodoc:
126
201
  xml.instruct!
127
202
  xml.tag! 'WIRECARD_BXML' do
128
203
  xml.tag! 'W_REQUEST' do
129
- xml.tag! 'W_JOB' do
204
+ xml.tag! 'W_JOB' do
130
205
  xml.tag! 'JobID', ''
131
206
  # UserID for this transaction
132
207
  xml.tag! 'BusinessCaseSignature', options[:signature] || options[:login]
@@ -146,24 +221,33 @@ module ActiveMerchant #:nodoc:
146
221
  xml.tag! 'FunctionID', clean_description(options[:description])
147
222
  xml.tag! 'CC_TRANSACTION' do
148
223
  xml.tag! 'TransactionID', options[:order_id]
224
+ xml.tag! 'CommerceType', options[:commerce_type] if options[:commerce_type]
149
225
  case options[:action]
150
- when :preauthorization, :purchase
226
+ when :preauthorization, :purchase, :authorization_check
227
+ setup_recurring_flag(options)
151
228
  add_invoice(xml, money, options)
152
- add_creditcard(xml, options[:credit_card])
229
+
230
+ if options[:credit_card]
231
+ add_creditcard(xml, options[:credit_card])
232
+ else
233
+ xml.tag! 'GuWID', options[:preauthorization]
234
+ end
235
+
153
236
  add_address(xml, options[:billing_address])
154
237
  when :capture, :bookback
155
238
  xml.tag! 'GuWID', options[:preauthorization]
156
- add_amount(xml, money)
239
+ add_amount(xml, money, options)
157
240
  when :reversal
158
241
  xml.tag! 'GuWID', options[:preauthorization]
159
242
  end
243
+ add_customer_data(xml, options)
160
244
  end
161
245
  end
162
246
  end
163
247
 
164
248
  # Includes the payment (amount, currency, country) to the transaction-xml
165
249
  def add_invoice(xml, money, options)
166
- add_amount(xml, money)
250
+ add_amount(xml, money, options)
167
251
  xml.tag! 'Currency', options[:currency] || currency(money)
168
252
  xml.tag! 'CountryCode', options[:billing_address][:country]
169
253
  xml.tag! 'RECURRING_TRANSACTION' do
@@ -172,13 +256,13 @@ module ActiveMerchant #:nodoc:
172
256
  end
173
257
 
174
258
  # Include the amount in the transaction-xml
175
- def add_amount(xml, money)
176
- xml.tag! 'Amount', amount(money)
259
+ def add_amount(xml, money, options)
260
+ xml.tag! 'Amount', localized_amount(money, options[:currency] || currency(money))
177
261
  end
178
262
 
179
263
  # Includes the credit-card data to the transaction-xml
180
264
  def add_creditcard(xml, creditcard)
181
- raise "Creditcard must be supplied!" if creditcard.nil?
265
+ raise 'Creditcard must be supplied!' if creditcard.nil?
182
266
  xml.tag! 'CREDIT_CARD_DATA' do
183
267
  xml.tag! 'CreditCardNumber', creditcard.number
184
268
  xml.tag! 'CVC2', creditcard.verification_value
@@ -226,8 +310,8 @@ module ActiveMerchant #:nodoc:
226
310
  xml = REXML::Document.new(xml)
227
311
  if root = REXML::XPath.first(xml, "#{basepath}/W_JOB")
228
312
  parse_response(response, root)
229
- elsif root = REXML::XPath.first(xml, "//ERROR")
230
- parse_error(response, root)
313
+ elsif root = REXML::XPath.first(xml, '//ERROR')
314
+ parse_error_only_response(response, root)
231
315
  else
232
316
  response[:Message] = "No valid XML response message received. \
233
317
  Propably wrong credentials supplied with HTTP header."
@@ -236,31 +320,49 @@ module ActiveMerchant #:nodoc:
236
320
  response
237
321
  end
238
322
 
323
+ def parse_error_only_response(response, root)
324
+ error_code = REXML::XPath.first(root, 'Number')
325
+ response[:ErrorCode] = error_code.text if error_code
326
+ response[:Message] = parse_error(root)
327
+ end
328
+
239
329
  # Parse the <ProcessingStatus> Element which contains all important information
240
330
  def parse_response(response, root)
241
331
  status = nil
242
- # get the root element for this Transaction
332
+
243
333
  root.elements.to_a.each do |node|
244
334
  if node.name =~ /FNC_CC_/
245
- status = REXML::XPath.first(node, "CC_TRANSACTION/PROCESSING_STATUS")
335
+ status = REXML::XPath.first(node, 'CC_TRANSACTION/PROCESSING_STATUS')
246
336
  end
247
337
  end
248
- message = ""
338
+
339
+ message = ''
249
340
  if status
250
341
  if info = status.elements['Info']
251
342
  message << info.text
252
343
  end
253
- # Get basic response information
344
+
254
345
  status.elements.to_a.each do |node|
255
- response[node.name.to_sym] = (node.text || '').strip
346
+ if node.elements.size == 0
347
+ response[node.name.to_sym] = (node.text || '').strip
348
+ else
349
+ node.elements.each do |childnode|
350
+ name = "#{node.name}_#{childnode.name}"
351
+ response[name.to_sym] = (childnode.text || '').strip
352
+ end
353
+ end
256
354
  end
355
+
356
+ error_code = REXML::XPath.first(status, 'ERROR/Number')
357
+ response['ErrorCode'] = error_code.text if error_code
257
358
  end
359
+
258
360
  parse_error(root, message)
259
361
  response[:Message] = message
260
362
  end
261
363
 
262
364
  # Parse a generic error response from the gateway
263
- def parse_error(root, message = "")
365
+ def parse_error(root, message = '')
264
366
  # Get errors if available and append them to the message
265
367
  errors = errors_to_string(root)
266
368
  unless errors.strip.blank?
@@ -275,7 +377,7 @@ module ActiveMerchant #:nodoc:
275
377
  def errors_to_string(root)
276
378
  # Get context error messages (can be 0..*)
277
379
  errors = []
278
- REXML::XPath.each(root, "//ERROR") do |error_elem|
380
+ REXML::XPath.each(root, '//ERROR') do |error_elem|
279
381
  error = {}
280
382
  error[:Advice] = []
281
383
  error[:Message] = error_elem.elements['Message'].text
@@ -287,7 +389,7 @@ module ActiveMerchant #:nodoc:
287
389
  # Convert all messages to a single string
288
390
  string = ''
289
391
  errors.each do |error|
290
- string << error[:Message]
392
+ string << error[:Message] if error[:Message]
291
393
  error[:Advice].each_with_index do |advice, index|
292
394
  string << ' (' if index == 0
293
395
  string << "#{index+1}. #{advice}"
@@ -298,13 +400,33 @@ module ActiveMerchant #:nodoc:
298
400
  string
299
401
  end
300
402
 
403
+ # Amex have different AVS response codes
404
+ AMEX_TRANSLATED_AVS_CODES = {
405
+ 'A' => 'B', # CSC and Address Matched
406
+ 'F' => 'D', # All Data Matched
407
+ 'N' => 'I', # CSC Match
408
+ 'U' => 'U', # Data Not Checked
409
+ 'Y' => 'D', # All Data Matched
410
+ 'Z' => 'P', # CSC and Postcode Matched
411
+ }
412
+
413
+ # Amex have different AVS response codes to visa etc
414
+ def avs_code(response, options)
415
+ if response.has_key?(:AVS_ProviderResultCode)
416
+ if options[:credit_card].present? && ActiveMerchant::Billing::CreditCard.brand?(options[:credit_card].number) == 'american_express'
417
+ AMEX_TRANSLATED_AVS_CODES[response[:AVS_ProviderResultCode]]
418
+ else
419
+ response[:AVS_ProviderResultCode]
420
+ end
421
+ end
422
+ end
423
+
301
424
  # Encode login and password in Base64 to supply as HTTP header
302
425
  # (for http basic authentication)
303
426
  def encoded_credentials
304
427
  credentials = [@options[:login], @options[:password]].join(':')
305
- "Basic " << Base64.encode64(credentials).strip
428
+ 'Basic ' << Base64.encode64(credentials).strip
306
429
  end
307
430
  end
308
431
  end
309
432
  end
310
-