swiss-crm-activemerchant 1.0.12

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 (287) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +4033 -0
  3. data/CONTRIBUTORS +568 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +252 -0
  6. data/lib/active_merchant/billing/apple_pay_payment_token.rb +22 -0
  7. data/lib/active_merchant/billing/avs_result.rb +95 -0
  8. data/lib/active_merchant/billing/base.rb +48 -0
  9. data/lib/active_merchant/billing/check.rb +112 -0
  10. data/lib/active_merchant/billing/compatibility.rb +118 -0
  11. data/lib/active_merchant/billing/credit_card.rb +451 -0
  12. data/lib/active_merchant/billing/credit_card_formatting.rb +24 -0
  13. data/lib/active_merchant/billing/credit_card_methods.rb +512 -0
  14. data/lib/active_merchant/billing/cvv_result.rb +37 -0
  15. data/lib/active_merchant/billing/gateway.rb +332 -0
  16. data/lib/active_merchant/billing/gateways/adyen.rb +774 -0
  17. data/lib/active_merchant/billing/gateways/airwallex.rb +370 -0
  18. data/lib/active_merchant/billing/gateways/alelo.rb +256 -0
  19. data/lib/active_merchant/billing/gateways/allied_wallet.rb +205 -0
  20. data/lib/active_merchant/billing/gateways/authorize_net.rb +1125 -0
  21. data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +424 -0
  22. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +977 -0
  23. data/lib/active_merchant/billing/gateways/axcessms.rb +242 -0
  24. data/lib/active_merchant/billing/gateways/balanced.rb +263 -0
  25. data/lib/active_merchant/billing/gateways/bambora_apac.rb +222 -0
  26. data/lib/active_merchant/billing/gateways/bank_frick.rb +225 -0
  27. data/lib/active_merchant/billing/gateways/banwire.rb +116 -0
  28. data/lib/active_merchant/billing/gateways/barclaycard_smartpay.rb +397 -0
  29. data/lib/active_merchant/billing/gateways/barclays_epdq_extra_plus.rb +15 -0
  30. data/lib/active_merchant/billing/gateways/be2bill.rb +131 -0
  31. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +474 -0
  32. data/lib/active_merchant/billing/gateways/beanstream.rb +238 -0
  33. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +57 -0
  34. data/lib/active_merchant/billing/gateways/blue_pay.rb +549 -0
  35. data/lib/active_merchant/billing/gateways/blue_snap.rb +644 -0
  36. data/lib/active_merchant/billing/gateways/bogus.rb +190 -0
  37. data/lib/active_merchant/billing/gateways/borgun.rb +272 -0
  38. data/lib/active_merchant/billing/gateways/bpoint.rb +277 -0
  39. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +28 -0
  40. data/lib/active_merchant/billing/gateways/braintree/token_nonce.rb +113 -0
  41. data/lib/active_merchant/billing/gateways/braintree.rb +19 -0
  42. data/lib/active_merchant/billing/gateways/braintree_blue.rb +952 -0
  43. data/lib/active_merchant/billing/gateways/braintree_orange.rb +19 -0
  44. data/lib/active_merchant/billing/gateways/bridge_pay.rb +244 -0
  45. data/lib/active_merchant/billing/gateways/cams.rb +230 -0
  46. data/lib/active_merchant/billing/gateways/card_connect.rb +338 -0
  47. data/lib/active_merchant/billing/gateways/card_save.rb +21 -0
  48. data/lib/active_merchant/billing/gateways/card_stream.rb +394 -0
  49. data/lib/active_merchant/billing/gateways/cardknox.rb +327 -0
  50. data/lib/active_merchant/billing/gateways/cardprocess.rb +256 -0
  51. data/lib/active_merchant/billing/gateways/cashnet.rb +235 -0
  52. data/lib/active_merchant/billing/gateways/cc5.rb +198 -0
  53. data/lib/active_merchant/billing/gateways/cecabank.rb +249 -0
  54. data/lib/active_merchant/billing/gateways/cenpos.rb +328 -0
  55. data/lib/active_merchant/billing/gateways/checkout.rb +212 -0
  56. data/lib/active_merchant/billing/gateways/checkout_v2.rb +587 -0
  57. data/lib/active_merchant/billing/gateways/citrus_pay.rb +21 -0
  58. data/lib/active_merchant/billing/gateways/clearhaus.rb +219 -0
  59. data/lib/active_merchant/billing/gateways/commerce_hub.rb +366 -0
  60. data/lib/active_merchant/billing/gateways/commercegate.rb +142 -0
  61. data/lib/active_merchant/billing/gateways/conekta.rb +230 -0
  62. data/lib/active_merchant/billing/gateways/creditcall.rb +272 -0
  63. data/lib/active_merchant/billing/gateways/credorax.rb +526 -0
  64. data/lib/active_merchant/billing/gateways/ct_payment.rb +269 -0
  65. data/lib/active_merchant/billing/gateways/culqi.rb +279 -0
  66. data/lib/active_merchant/billing/gateways/cyber_source/cyber_source_common.rb +36 -0
  67. data/lib/active_merchant/billing/gateways/cyber_source.rb +1148 -0
  68. data/lib/active_merchant/billing/gateways/cyber_source_rest.rb +454 -0
  69. data/lib/active_merchant/billing/gateways/d_local.rb +343 -0
  70. data/lib/active_merchant/billing/gateways/data_cash.rb +302 -0
  71. data/lib/active_merchant/billing/gateways/decidir.rb +358 -0
  72. data/lib/active_merchant/billing/gateways/decidir_plus.rb +344 -0
  73. data/lib/active_merchant/billing/gateways/dibs.rb +199 -0
  74. data/lib/active_merchant/billing/gateways/digitzs.rb +295 -0
  75. data/lib/active_merchant/billing/gateways/ebanx.rb +346 -0
  76. data/lib/active_merchant/billing/gateways/efsnet.rb +215 -0
  77. data/lib/active_merchant/billing/gateways/elavon.rb +475 -0
  78. data/lib/active_merchant/billing/gateways/element.rb +406 -0
  79. data/lib/active_merchant/billing/gateways/epay.rb +296 -0
  80. data/lib/active_merchant/billing/gateways/evo_ca.rb +307 -0
  81. data/lib/active_merchant/billing/gateways/eway.rb +226 -0
  82. data/lib/active_merchant/billing/gateways/eway_managed.rb +289 -0
  83. data/lib/active_merchant/billing/gateways/eway_rapid.rb +578 -0
  84. data/lib/active_merchant/billing/gateways/exact.rb +219 -0
  85. data/lib/active_merchant/billing/gateways/ezic.rb +195 -0
  86. data/lib/active_merchant/billing/gateways/fat_zebra.rb +223 -0
  87. data/lib/active_merchant/billing/gateways/federated_canada.rb +158 -0
  88. data/lib/active_merchant/billing/gateways/finansbank.rb +22 -0
  89. data/lib/active_merchant/billing/gateways/first_giving.rb +143 -0
  90. data/lib/active_merchant/billing/gateways/first_pay.rb +182 -0
  91. data/lib/active_merchant/billing/gateways/firstdata_e4.rb +452 -0
  92. data/lib/active_merchant/billing/gateways/firstdata_e4_v27.rb +505 -0
  93. data/lib/active_merchant/billing/gateways/flo2cash.rb +215 -0
  94. data/lib/active_merchant/billing/gateways/flo2cash_simple.rb +20 -0
  95. data/lib/active_merchant/billing/gateways/fluidpay.rb +275 -0
  96. data/lib/active_merchant/billing/gateways/forte.rb +286 -0
  97. data/lib/active_merchant/billing/gateways/garanti.rb +256 -0
  98. data/lib/active_merchant/billing/gateways/global_collect.rb +580 -0
  99. data/lib/active_merchant/billing/gateways/global_transport.rb +193 -0
  100. data/lib/active_merchant/billing/gateways/hdfc.rb +205 -0
  101. data/lib/active_merchant/billing/gateways/hps.rb +472 -0
  102. data/lib/active_merchant/billing/gateways/iats_payments.rb +312 -0
  103. data/lib/active_merchant/billing/gateways/in_context_paypal_express.rb +15 -0
  104. data/lib/active_merchant/billing/gateways/inspire.rb +213 -0
  105. data/lib/active_merchant/billing/gateways/instapay.rb +159 -0
  106. data/lib/active_merchant/billing/gateways/ipg.rb +420 -0
  107. data/lib/active_merchant/billing/gateways/ipp.rb +176 -0
  108. data/lib/active_merchant/billing/gateways/iridium.rb +467 -0
  109. data/lib/active_merchant/billing/gateways/itransact.rb +448 -0
  110. data/lib/active_merchant/billing/gateways/iveri.rb +290 -0
  111. data/lib/active_merchant/billing/gateways/ixopay.rb +320 -0
  112. data/lib/active_merchant/billing/gateways/jetpay.rb +395 -0
  113. data/lib/active_merchant/billing/gateways/jetpay_v2.rb +432 -0
  114. data/lib/active_merchant/billing/gateways/klarna.rb +317 -0
  115. data/lib/active_merchant/billing/gateways/komoju.rb +115 -0
  116. data/lib/active_merchant/billing/gateways/kushki.rb +297 -0
  117. data/lib/active_merchant/billing/gateways/latitude19.rb +412 -0
  118. data/lib/active_merchant/billing/gateways/linkpoint.rb +448 -0
  119. data/lib/active_merchant/billing/gateways/litle.rb +643 -0
  120. data/lib/active_merchant/billing/gateways/mastercard.rb +286 -0
  121. data/lib/active_merchant/billing/gateways/maxipago.rb +220 -0
  122. data/lib/active_merchant/billing/gateways/mercado_pago.rb +348 -0
  123. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +228 -0
  124. data/lib/active_merchant/billing/gateways/merchant_one.rb +110 -0
  125. data/lib/active_merchant/billing/gateways/merchant_partners.rb +245 -0
  126. data/lib/active_merchant/billing/gateways/merchant_ware.rb +313 -0
  127. data/lib/active_merchant/billing/gateways/merchant_ware_version_four.rb +284 -0
  128. data/lib/active_merchant/billing/gateways/merchant_warrior.rb +248 -0
  129. data/lib/active_merchant/billing/gateways/mercury.rb +352 -0
  130. data/lib/active_merchant/billing/gateways/metrics_global.rb +293 -0
  131. data/lib/active_merchant/billing/gateways/micropayment.rb +182 -0
  132. data/lib/active_merchant/billing/gateways/migs/migs_codes.rb +100 -0
  133. data/lib/active_merchant/billing/gateways/migs.rb +329 -0
  134. data/lib/active_merchant/billing/gateways/mit.rb +260 -0
  135. data/lib/active_merchant/billing/gateways/modern_payments.rb +37 -0
  136. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +215 -0
  137. data/lib/active_merchant/billing/gateways/moka.rb +290 -0
  138. data/lib/active_merchant/billing/gateways/monei.rb +424 -0
  139. data/lib/active_merchant/billing/gateways/moneris.rb +488 -0
  140. data/lib/active_merchant/billing/gateways/money_movers.rb +150 -0
  141. data/lib/active_merchant/billing/gateways/mundipagg.rb +366 -0
  142. data/lib/active_merchant/billing/gateways/nab_transact.rb +299 -0
  143. data/lib/active_merchant/billing/gateways/ncr_secure_pay.rb +163 -0
  144. data/lib/active_merchant/billing/gateways/net_registry.rb +198 -0
  145. data/lib/active_merchant/billing/gateways/netaxept.rb +180 -0
  146. data/lib/active_merchant/billing/gateways/netbanx.rb +376 -0
  147. data/lib/active_merchant/billing/gateways/netbilling.rb +229 -0
  148. data/lib/active_merchant/billing/gateways/netpay.rb +223 -0
  149. data/lib/active_merchant/billing/gateways/network_merchants.rb +238 -0
  150. data/lib/active_merchant/billing/gateways/nmi.rb +396 -0
  151. data/lib/active_merchant/billing/gateways/ogone.rb +509 -0
  152. data/lib/active_merchant/billing/gateways/omise.rb +323 -0
  153. data/lib/active_merchant/billing/gateways/openpay.rb +246 -0
  154. data/lib/active_merchant/billing/gateways/opp.rb +394 -0
  155. data/lib/active_merchant/billing/gateways/optimal_payment.rb +331 -0
  156. data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +45 -0
  157. data/lib/active_merchant/billing/gateways/orbital.rb +1267 -0
  158. data/lib/active_merchant/billing/gateways/pac_net_raven.rb +206 -0
  159. data/lib/active_merchant/billing/gateways/pagarme.rb +239 -0
  160. data/lib/active_merchant/billing/gateways/pago_facil.rb +120 -0
  161. data/lib/active_merchant/billing/gateways/pay_arc.rb +392 -0
  162. data/lib/active_merchant/billing/gateways/pay_conex.rb +245 -0
  163. data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +277 -0
  164. data/lib/active_merchant/billing/gateways/pay_hub.rb +213 -0
  165. data/lib/active_merchant/billing/gateways/pay_junction.rb +390 -0
  166. data/lib/active_merchant/billing/gateways/pay_junction_v2.rb +206 -0
  167. data/lib/active_merchant/billing/gateways/pay_secure.rb +110 -0
  168. data/lib/active_merchant/billing/gateways/pay_trace.rb +450 -0
  169. data/lib/active_merchant/billing/gateways/paybox_direct.rb +224 -0
  170. data/lib/active_merchant/billing/gateways/payeezy.rb +513 -0
  171. data/lib/active_merchant/billing/gateways/payex.rb +409 -0
  172. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +235 -0
  173. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +42 -0
  174. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
  175. data/lib/active_merchant/billing/gateways/payflow.rb +473 -0
  176. data/lib/active_merchant/billing/gateways/payflow_express.rb +220 -0
  177. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +14 -0
  178. data/lib/active_merchant/billing/gateways/payflow_uk.rb +20 -0
  179. data/lib/active_merchant/billing/gateways/payment_express.rb +373 -0
  180. data/lib/active_merchant/billing/gateways/paymentez.rb +365 -0
  181. data/lib/active_merchant/billing/gateways/paymill.rb +369 -0
  182. data/lib/active_merchant/billing/gateways/paynetworx.rb +228 -0
  183. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +718 -0
  184. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +69 -0
  185. data/lib/active_merchant/billing/gateways/paypal/paypal_recurring_api.rb +262 -0
  186. data/lib/active_merchant/billing/gateways/paypal.rb +136 -0
  187. data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
  188. data/lib/active_merchant/billing/gateways/paypal_digital_goods.rb +44 -0
  189. data/lib/active_merchant/billing/gateways/paypal_express.rb +272 -0
  190. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +30 -0
  191. data/lib/active_merchant/billing/gateways/paypal_standard.rb +281 -0
  192. data/lib/active_merchant/billing/gateways/paysafe.rb +420 -0
  193. data/lib/active_merchant/billing/gateways/payscout.rb +159 -0
  194. data/lib/active_merchant/billing/gateways/paystation.rb +204 -0
  195. data/lib/active_merchant/billing/gateways/payu_in.rb +249 -0
  196. data/lib/active_merchant/billing/gateways/payu_latam.rb +482 -0
  197. data/lib/active_merchant/billing/gateways/payway.rb +207 -0
  198. data/lib/active_merchant/billing/gateways/payway_dot_com.rb +253 -0
  199. data/lib/active_merchant/billing/gateways/pin.rb +273 -0
  200. data/lib/active_merchant/billing/gateways/pixxels.rb +263 -0
  201. data/lib/active_merchant/billing/gateways/plexo.rb +308 -0
  202. data/lib/active_merchant/billing/gateways/plugnpay.rb +283 -0
  203. data/lib/active_merchant/billing/gateways/priority.rb +392 -0
  204. data/lib/active_merchant/billing/gateways/pro_pay.rb +325 -0
  205. data/lib/active_merchant/billing/gateways/psigate.rb +227 -0
  206. data/lib/active_merchant/billing/gateways/psl_card.rb +295 -0
  207. data/lib/active_merchant/billing/gateways/qbms.rb +302 -0
  208. data/lib/active_merchant/billing/gateways/quantum.rb +274 -0
  209. data/lib/active_merchant/billing/gateways/quickbooks.rb +377 -0
  210. data/lib/active_merchant/billing/gateways/quickpay/quickpay_common.rb +184 -0
  211. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb +297 -0
  212. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v4to7.rb +226 -0
  213. data/lib/active_merchant/billing/gateways/quickpay.rb +24 -0
  214. data/lib/active_merchant/billing/gateways/qvalent.rb +305 -0
  215. data/lib/active_merchant/billing/gateways/rapyd.rb +319 -0
  216. data/lib/active_merchant/billing/gateways/reach.rb +277 -0
  217. data/lib/active_merchant/billing/gateways/realex.rb +400 -0
  218. data/lib/active_merchant/billing/gateways/redsys.rb +723 -0
  219. data/lib/active_merchant/billing/gateways/s5.rb +247 -0
  220. data/lib/active_merchant/billing/gateways/safe_charge.rb +298 -0
  221. data/lib/active_merchant/billing/gateways/sage.rb +446 -0
  222. data/lib/active_merchant/billing/gateways/sage_pay.rb +434 -0
  223. data/lib/active_merchant/billing/gateways/sallie_mae.rb +141 -0
  224. data/lib/active_merchant/billing/gateways/secure_net.rb +260 -0
  225. data/lib/active_merchant/billing/gateways/secure_pay.rb +191 -0
  226. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +290 -0
  227. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +103 -0
  228. data/lib/active_merchant/billing/gateways/securion_pay.rb +305 -0
  229. data/lib/active_merchant/billing/gateways/shift4.rb +345 -0
  230. data/lib/active_merchant/billing/gateways/simetrik.rb +368 -0
  231. data/lib/active_merchant/billing/gateways/skip_jack.rb +450 -0
  232. data/lib/active_merchant/billing/gateways/smart_ps.rb +274 -0
  233. data/lib/active_merchant/billing/gateways/so_easy_pay.rb +194 -0
  234. data/lib/active_merchant/billing/gateways/spreedly_core.rb +354 -0
  235. data/lib/active_merchant/billing/gateways/stripe.rb +866 -0
  236. data/lib/active_merchant/billing/gateways/stripe_payment_intents.rb +602 -0
  237. data/lib/active_merchant/billing/gateways/swipe_checkout.rb +151 -0
  238. data/lib/active_merchant/billing/gateways/telr.rb +273 -0
  239. data/lib/active_merchant/billing/gateways/tns.rb +23 -0
  240. data/lib/active_merchant/billing/gateways/trans_first.rb +240 -0
  241. data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +612 -0
  242. data/lib/active_merchant/billing/gateways/transact_pro.rb +222 -0
  243. data/lib/active_merchant/billing/gateways/transax.rb +21 -0
  244. data/lib/active_merchant/billing/gateways/transnational.rb +9 -0
  245. data/lib/active_merchant/billing/gateways/trexle.rb +221 -0
  246. data/lib/active_merchant/billing/gateways/trust_commerce.rb +500 -0
  247. data/lib/active_merchant/billing/gateways/usa_epay.rb +24 -0
  248. data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +1612 -0
  249. data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +367 -0
  250. data/lib/active_merchant/billing/gateways/vanco.rb +303 -0
  251. data/lib/active_merchant/billing/gateways/verifi.rb +224 -0
  252. data/lib/active_merchant/billing/gateways/viaklix.rb +171 -0
  253. data/lib/active_merchant/billing/gateways/visanet_peru.rb +250 -0
  254. data/lib/active_merchant/billing/gateways/vpos.rb +223 -0
  255. data/lib/active_merchant/billing/gateways/webpay.rb +97 -0
  256. data/lib/active_merchant/billing/gateways/wepay.rb +235 -0
  257. data/lib/active_merchant/billing/gateways/wirecard.rb +430 -0
  258. data/lib/active_merchant/billing/gateways/wompi.rb +197 -0
  259. data/lib/active_merchant/billing/gateways/world_net.rb +345 -0
  260. data/lib/active_merchant/billing/gateways/worldpay.rb +1050 -0
  261. data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +208 -0
  262. data/lib/active_merchant/billing/gateways/worldpay_us.rb +221 -0
  263. data/lib/active_merchant/billing/gateways.rb +14 -0
  264. data/lib/active_merchant/billing/model.rb +30 -0
  265. data/lib/active_merchant/billing/network_tokenization_credit_card.rb +39 -0
  266. data/lib/active_merchant/billing/payment_token.rb +21 -0
  267. data/lib/active_merchant/billing/rails.rb +3 -0
  268. data/lib/active_merchant/billing/response.rb +121 -0
  269. data/lib/active_merchant/billing/three_d_secure_eci_mapper.rb +27 -0
  270. data/lib/active_merchant/billing.rb +16 -0
  271. data/lib/active_merchant/connection.rb +194 -0
  272. data/lib/active_merchant/country.rb +338 -0
  273. data/lib/active_merchant/empty.rb +20 -0
  274. data/lib/active_merchant/errors.rb +38 -0
  275. data/lib/active_merchant/net_http_ssl_connection.rb +11 -0
  276. data/lib/active_merchant/network_connection_retries.rb +78 -0
  277. data/lib/active_merchant/post_data.rb +26 -0
  278. data/lib/active_merchant/posts_data.rb +92 -0
  279. data/lib/active_merchant/version.rb +3 -0
  280. data/lib/active_merchant.rb +63 -0
  281. data/lib/activemerchant.rb +1 -0
  282. data/lib/certs/cacert.pem +3214 -0
  283. data/lib/support/gateway_support.rb +69 -0
  284. data/lib/support/outbound_hosts.rb +28 -0
  285. data/lib/support/ssl_verify.rb +88 -0
  286. data/lib/support/ssl_version.rb +86 -0
  287. metadata +506 -0
@@ -0,0 +1,348 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class MercadoPagoGateway < Gateway
4
+ self.live_url = self.test_url = 'https://api.mercadopago.com/v1'
5
+
6
+ self.supported_countries = %w[AR BR CL CO MX PE UY]
7
+ self.supported_cardtypes = %i[visa master american_express elo cabal naranja creditel]
8
+
9
+ self.homepage_url = 'https://www.mercadopago.com/'
10
+ self.display_name = 'Mercado Pago'
11
+ self.money_format = :dollars
12
+
13
+ def initialize(options = {})
14
+ requires!(options, :access_token)
15
+ super
16
+ end
17
+
18
+ def purchase(money, payment, options = {})
19
+ MultiResponse.run do |r|
20
+ r.process { commit('tokenize', 'card_tokens', card_token_request(money, payment, options)) }
21
+ options[:card_token] = r.authorization.split('|').first
22
+ r.process { commit('purchase', 'payments', purchase_request(money, payment, options)) }
23
+ end
24
+ end
25
+
26
+ def authorize(money, payment, options = {})
27
+ MultiResponse.run do |r|
28
+ r.process { commit('tokenize', 'card_tokens', card_token_request(money, payment, options)) }
29
+ options[:card_token] = r.authorization.split('|').first
30
+ r.process { commit('authorize', 'payments', authorize_request(money, payment, options)) }
31
+ end
32
+ end
33
+
34
+ def capture(money, authorization, options = {})
35
+ post = {}
36
+ authorization, = authorization.split('|')
37
+ post[:capture] = true
38
+ post[:transaction_amount] = amount(money).to_f
39
+ commit('capture', "payments/#{authorization}", post)
40
+ end
41
+
42
+ def refund(money, authorization, options = {})
43
+ post = {}
44
+ authorization, original_amount = authorization.split('|')
45
+ post[:amount] = amount(money).to_f if original_amount && original_amount.to_f > amount(money).to_f
46
+ commit('refund', "payments/#{authorization}/refunds", post)
47
+ end
48
+
49
+ def void(authorization, options = {})
50
+ authorization, = authorization.split('|')
51
+ post = { status: 'cancelled' }
52
+ commit('void', "payments/#{authorization}", post)
53
+ end
54
+
55
+ def verify(credit_card, options = {})
56
+ verify_amount = 100
57
+ verify_amount = options[:amount].to_i if options[:amount]
58
+ MultiResponse.run(:use_first_response) do |r|
59
+ r.process { authorize(verify_amount, credit_card, options) }
60
+ r.process(:ignore_result) { void(r.authorization, options) }
61
+ end
62
+ end
63
+
64
+ def inquire(authorization, options = {})
65
+ commit('inquire', inquire_path(authorization, options), {})
66
+ end
67
+
68
+ def supports_scrubbing?
69
+ true
70
+ end
71
+
72
+ def scrub(transcript)
73
+ transcript.
74
+ gsub(%r((access_token=).*?([^\s]+)), '\1[FILTERED]').
75
+ gsub(%r((\"card_number\\\":\\\")\d+), '\1[FILTERED]').
76
+ gsub(%r((\"security_code\\\":\\\")\d+), '\1[FILTERED]')
77
+ end
78
+
79
+ private
80
+
81
+ def card_token_request(money, payment, options = {})
82
+ post = {}
83
+ post[:card_number] = payment.number
84
+ post[:security_code] = payment.verification_value
85
+ post[:expiration_month] = payment.month
86
+ post[:expiration_year] = payment.year
87
+ post[:cardholder] = {
88
+ name: payment.name,
89
+ identification: {
90
+ type: options[:cardholder_identification_type],
91
+ number: options[:cardholder_identification_number]
92
+ }
93
+ }
94
+ post
95
+ end
96
+
97
+ def purchase_request(money, payment, options = {})
98
+ post = {}
99
+ add_invoice(post, money, options)
100
+ add_payment(post, options)
101
+ add_additional_data(post, options)
102
+ add_customer_data(post, payment, options)
103
+ add_address(post, options)
104
+ add_processing_mode(post, options)
105
+ add_net_amount(post, options)
106
+ add_taxes(post, options)
107
+ add_notification_url(post, options)
108
+ post[:binary_mode] = (options[:binary_mode].nil? ? true : options[:binary_mode])
109
+ post
110
+ end
111
+
112
+ def authorize_request(money, payment, options = {})
113
+ post = purchase_request(money, payment, options)
114
+ post[:capture] = options[:capture] || false
115
+ post
116
+ end
117
+
118
+ def add_processing_mode(post, options)
119
+ return unless options[:processing_mode]
120
+
121
+ post[:processing_mode] = options[:processing_mode]
122
+ post[:merchant_account_id] = options[:merchant_account_id] if options[:merchant_account_id]
123
+ post[:payment_method_option_id] = options[:payment_method_option_id] if options[:payment_method_option_id]
124
+ add_merchant_services(post, options)
125
+ end
126
+
127
+ def add_merchant_services(post, options)
128
+ return unless options[:fraud_scoring] || options[:fraud_manual_review]
129
+
130
+ merchant_services = {}
131
+ merchant_services[:fraud_scoring] = options[:fraud_scoring] if options[:fraud_scoring]
132
+ merchant_services[:fraud_manual_review] = options[:fraud_manual_review] if options[:fraud_manual_review]
133
+ post[:merchant_services] = merchant_services
134
+ end
135
+
136
+ def add_additional_data(post, options)
137
+ post[:sponsor_id] = options[:sponsor_id]
138
+ post[:metadata] = options[:metadata] if options[:metadata]
139
+ post[:device_id] = options[:device_id] if options[:device_id]
140
+ post[:additional_info] = {
141
+ ip_address: options[:ip_address]
142
+ }.merge(options[:additional_info] || {})
143
+
144
+ add_address(post, options)
145
+ add_shipping_address(post, options)
146
+ end
147
+
148
+ def add_customer_data(post, payment, options)
149
+ post[:payer] = {
150
+ email: options[:email],
151
+ first_name: payment.first_name,
152
+ last_name: payment.last_name
153
+ }.merge(options[:payer] || {})
154
+ end
155
+
156
+ def add_address(post, options)
157
+ if address = (options[:billing_address] || options[:address])
158
+
159
+ post[:additional_info].merge!({
160
+ payer: {
161
+ address: {
162
+ zip_code: address[:zip],
163
+ street_name: "#{address[:address1]} #{address[:address2]}"
164
+ }
165
+ }
166
+ })
167
+ end
168
+ end
169
+
170
+ def add_shipping_address(post, options)
171
+ if address = options[:shipping_address]
172
+
173
+ post[:additional_info].merge!({
174
+ shipments: {
175
+ receiver_address: {
176
+ zip_code: address[:zip],
177
+ street_name: "#{address[:address1]} #{address[:address2]}"
178
+ }
179
+ }
180
+ })
181
+ end
182
+ end
183
+
184
+ def split_street_address(address1)
185
+ street_number = address1.split(' ').first
186
+
187
+ if street_name = address1.split(' ')[1..-1]
188
+ street_name = street_name.join(' ')
189
+ else
190
+ nil
191
+ end
192
+
193
+ [street_number, street_name]
194
+ end
195
+
196
+ def add_invoice(post, money, options)
197
+ post[:transaction_amount] = amount(money).to_f
198
+ post[:description] = options[:description]
199
+ post[:installments] = options[:installments] ? options[:installments].to_i : 1
200
+ post[:statement_descriptor] = options[:statement_descriptor] if options[:statement_descriptor]
201
+ post[:external_reference] = options[:order_id] || options[:external_reference] || SecureRandom.hex(16)
202
+ end
203
+
204
+ def add_payment(post, options)
205
+ post[:token] = options[:card_token]
206
+ post[:issuer_id] = options[:issuer_id] if options[:issuer_id]
207
+ post[:payment_method_id] = options[:payment_method_id] if options[:payment_method_id]
208
+ end
209
+
210
+ def add_net_amount(post, options)
211
+ post[:net_amount] = Float(options[:net_amount]) if options[:net_amount]
212
+ end
213
+
214
+ def add_notification_url(post, options)
215
+ post[:notification_url] = options[:notification_url] if options[:notification_url]
216
+ end
217
+
218
+ def add_taxes(post, options)
219
+ return unless (tax_object = options[:taxes])
220
+
221
+ if tax_object.is_a?(Array)
222
+ post[:taxes] = process_taxes_array(tax_object)
223
+ elsif tax_object.is_a?(Hash)
224
+ post[:taxes] = process_taxes_hash(tax_object)
225
+ else
226
+ raise taxes_error
227
+ end
228
+ end
229
+
230
+ def process_taxes_hash(tax_object)
231
+ [sanitize_taxes_hash(tax_object)]
232
+ end
233
+
234
+ def process_taxes_array(taxes_array)
235
+ taxes_array.map do |tax_object|
236
+ raise taxes_error unless tax_object.is_a?(Hash)
237
+
238
+ sanitize_taxes_hash(tax_object)
239
+ end
240
+ end
241
+
242
+ def sanitize_taxes_hash(tax_object)
243
+ tax_value = tax_object['value'] || tax_object[:value]
244
+ tax_type = tax_object['type'] || tax_object[:type]
245
+
246
+ raise taxes_error if tax_value.nil? || tax_type.nil?
247
+
248
+ { value: Float(tax_value), type: tax_type }
249
+ end
250
+
251
+ def taxes_error
252
+ ArgumentError.new("Taxes should be a single object or array of objects with the shape: { value: 500, type: 'IVA' }")
253
+ end
254
+
255
+ def parse(body)
256
+ JSON.parse(body)
257
+ rescue JSON::ParserError
258
+ {
259
+ 'status' => 'error',
260
+ 'status_detail' => 'json_parse_error',
261
+ 'message' => "A non-JSON response was received from Mercado Pago where one was expected. The raw response was:\n\n#{body}"
262
+ }
263
+ end
264
+
265
+ def commit(action, path, parameters)
266
+ if %w[capture void].include?(action)
267
+ response = parse(ssl_request(:put, url(path), post_data(parameters), headers))
268
+ elsif action == 'inquire'
269
+ response = parse(ssl_get(url(path), headers))
270
+
271
+ response = response[0]['results'][0] if response.is_a?(Array)
272
+ else
273
+ response = parse(ssl_post(url(path), post_data(parameters), headers(parameters)))
274
+ end
275
+
276
+ Response.new(
277
+ success_from(action, response),
278
+ message_from(response),
279
+ response,
280
+ authorization: authorization_from(response, parameters),
281
+ test: test?,
282
+ error_code: error_code_from(action, response)
283
+ )
284
+ end
285
+
286
+ def success_from(action, response)
287
+ if action == 'refund'
288
+ response['status'] != 404 && response['error'].nil?
289
+ else
290
+ %w[active approved authorized cancelled in_process].include?(response['status'])
291
+ end
292
+ end
293
+
294
+ def message_from(response)
295
+ (response['status_detail']) || (response['message'])
296
+ end
297
+
298
+ def authorization_from(response, params)
299
+ [response['id'], params[:transaction_amount]].join('|')
300
+ end
301
+
302
+ def post_data(parameters = {})
303
+ parameters.clone.tap { |p| p.delete(:device_id) }.to_json
304
+ end
305
+
306
+ def inquire_path(authorization, options)
307
+ if authorization
308
+ authorization, = authorization.split('|')
309
+ "payments/#{authorization}"
310
+ else
311
+ "payments/search?external_reference=#{options[:order_id] || options[:external_reference]}"
312
+ end
313
+ end
314
+
315
+ def error_code_from(action, response)
316
+ unless success_from(action, response)
317
+ if cause = response['cause']
318
+ cause.empty? ? nil : cause.first['code']
319
+ else
320
+ response['status']
321
+ end
322
+ end
323
+ end
324
+
325
+ def url(action)
326
+ full_url = (test? ? test_url : live_url)
327
+ full_url + "/#{action}?access_token=#{CGI.escape(@options[:access_token])}"
328
+ end
329
+
330
+ def headers(options = {})
331
+ headers = {
332
+ 'Content-Type' => 'application/json'
333
+ }
334
+ headers['X-meli-session-id'] = options[:device_id] if options[:device_id]
335
+ headers
336
+ end
337
+
338
+ def handle_response(response)
339
+ case response.code.to_i
340
+ when 200..499
341
+ response.body
342
+ else
343
+ raise ResponseError.new(response)
344
+ end
345
+ end
346
+ end
347
+ end
348
+ end
@@ -0,0 +1,228 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class MerchantESolutionsGateway < Gateway
4
+ include Empty
5
+
6
+ self.test_url = 'https://cert.merchante-solutions.com/mes-api/tridentApi'
7
+ self.live_url = 'https://api.merchante-solutions.com/mes-api/tridentApi'
8
+
9
+ # The countries the gateway supports merchants from as 2 digit ISO country codes
10
+ self.supported_countries = ['US']
11
+
12
+ # The card types supported by the payment gateway
13
+ self.supported_cardtypes = %i[visa master american_express discover jcb]
14
+
15
+ # The homepage URL of the gateway
16
+ self.homepage_url = 'http://www.merchante-solutions.com/'
17
+
18
+ # The name of the gateway
19
+ self.display_name = 'Merchant e-Solutions'
20
+
21
+ SUCCESS_RESPONSE_CODES = %w(000 085)
22
+
23
+ def initialize(options = {})
24
+ requires!(options, :login, :password)
25
+ super
26
+ end
27
+
28
+ def authorize(money, creditcard_or_card_id, options = {})
29
+ post = {}
30
+ add_invoice(post, options)
31
+ add_payment_source(post, creditcard_or_card_id, options)
32
+ add_address(post, options)
33
+ add_3dsecure_params(post, options)
34
+ add_stored_credentials(post, options)
35
+ commit('P', money, post)
36
+ end
37
+
38
+ def purchase(money, creditcard_or_card_id, options = {})
39
+ post = {}
40
+ add_invoice(post, options)
41
+ add_payment_source(post, creditcard_or_card_id, options)
42
+ add_address(post, options)
43
+ add_3dsecure_params(post, options)
44
+ add_stored_credentials(post, options)
45
+ commit('D', money, post)
46
+ end
47
+
48
+ def capture(money, transaction_id, options = {})
49
+ post = {}
50
+ post[:transaction_id] = transaction_id
51
+ post[:client_reference_number] = options[:customer] if options.has_key?(:customer)
52
+ add_invoice(post, options)
53
+ add_3dsecure_params(post, options)
54
+ commit('S', money, post)
55
+ end
56
+
57
+ def store(creditcard, options = {})
58
+ MultiResponse.run do |r|
59
+ r.process { temporary_store(creditcard, options) }
60
+ r.process { verify(r.authorization, { store_card: 'y' }) }
61
+ end
62
+ end
63
+
64
+ def unstore(card_id, options = {})
65
+ post = {}
66
+ post[:client_reference_number] = options[:customer] if options.has_key?(:customer)
67
+ post[:card_id] = card_id
68
+ commit('X', nil, post)
69
+ end
70
+
71
+ def refund(money, identification, options = {})
72
+ post = {}
73
+ post[:transaction_id] = identification
74
+ post[:client_reference_number] = options[:customer] if options.has_key?(:customer)
75
+ options.delete(:customer)
76
+ options.delete(:billing_address)
77
+ commit('U', money, options.merge(post))
78
+ end
79
+
80
+ def credit(money, creditcard_or_card_id, options = {})
81
+ post = {}
82
+ post[:client_reference_number] = options[:customer] if options.has_key?(:customer)
83
+ add_invoice(post, options)
84
+ add_payment_source(post, creditcard_or_card_id, options)
85
+ commit('C', money, post)
86
+ end
87
+
88
+ def void(transaction_id, options = {})
89
+ post = {}
90
+ post[:transaction_id] = transaction_id
91
+ post[:client_reference_number] = options[:customer] if options.has_key?(:customer)
92
+ options.delete(:customer)
93
+ options.delete(:billing_address)
94
+ commit('V', nil, options.merge(post))
95
+ end
96
+
97
+ def verify(credit_card, options = {})
98
+ post = {}
99
+ post[:store_card] = options[:store_card] if options[:store_card]
100
+ add_payment_source(post, credit_card, options)
101
+ commit('A', 0, post)
102
+ end
103
+
104
+ def supports_scrubbing?
105
+ true
106
+ end
107
+
108
+ def scrub(transcript)
109
+ transcript.
110
+ gsub(%r((&?profile_key=)\w*(&?)), '\1[FILTERED]\2').
111
+ gsub(%r((&?card_number=)\d*(&?)), '\1[FILTERED]\2').
112
+ gsub(%r((&?cvv2=)\d*(&?)), '\1[FILTERED]\2')
113
+ end
114
+
115
+ private
116
+
117
+ def temporary_store(creditcard, options = {})
118
+ post = {}
119
+ post[:client_reference_number] = options[:customer] if options.has_key?(:customer)
120
+ add_creditcard(post, creditcard, options)
121
+ commit('T', nil, post)
122
+ end
123
+
124
+ def add_address(post, options)
125
+ if address = options[:billing_address] || options[:address]
126
+ post[:cardholder_street_address] = address[:address1].to_s.gsub(/[^\w.]/, '+')
127
+ post[:cardholder_zip] = address[:zip].to_s
128
+ end
129
+ end
130
+
131
+ def add_invoice(post, options)
132
+ if options.has_key? :order_id
133
+ order_id = options[:order_id].to_s.gsub(/[^\w.]/, '')
134
+ post[:invoice_number] = truncate(order_id, 17)
135
+ end
136
+ end
137
+
138
+ def add_payment_source(post, creditcard_or_card_id, options)
139
+ if creditcard_or_card_id.is_a?(String)
140
+ # using stored card
141
+ post[:card_id] = creditcard_or_card_id
142
+ post[:card_exp_date] = options[:expiration_date] if options[:expiration_date]
143
+ else
144
+ # card info is provided
145
+ add_creditcard(post, creditcard_or_card_id, options)
146
+ end
147
+ end
148
+
149
+ def add_creditcard(post, creditcard, options)
150
+ post[:card_number] = creditcard.number
151
+ post[:cvv2] = creditcard.verification_value if creditcard.verification_value?
152
+ post[:card_exp_date] = expdate(creditcard)
153
+ end
154
+
155
+ def add_3dsecure_params(post, options)
156
+ post[:xid] = options[:xid] unless empty?(options[:xid])
157
+ post[:cavv] = options[:cavv] unless empty?(options[:cavv])
158
+ post[:ucaf_collection_ind] = options[:ucaf_collection_ind] unless empty?(options[:ucaf_collection_ind])
159
+ post[:ucaf_auth_data] = options[:ucaf_auth_data] unless empty?(options[:ucaf_auth_data])
160
+ end
161
+
162
+ def add_stored_credentials(post, options)
163
+ post[:client_reference_number] = options[:client_reference_number] if options[:client_reference_number]
164
+ post[:moto_ecommerce_ind] = options[:moto_ecommerce_ind] if options[:moto_ecommerce_ind]
165
+ post[:recurring_pmt_num] = options[:recurring_pmt_num] if options[:recurring_pmt_num]
166
+ post[:recurring_pmt_count] = options[:recurring_pmt_count] if options[:recurring_pmt_count]
167
+ post[:card_on_file] = options[:card_on_file] if options[:card_on_file]
168
+ post[:cit_mit_indicator] = options[:cit_mit_indicator] if options[:cit_mit_indicator]
169
+ post[:account_data_source] = options[:account_data_source] if options[:account_data_source]
170
+ end
171
+
172
+ def parse(body)
173
+ results = {}
174
+ body.split(/&/).each do |pair|
175
+ key, val = pair.split(/=/)
176
+ results[key] = val
177
+ end
178
+ results
179
+ end
180
+
181
+ def commit(action, money, parameters)
182
+ url = test? ? self.test_url : self.live_url
183
+ parameters[:transaction_amount] = amount(money) if money unless action == 'V'
184
+
185
+ response =
186
+ begin
187
+ parse(ssl_post(url, post_data(action, parameters)))
188
+ rescue ActiveMerchant::ResponseError => e
189
+ { 'error_code' => '404', 'auth_response_text' => e.to_s }
190
+ end
191
+
192
+ Response.new(success_from(response), message_from(response), response,
193
+ authorization: authorization_from(response),
194
+ test: test?,
195
+ cvv_result: response['cvv2_result'],
196
+ avs_result: { code: response['avs_result'] })
197
+ end
198
+
199
+ def authorization_from(response)
200
+ return response['card_id'] if response['card_id']
201
+
202
+ response['transaction_id']
203
+ end
204
+
205
+ def success_from(response)
206
+ SUCCESS_RESPONSE_CODES.include?(response['error_code'])
207
+ end
208
+
209
+ def message_from(response)
210
+ if response['error_code'] == '000'
211
+ 'This transaction has been approved'
212
+ else
213
+ response['auth_response_text']
214
+ end
215
+ end
216
+
217
+ def post_data(action, parameters = {})
218
+ post = {}
219
+ post[:profile_id] = @options[:login]
220
+ post[:profile_key] = @options[:password]
221
+ post[:transaction_type] = action if action
222
+
223
+ request = post.merge(parameters).map { |key, value| "#{key}=#{CGI.escape(value.to_s)}" }.join('&')
224
+ request
225
+ end
226
+ end
227
+ end
228
+ end
@@ -0,0 +1,110 @@
1
+ require 'cgi'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ class MerchantOneGateway < Gateway
6
+ class MerchantOneSslConnection < ActiveMerchant::Connection
7
+ def configure_ssl(http)
8
+ super(http)
9
+ http.use_ssl = true
10
+ end
11
+ end
12
+
13
+ BASE_URL = 'https://secure.merchantonegateway.com/api/transact.php'
14
+
15
+ self.supported_countries = ['US']
16
+ self.supported_cardtypes = %i[visa master american_express discover]
17
+ self.homepage_url = 'http://merchantone.com/'
18
+ self.display_name = 'Merchant One Gateway'
19
+ self.money_format = :dollars
20
+
21
+ def initialize(options = {})
22
+ requires!(options, :username, :password)
23
+ super
24
+ end
25
+
26
+ def authorize(money, creditcard, options = {})
27
+ post = {}
28
+ add_customer_data(post, options)
29
+ add_creditcard(post, creditcard)
30
+ add_address(post, creditcard, options)
31
+ add_customer_data(post, options)
32
+ add_amount(post, money, options)
33
+ commit('auth', money, post)
34
+ end
35
+
36
+ def purchase(money, creditcard, options = {})
37
+ post = {}
38
+ add_customer_data(post, options)
39
+ add_creditcard(post, creditcard)
40
+ add_address(post, creditcard, options)
41
+ add_customer_data(post, options)
42
+ add_amount(post, money, options)
43
+ commit('sale', money, post)
44
+ end
45
+
46
+ def capture(money, authorization, options = {})
47
+ post = {}
48
+ post[:transactionid] = authorization
49
+ add_amount(post, money, options)
50
+ commit('capture', money, post)
51
+ end
52
+
53
+ def new_connection(endpoint)
54
+ MerchantOneSslConnection.new(endpoint)
55
+ end
56
+
57
+ private
58
+
59
+ def add_customer_data(post, options)
60
+ post['firstname'] = options[:billing_address][:first_name]
61
+ post['lastname'] = options[:billing_address][:last_name]
62
+ end
63
+
64
+ def add_amount(post, money, options)
65
+ post['amount'] = amount(money)
66
+ end
67
+
68
+ def add_address(post, creditcard, options)
69
+ post['address1'] = options[:billing_address][:address1]
70
+ post['city'] = options[:billing_address][:city]
71
+ post['state'] = options[:billing_address][:state]
72
+ post['zip'] = options[:billing_address][:zip]
73
+ post['country'] = options[:billing_address][:country]
74
+ end
75
+
76
+ def add_creditcard(post, creditcard)
77
+ post['cvv'] = creditcard.verification_value
78
+ post['ccnumber'] = creditcard.number
79
+ post['ccexp'] = "#{sprintf('%02d', creditcard.month)}#{creditcard.year.to_s[-2, 2]}"
80
+ end
81
+
82
+ def commit(action, money, parameters = {})
83
+ parameters['username'] = @options[:username]
84
+ parameters['password'] = @options[:password]
85
+ parse(ssl_post(BASE_URL, post_data(action, parameters)))
86
+ end
87
+
88
+ def post_data(action, parameters = {})
89
+ parameters[:type] = action
90
+ ret = ''
91
+ for key in parameters.keys
92
+ ret += "#{key}=#{CGI.escape(parameters[key].to_s)}"
93
+ ret += '&' if key != parameters.keys.last
94
+ end
95
+ ret.to_s
96
+ end
97
+
98
+ def parse(data)
99
+ responses = CGI.parse(data).inject({}) { |h, (k, v)| h[k] = v.first; h }
100
+ Response.new(
101
+ (responses['response'].to_i == 1),
102
+ responses['responsetext'],
103
+ responses,
104
+ test: test?,
105
+ authorization: responses['transactionid']
106
+ )
107
+ end
108
+ end
109
+ end
110
+ end