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,445 @@
1
+ require 'digest/md5'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ class PayuLatamGateway < Gateway
6
+ self.display_name = 'PayU Latam'
7
+ self.homepage_url = 'http://www.payulatam.com'
8
+
9
+ self.test_url = 'https://sandbox.api.payulatam.com/payments-api/4.0/service.cgi'
10
+ self.live_url = 'https://api.payulatam.com/payments-api/4.0/service.cgi'
11
+
12
+ self.supported_countries = ['AR', 'BR', 'CL', 'CO', 'MX', 'PA', 'PE']
13
+ self.default_currency = 'USD'
14
+ self.money_format = :dollars
15
+ self.supported_cardtypes = [:visa, :master, :american_express, :diners_club]
16
+
17
+ BRAND_MAP = {
18
+ 'visa' => 'VISA',
19
+ 'master' => 'MASTERCARD',
20
+ 'american_express' => 'AMEX',
21
+ 'diners_club' => 'DINERS'
22
+ }
23
+
24
+ MINIMUMS = {
25
+ 'ARS' => 1700,
26
+ 'BRL' => 600,
27
+ 'MXN' => 3900,
28
+ 'PEN' => 500
29
+ }
30
+
31
+ def initialize(options={})
32
+ requires!(options, :merchant_id, :account_id, :api_login, :api_key, :payment_country)
33
+ super
34
+ end
35
+
36
+ def purchase(amount, payment_method, options={})
37
+ post = {}
38
+ auth_or_sale(post, 'AUTHORIZATION_AND_CAPTURE', amount, payment_method, options)
39
+ commit('purchase', post)
40
+ end
41
+
42
+ def authorize(amount, payment_method, options={})
43
+ post = {}
44
+ auth_or_sale(post, 'AUTHORIZATION', amount, payment_method, options)
45
+ commit('auth', post)
46
+ end
47
+
48
+ def capture(amount, authorization, options={})
49
+ post = {}
50
+
51
+ add_credentials(post, 'SUBMIT_TRANSACTION', options)
52
+ add_transaction_elements(post, 'CAPTURE', options)
53
+ add_reference(post, authorization)
54
+
55
+ if !amount.nil? && amount.to_f != 0.0
56
+ post[:transaction][:additionalValues] ||= {}
57
+ post[:transaction][:additionalValues][:TX_VALUE] = invoice_for(amount, options)[:TX_VALUE]
58
+ end
59
+
60
+ commit('capture', post)
61
+ end
62
+
63
+ def void(authorization, options={})
64
+ post = {}
65
+
66
+ add_credentials(post, 'SUBMIT_TRANSACTION', options)
67
+ add_transaction_elements(post, 'VOID', options)
68
+ add_reference(post, authorization)
69
+
70
+ commit('void', post)
71
+ end
72
+
73
+ def refund(amount, authorization, options={})
74
+ post = {}
75
+
76
+ add_credentials(post, 'SUBMIT_TRANSACTION', options)
77
+ add_transaction_elements(post, 'REFUND', options)
78
+ add_reference(post, authorization)
79
+
80
+ commit('refund', post)
81
+ end
82
+
83
+ def verify(credit_card, options={})
84
+ minimum = MINIMUMS[options[:currency].upcase] if options[:currency]
85
+ amount = options[:verify_amount] || minimum || 100
86
+
87
+ MultiResponse.run(:use_first_response) do |r|
88
+ r.process { authorize(amount, credit_card, options) }
89
+ r.process(:ignore_result) { void(r.authorization, options) }
90
+ end
91
+ end
92
+
93
+ def store(payment_method, options = {})
94
+ post = {}
95
+
96
+ add_credentials(post, 'CREATE_TOKEN')
97
+ add_payment_method_to_be_tokenized(post, payment_method)
98
+
99
+ commit('store', post)
100
+ end
101
+
102
+ def verify_credentials
103
+ post = {}
104
+ add_credentials(post, 'GET_PAYMENT_METHODS')
105
+ response = commit('verify_credentials', post)
106
+ response.success?
107
+ end
108
+
109
+ def supports_scrubbing?
110
+ true
111
+ end
112
+
113
+ def scrub(transcript)
114
+ transcript.
115
+ gsub(%r((\"creditCard\\\":{\\\"number\\\":\\\")\d+), '\1[FILTERED]').
116
+ gsub(%r((\"securityCode\\\":\\\")\d+), '\1[FILTERED]').
117
+ gsub(%r((\"apiKey\\\":\\\")\w+), '\1[FILTERED]')
118
+ end
119
+
120
+ private
121
+
122
+ def auth_or_sale(post, transaction_type, amount, payment_method, options)
123
+ add_credentials(post, 'SUBMIT_TRANSACTION', options)
124
+ add_transaction_elements(post, transaction_type, options)
125
+ add_order(post, options)
126
+ add_buyer(post, payment_method, options)
127
+ add_invoice(post, amount, options)
128
+ add_signature(post)
129
+ add_payment_method(post, payment_method, options)
130
+ add_payer(post, payment_method, options)
131
+ add_extra_parameters(post, options)
132
+ end
133
+
134
+ def add_credentials(post, command, options={})
135
+ post[:test] = test? unless command == 'CREATE_TOKEN'
136
+ post[:language] = options[:language] || 'en'
137
+ post[:command] = command
138
+ merchant = {}
139
+ merchant[:apiLogin] = @options[:api_login]
140
+ merchant[:apiKey] = @options[:api_key]
141
+ post[:merchant] = merchant
142
+ end
143
+
144
+ def add_transaction_elements(post, type, options)
145
+ transaction = {}
146
+ transaction[:paymentCountry] = @options[:payment_country]
147
+ transaction[:type] = type
148
+ transaction[:ipAddress] = options[:ip] || ''
149
+ transaction[:userAgent] = options[:user_agent] if options[:user_agent]
150
+ transaction[:cookie] = options[:cookie] if options[:cookie]
151
+ transaction[:deviceSessionId] = options[:device_session_id] if options[:device_session_id]
152
+ post[:transaction] = transaction
153
+ end
154
+
155
+ def add_order(post, options)
156
+ order = {}
157
+ order[:accountId] = @options[:account_id]
158
+ order[:partnerId] = options[:partner_id] if options[:partner_id]
159
+ order[:referenceCode] = options[:order_id] || generate_unique_id
160
+ order[:description] = options[:description] || 'Compra en ' + @options[:merchant_id]
161
+ order[:language] = options[:language] || 'en'
162
+ order[:shippingAddress] = shipping_address_fields(options) if options[:shipping_address]
163
+ post[:transaction][:order] = order
164
+ end
165
+
166
+ def add_payer(post, payment_method, options)
167
+ address = options[:billing_address]
168
+ payer = {}
169
+ payer[:fullName] = payment_method.name.strip
170
+ payer[:contactPhone] = address[:phone] if address && address[:phone]
171
+ payer[:dniNumber] = options[:dni_number] if options[:dni_number]
172
+ payer[:dniType] = options[:dni_type] if options[:dni_type]
173
+ payer[:emailAddress] = options[:email] if options[:email]
174
+ payer[:birthdate] = options[:birth_date] if options[:birth_date] && @options[:payment_country] == 'MX'
175
+ payer[:billingAddress] = billing_address_fields(options)
176
+ post[:transaction][:payer] = payer
177
+ end
178
+
179
+ def billing_address_fields(options)
180
+ return unless address = options[:billing_address]
181
+ billing_address = {}
182
+ billing_address[:street1] = address[:address1]
183
+ billing_address[:street2] = address[:address2]
184
+ billing_address[:city] = address[:city]
185
+ billing_address[:state] = address[:state]
186
+ billing_address[:country] = address[:country]
187
+ billing_address[:postalCode] = address[:zip] if @options[:payment_country] == 'MX'
188
+ billing_address[:phone] = address[:phone]
189
+ billing_address
190
+ end
191
+
192
+ def add_buyer(post, payment_method, options)
193
+ buyer = {}
194
+ if buyer_hash = options[:buyer]
195
+ buyer[:fullName] = buyer_hash[:name]
196
+ buyer[:dniNumber] = buyer_hash[:dni_number]
197
+ buyer[:dniType] = buyer_hash[:dni_type]
198
+ buyer[:cnpj] = buyer_hash[:cnpj] if @options[:payment_country] == 'BR'
199
+ buyer[:emailAddress] = buyer_hash[:email]
200
+ buyer[:contactPhone] = (options[:billing_address][:phone] if options[:billing_address]) || (options[:shipping_address][:phone] if options[:shipping_address]) || ''
201
+ buyer[:shippingAddress] = shipping_address_fields(options) if options[:shipping_address]
202
+ else
203
+ buyer[:fullName] = payment_method.name.strip
204
+ buyer[:dniNumber] = options[:dni_number]
205
+ buyer[:dniType] = options[:dni_type]
206
+ buyer[:cnpj] = options[:cnpj] if @options[:payment_country] == 'BR'
207
+ buyer[:emailAddress] = options[:email]
208
+ buyer[:contactPhone] = (options[:billing_address][:phone] if options[:billing_address]) || (options[:shipping_address][:phone] if options[:shipping_address]) || ''
209
+ buyer[:shippingAddress] = shipping_address_fields(options) if options[:shipping_address]
210
+ end
211
+ post[:transaction][:order][:buyer] = buyer
212
+ end
213
+
214
+ def shipping_address_fields(options)
215
+ return unless address = options[:shipping_address]
216
+ shipping_address = {}
217
+ shipping_address[:street1] = address[:address1]
218
+ shipping_address[:street2] = address[:address2]
219
+ shipping_address[:city] = address[:city]
220
+ shipping_address[:state] = address[:state]
221
+ shipping_address[:country] = address[:country]
222
+ shipping_address[:postalCode] = address[:zip]
223
+ shipping_address[:phone] = address[:phone]
224
+ shipping_address
225
+ end
226
+
227
+ def add_invoice(post, money, options)
228
+ post[:transaction][:order][:additionalValues] = invoice_for(money, options)
229
+ end
230
+
231
+ def invoice_for(money, options)
232
+ tx_value = {}
233
+ tx_value[:value] = amount(money)
234
+ tx_value[:currency] = options[:currency] || currency(money)
235
+
236
+ tx_tax = {}
237
+ tx_tax[:value] = options[:tax] || '0'
238
+ tx_tax[:currency] = options[:currency] || currency(money)
239
+
240
+ tx_tax_return_base = {}
241
+ tx_tax_return_base[:value] = options[:tax_return_base] || '0'
242
+ tx_tax_return_base[:currency] = options[:currency] || currency(money)
243
+
244
+ additional_values = {}
245
+ additional_values[:TX_VALUE] = tx_value
246
+ additional_values[:TX_TAX] = tx_tax if @options[:payment_country] == 'CO'
247
+ additional_values[:TX_TAX_RETURN_BASE] = tx_tax_return_base if @options[:payment_country] == 'CO'
248
+
249
+ additional_values
250
+ end
251
+
252
+ def add_signature(post)
253
+ post[:transaction][:order][:signature] = signature_from(post)
254
+ end
255
+
256
+ def signature_from(post)
257
+ signature_string = [
258
+ @options[:api_key],
259
+ @options[:merchant_id],
260
+ post[:transaction][:order][:referenceCode],
261
+ post[:transaction][:order][:additionalValues][:TX_VALUE][:value],
262
+ post[:transaction][:order][:additionalValues][:TX_VALUE][:currency]
263
+ ].compact.join('~')
264
+
265
+ Digest::MD5.hexdigest(signature_string)
266
+ end
267
+
268
+ def add_payment_method(post, payment_method, options)
269
+ if payment_method.is_a?(String)
270
+ brand, token = split_authorization(payment_method)
271
+ credit_card = {}
272
+ credit_card[:securityCode] = options[:cvv] if options[:cvv]
273
+ credit_card[:processWithoutCvv2] = true if options[:cvv].blank?
274
+ post[:transaction][:creditCard] = credit_card
275
+ post[:transaction][:creditCardTokenId] = token
276
+ post[:transaction][:paymentMethod] = brand.upcase
277
+ else
278
+ credit_card = {}
279
+ credit_card[:number] = payment_method.number
280
+ credit_card[:securityCode] = payment_method.verification_value || options[:cvv]
281
+ credit_card[:expirationDate] = format(payment_method.year, :four_digits).to_s + '/' + format(payment_method.month, :two_digits).to_s
282
+ credit_card[:name] = payment_method.name.strip
283
+ credit_card[:processWithoutCvv2] = true if add_process_without_cvv2(payment_method, options)
284
+ post[:transaction][:creditCard] = credit_card
285
+ post[:transaction][:paymentMethod] = BRAND_MAP[payment_method.brand.to_s]
286
+ end
287
+ end
288
+
289
+ def add_process_without_cvv2(payment_method, options)
290
+ return true if payment_method.verification_value.blank? && options[:cvv].blank?
291
+ false
292
+ end
293
+
294
+ def add_extra_parameters(post, options)
295
+ extra_parameters = {}
296
+ extra_parameters[:INSTALLMENTS_NUMBER] = options[:installments_number] || 1
297
+ post[:transaction][:extraParameters] = extra_parameters
298
+ end
299
+
300
+ def add_reference(post, authorization)
301
+ order_id, transaction_id = split_authorization(authorization)
302
+ order = {}
303
+ order[:id] = order_id
304
+ post[:transaction][:order] = order
305
+ post[:transaction][:parentTransactionId] = transaction_id
306
+ post[:transaction][:reason] = 'n/a'
307
+ end
308
+
309
+ def add_payment_method_to_be_tokenized(post, payment_method)
310
+ credit_card_token = {}
311
+ credit_card_token[:payerId] = generate_unique_id
312
+ credit_card_token[:name] = payment_method.name.strip
313
+ credit_card_token[:identificationNumber] = generate_unique_id
314
+ credit_card_token[:paymentMethod] = BRAND_MAP[payment_method.brand.to_s]
315
+ credit_card_token[:number] = payment_method.number
316
+ credit_card_token[:expirationDate] = format(payment_method.year, :four_digits).to_s + '/' + format(payment_method.month, :two_digits).to_s
317
+ credit_card_token[:securityCode] = payment_method.verification_value
318
+ post[:creditCardToken] = credit_card_token
319
+ end
320
+
321
+ def commit(action, params)
322
+ raw_response = ssl_post(url, post_data(params), headers)
323
+ response = parse(raw_response)
324
+ rescue ResponseError => e
325
+ raw_response = e.response.body
326
+ response_error(raw_response)
327
+ rescue JSON::ParserError
328
+ unparsable_response(raw_response)
329
+ else
330
+ success = success_from(action, response)
331
+ Response.new(
332
+ success,
333
+ message_from(action, success, response),
334
+ response,
335
+ authorization: success ? authorization_from(action, response) : nil,
336
+ error_code: success ? nil : error_from(action, response),
337
+ test: test?
338
+ )
339
+ end
340
+
341
+ def headers
342
+ {
343
+ 'Content-Type' => 'application/json',
344
+ 'Accept' => 'application/json'
345
+ }
346
+ end
347
+
348
+ def post_data(params)
349
+ params.merge(test: test?)
350
+ params.to_json
351
+ end
352
+
353
+ def url
354
+ test? ? test_url : live_url
355
+ end
356
+
357
+ def parse(body)
358
+ JSON.parse(body)
359
+ end
360
+
361
+ def success_from(action, response)
362
+ case action
363
+ when 'store'
364
+ response['code'] == 'SUCCESS' && response['creditCardToken'] && response['creditCardToken']['creditCardTokenId'].present?
365
+ when 'verify_credentials'
366
+ response['code'] == 'SUCCESS'
367
+ when 'refund', 'void'
368
+ response['code'] == 'SUCCESS' && response['transactionResponse'] && (response['transactionResponse']['state'] == 'PENDING' || response['transactionResponse']['state'] == 'APPROVED')
369
+ else
370
+ response['code'] == 'SUCCESS' && response['transactionResponse'] && (response['transactionResponse']['state'] == 'APPROVED')
371
+ end
372
+ end
373
+
374
+ def message_from(action, success, response)
375
+ case action
376
+ when 'store'
377
+ return response['code'] if success
378
+ error_description = response['creditCardToken']['errorDescription'] if response['creditCardToken']
379
+ response['error'] || error_description || 'FAILED'
380
+ when 'verify_credentials'
381
+ return 'VERIFIED' if success
382
+ 'FAILED'
383
+ else
384
+ if response['transactionResponse']
385
+ response_message = response['transactionResponse']['responseMessage']
386
+ response_code = response['transactionResponse']['responseCode'] || response['transactionResponse']['pendingReason']
387
+ end
388
+ return response_code if success
389
+ response['error'] || response_message || response_code || 'FAILED'
390
+ end
391
+ end
392
+
393
+ def authorization_from(action, response)
394
+ case action
395
+ when 'store'
396
+ [
397
+ response['creditCardToken']['paymentMethod'],
398
+ response['creditCardToken']['creditCardTokenId']
399
+ ].compact.join('|')
400
+ when 'verify_credentials'
401
+ nil
402
+ else
403
+ [
404
+ response['transactionResponse']['orderId'],
405
+ response['transactionResponse']['transactionId']
406
+ ].compact.join('|')
407
+ end
408
+ end
409
+
410
+ def split_authorization(authorization)
411
+ authorization.split('|')
412
+ end
413
+
414
+ def error_from(action, response)
415
+ case action
416
+ when 'store'
417
+ response['creditCardToken']['errorDescription'] if response['creditCardToken']
418
+ when 'verify_credentials'
419
+ response['error'] || 'FAILED'
420
+ else
421
+ response['transactionResponse']['errorCode'] || response['transactionResponse']['responseCode'] if response['transactionResponse']
422
+ end
423
+ end
424
+
425
+ def response_error(raw_response)
426
+ response = parse(raw_response)
427
+ rescue JSON::ParserError
428
+ unparsable_response(raw_response)
429
+ else
430
+ return Response.new(
431
+ false,
432
+ message_from('', false, response),
433
+ response,
434
+ :test => test?
435
+ )
436
+ end
437
+
438
+ def unparsable_response(raw_response)
439
+ message = 'Invalid JSON response received from PayuLatamGateway. Please contact PayuLatamGateway if you continue to receive this message.'
440
+ message += " (The raw response returned by the API was #{raw_response.inspect})"
441
+ return Response.new(false, message)
442
+ end
443
+ end
444
+ end
445
+ end
@@ -150,7 +150,7 @@ module ActiveMerchant
150
150
  post['card.cardHolderName'] = "#{payment_method.first_name} #{payment_method.last_name}"
151
151
  post['card.PAN'] = payment_method.number
152
152
  post['card.CVN'] = payment_method.verification_value
153
- post['card.expiryYear'] = payment_method.year.to_s[-2,2]
153
+ post['card.expiryYear'] = payment_method.year.to_s[-2, 2]
154
154
  post['card.expiryMonth'] = sprintf('%02d', payment_method.month)
155
155
  else
156
156
  post['customer.customerReferenceNumber'] = payment_method
@@ -177,30 +177,30 @@ module ActiveMerchant
177
177
  # Creates the request and returns the summarized result
178
178
  def commit(action, post)
179
179
  add_auth(post)
180
- post.merge!('order.type' => TRANSACTIONS[action])
180
+ post['order.type'] = TRANSACTIONS[action]
181
181
 
182
- request = post.map { |k, v| "#{k}=#{CGI.escape(v.to_s)}" }.join("&")
182
+ request = post.map { |k, v| "#{k}=#{CGI.escape(v.to_s)}" }.join('&')
183
183
  response = ssl_post(self.live_url, request)
184
184
 
185
185
  params = {}
186
186
  CGI.parse(response).each_pair do |key, value|
187
- actual_key = key.split(".").last
187
+ actual_key = key.split('.').last
188
188
  params[actual_key.underscore.to_sym] = value[0]
189
189
  end
190
190
 
191
191
  message = "#{SUMMARY_CODES[params[:summary_code]]} - #{RESPONSE_CODES[params[:response_code]]}"
192
192
 
193
- success = (params[:summary_code] ? (params[:summary_code] == "0") : (params[:response_code] == "00"))
193
+ success = (params[:summary_code] ? (params[:summary_code] == '0') : (params[:response_code] == '00'))
194
194
 
195
195
  Response.new(success, message, params,
196
- :test => (@options[:merchant].to_s == "TEST"),
196
+ :test => (@options[:merchant].to_s == 'TEST'),
197
197
  :authorization => post[:order_number]
198
198
  )
199
199
  rescue ActiveMerchant::ResponseError => e
200
200
  raise unless e.response.code == '403'
201
- return Response.new(false, "Invalid credentials", {}, :test => test?)
201
+ return Response.new(false, 'Invalid credentials', {}, :test => test?)
202
202
  rescue ActiveMerchant::ClientCertificateError
203
- return Response.new(false, "Invalid certificate", {}, :test => test?)
203
+ return Response.new(false, 'Invalid certificate', {}, :test => test?)
204
204
  end
205
205
  end
206
206
  end
@@ -7,9 +7,9 @@ module ActiveMerchant #:nodoc:
7
7
  self.default_currency = 'AUD'
8
8
  self.money_format = :cents
9
9
  self.supported_countries = ['AU']
10
- self.supported_cardtypes = [:visa, :master]
10
+ self.supported_cardtypes = [:visa, :master, :american_express]
11
11
  self.homepage_url = 'http://www.pin.net.au/'
12
- self.display_name = 'Pin'
12
+ self.display_name = 'Pin Payments'
13
13
 
14
14
  def initialize(options = {})
15
15
  requires!(options, :api_key)
@@ -28,8 +28,10 @@ module ActiveMerchant #:nodoc:
28
28
  add_invoice(post, options)
29
29
  add_creditcard(post, creditcard)
30
30
  add_address(post, creditcard, options)
31
+ add_capture(post, options)
32
+ add_metadata(post, options)
31
33
 
32
- commit('charges', post, options)
34
+ commit(:post, 'charges', post, options)
33
35
  end
34
36
 
35
37
  # Create a customer and associated credit card. The token that is returned
@@ -40,17 +42,51 @@ module ActiveMerchant #:nodoc:
40
42
  add_creditcard(post, creditcard)
41
43
  add_customer_data(post, options)
42
44
  add_address(post, creditcard, options)
43
- commit('customers', post, options)
45
+ commit(:post, 'customers', post, options)
44
46
  end
45
47
 
46
- # Refund a transaction, note that the money attribute is ignored at the
47
- # moment as the API does not support partial refunds. The parameter is
48
- # kept for compatibility reasons
48
+ # Refund a transaction
49
49
  def refund(money, token, options = {})
50
- commit("charges/#{CGI.escape(token)}/refunds", { :amount => amount(money) }, options)
50
+ commit(:post, "charges/#{CGI.escape(token)}/refunds", { :amount => amount(money) }, options)
51
+ end
52
+
53
+ # Authorize an amount on a credit card. Once authorized, you can later
54
+ # capture this charge using the charge token that is returned.
55
+ def authorize(money, creditcard, options = {})
56
+ options[:capture] = false
57
+
58
+ purchase(money, creditcard, options)
59
+ end
60
+
61
+ # Captures a previously authorized charge. Capturing only part of the original
62
+ # authorization is currently not supported.
63
+ def capture(money, token, options = {})
64
+ commit(:put, "charges/#{CGI.escape(token)}/capture", { :amount => amount(money) }, options)
65
+ end
66
+
67
+ # Updates the credit card for the customer.
68
+ def update(token, creditcard, options = {})
69
+ post = {}
70
+
71
+ add_creditcard(post, creditcard)
72
+ add_customer_data(post, options)
73
+ add_address(post, creditcard, options)
74
+ commit(:put, "customers/#{CGI.escape(token)}", post, options)
75
+ end
76
+
77
+ def supports_scrubbing
78
+ true
79
+ end
80
+
81
+ def scrub(transcript)
82
+ transcript.
83
+ gsub(%r((Authorization: Basic )\w+), '\1[FILTERED]').
84
+ gsub(/(number\\?":\\?")(\d*)/, '\1[FILTERED]').
85
+ gsub(/(cvc\\?":\\?")(\d*)/, '\1[FILTERED]')
51
86
  end
52
87
 
53
88
  private
89
+
54
90
  def add_amount(post, money, options)
55
91
  post[:amount] = amount(money)
56
92
  post[:currency] = (options[:currency] || currency(money))
@@ -58,8 +94,8 @@ module ActiveMerchant #:nodoc:
58
94
  end
59
95
 
60
96
  def add_customer_data(post, options)
61
- post[:email] = options[:email]
62
- post[:ip_address] = options[:ip]
97
+ post[:email] = options[:email] if options[:email]
98
+ post[:ip_address] = options[:ip] if options[:ip]
63
99
  end
64
100
 
65
101
  def add_address(post, creditcard, options)
@@ -78,7 +114,14 @@ module ActiveMerchant #:nodoc:
78
114
  end
79
115
 
80
116
  def add_invoice(post, options)
81
- post[:description] = options[:description] || "Active Merchant Purchase"
117
+ post[:description] = options[:description] || 'Active Merchant Purchase'
118
+ post[:reference] = options[:reference] if options[:reference]
119
+ end
120
+
121
+ def add_capture(post, options)
122
+ capture = options[:capture]
123
+
124
+ post[:capture] = capture != false
82
125
  end
83
126
 
84
127
  def add_creditcard(post, creditcard)
@@ -101,10 +144,14 @@ module ActiveMerchant #:nodoc:
101
144
  end
102
145
  end
103
146
 
147
+ def add_metadata(post, options)
148
+ post[:metadata] = options[:metadata] if options[:metadata]
149
+ end
150
+
104
151
  def headers(params = {})
105
152
  result = {
106
- "Content-Type" => "application/json",
107
- "Authorization" => "Basic #{Base64.strict_encode64(options[:api_key] + ':').strip}"
153
+ 'Content-Type' => 'application/json',
154
+ 'Authorization' => "Basic #{Base64.strict_encode64(options[:api_key] + ':').strip}"
108
155
  }
109
156
 
110
157
  result['X-Partner-Key'] = params[:partner_key] if params[:partner_key]
@@ -112,24 +159,27 @@ module ActiveMerchant #:nodoc:
112
159
  result
113
160
  end
114
161
 
115
- def commit(action, params, options)
162
+ def commit(method, action, params, options)
116
163
  url = "#{test? ? test_url : live_url}/#{action}"
117
164
 
118
165
  begin
119
- body = parse(ssl_post(url, post_data(params), headers(options)))
166
+ raw_response = ssl_request(method, url, post_data(params), headers(options))
167
+ body = parse(raw_response)
120
168
  rescue ResponseError => e
121
169
  body = parse(e.response.body)
122
170
  end
123
171
 
124
- if body["response"]
172
+ if body['response']
125
173
  success_response(body)
126
- elsif body["error"]
174
+ elsif body['error']
127
175
  error_response(body)
128
176
  end
177
+ rescue JSON::ParserError
178
+ return unparsable_response(raw_response)
129
179
  end
130
180
 
131
181
  def success_response(body)
132
- response = body["response"]
182
+ response = body['response']
133
183
  Response.new(
134
184
  true,
135
185
  response['status_message'],
@@ -149,6 +199,12 @@ module ActiveMerchant #:nodoc:
149
199
  )
150
200
  end
151
201
 
202
+ def unparsable_response(raw_response)
203
+ message = 'Invalid JSON response received from Pin Payments. Please contact support@pin.net.au if you continue to receive this message.'
204
+ message += " (The raw response returned by the API was #{raw_response.inspect})"
205
+ return Response.new(false, message)
206
+ end
207
+
152
208
  def token(response)
153
209
  response['token']
154
210
  end