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,509 @@
1
+ # coding: utf-8
2
+
3
+ require 'rexml/document'
4
+
5
+ module ActiveMerchant #:nodoc:
6
+ module Billing #:nodoc:
7
+ # = Ogone DirectLink Gateway
8
+ #
9
+ # DirectLink is the API version of the Ogone Payment Platform. It allows server to server
10
+ # communication between Ogone systems and your e-commerce website.
11
+ #
12
+ # This implementation follows the specification provided in the DirectLink integration
13
+ # guide version 4.3.0 (25 April 2012), available here:
14
+ # https://secure.ogone.com/ncol/Ogone_DirectLink_EN.pdf
15
+ #
16
+ # It also features aliases, which allow to store/unstore credit cards, as specified in
17
+ # the Alias Manager Option guide version 3.2.1 (25 April 2012) available here:
18
+ # https://secure.ogone.com/ncol/Ogone_Alias_EN.pdf
19
+ #
20
+ # It also implements the 3-D Secure feature, as specified in the DirectLink with
21
+ # 3-D Secure guide version 3.0 (25 April 2012) available here:
22
+ # https://secure.ogone.com/ncol/Ogone_DirectLink-3-D_EN.pdf
23
+ #
24
+ # It was last tested on Release 4.92 of Ogone DirectLink + AliasManager + Direct Link 3D
25
+ # (25 April 2012).
26
+ #
27
+ # For any questions or comments, please contact one of the following:
28
+ # - Joel Cogen (joel.cogen@belighted.com)
29
+ # - Nicolas Jacobeus (nicolas.jacobeus@belighted.com),
30
+ # - Sébastien Grosjean (public@zencocoon.com),
31
+ # - Rémy Coutable (remy@jilion.com).
32
+ #
33
+ # == Usage
34
+ #
35
+ # gateway = ActiveMerchant::Billing::OgoneGateway.new(
36
+ # :login => "my_ogone_psp_id",
37
+ # :user => "my_ogone_user_id",
38
+ # :password => "my_ogone_pswd",
39
+ # :signature => "my_ogone_sha_signature", # Only if you configured your Ogone environment so.
40
+ # :signature_encryptor => "sha512" # Can be "none" (default), "sha1", "sha256" or "sha512".
41
+ # # Must be the same as the one configured in your Ogone account.
42
+ # )
43
+ #
44
+ # # set up credit card object as in main ActiveMerchant example
45
+ # creditcard = ActiveMerchant::Billing::CreditCard.new(
46
+ # :type => 'visa',
47
+ # :number => '4242424242424242',
48
+ # :month => 8,
49
+ # :year => 2009,
50
+ # :first_name => 'Bob',
51
+ # :last_name => 'Bobsen'
52
+ # )
53
+ #
54
+ # # run request
55
+ # response = gateway.purchase(1000, creditcard, :order_id => "1") # charge 10 EUR
56
+ #
57
+ # If you don't provide an :order_id, the gateway will generate a random one for you.
58
+ #
59
+ # puts response.success? # Check whether the transaction was successful
60
+ # puts response.message # Retrieve the message returned by Ogone
61
+ # puts response.authorization # Retrieve the unique transaction ID returned by Ogone
62
+ # puts response.order_id # Retrieve the order ID
63
+ #
64
+ # == Alias feature
65
+ #
66
+ # To use the alias feature, simply add :billing_id in the options hash:
67
+ #
68
+ # # Associate the alias to that credit card
69
+ # gateway.purchase(1000, creditcard, :order_id => "1", :billing_id => "myawesomecustomer")
70
+ #
71
+ # # You can use the alias instead of the credit card for subsequent orders
72
+ # gateway.purchase(2000, "myawesomecustomer", :order_id => "2")
73
+ #
74
+ # # You can also create an alias without making a purchase using store
75
+ # gateway.store(creditcard, :billing_id => "myawesomecustomer")
76
+ #
77
+ # # When using store, you can also let Ogone generate the alias for you
78
+ # response = gateway.store(creditcard)
79
+ # puts response.billing_id # Retrieve the generated alias
80
+ #
81
+ # # By default, Ogone tries to authorize 0.01 EUR but you can change this
82
+ # # amount using the :store_amount option when creating the gateway object:
83
+ # gateway = ActiveMerchant::Billing::OgoneGateway.new(
84
+ # :login => "my_ogone_psp_id",
85
+ # :user => "my_ogone_user_id",
86
+ # :password => "my_ogone_pswd",
87
+ # :signature => "my_ogone_sha_signature",
88
+ # :signature_encryptor => "sha512",
89
+ # :store_amount => 100 # The store method will try to authorize 1 EUR instead of 0.01 EUR
90
+ # )
91
+ # response = gateway.store(creditcard) # authorize 1 EUR and void the authorization right away
92
+ #
93
+ # == 3-D Secure feature
94
+ #
95
+ # To use the 3-D Secure feature, simply add :d3d => true in the options hash:
96
+ # gateway.purchase(2000, "myawesomecustomer", :order_id => "2", :d3d => true)
97
+ #
98
+ # Specific 3-D Secure request options are (please refer to the documentation for more infos about these options):
99
+ # :win_3ds => :main_window (default), :pop_up or :pop_ix.
100
+ # :http_accept => "*/*" (default), or any other HTTP_ACCEPT header value.
101
+ # :http_user_agent => The cardholder's User-Agent string
102
+ # :accept_url => URL of the web page to show the customer when the payment is authorized.
103
+ # (or waiting to be authorized).
104
+ # :decline_url => URL of the web page to show the customer when the acquirer rejects the authorization
105
+ # more than the maximum permitted number of authorization attempts (10 by default, but can
106
+ # be changed in the "Global transaction parameters" tab, "Payment retry" section of the
107
+ # Technical Information page).
108
+ # :exception_url => URL of the web page to show the customer when the payment result is uncertain.
109
+ # :paramplus => Field to submit the miscellaneous parameters and their values that you wish to be
110
+ # returned in the post sale request or final redirection.
111
+ # :complus => Field to submit a value you wish to be returned in the post sale request or output.
112
+ # :language => Customer's language, for example: "en_EN"
113
+ #
114
+ class OgoneGateway < Gateway
115
+ CVV_MAPPING = { 'OK' => 'M',
116
+ 'KO' => 'N',
117
+ 'NO' => 'P' }
118
+
119
+ AVS_MAPPING = { 'OK' => 'M',
120
+ 'KO' => 'N',
121
+ 'NO' => 'R' }
122
+
123
+ SUCCESS_MESSAGE = 'The transaction was successful'
124
+
125
+ THREE_D_SECURE_DISPLAY_WAYS = { main_window: 'MAINW', # display the identification page in the main window (default value).
126
+
127
+ pop_up: 'POPUP', # display the identification page in a pop-up window and return to the main window at the end.
128
+ pop_ix: 'POPIX' } # display the identification page in a pop-up window and remain in the pop-up window.
129
+
130
+ OGONE_NO_SIGNATURE_DEPRECATION_MESSAGE = 'Signature usage will be the default for a future release of ActiveMerchant. You should either begin using it, or update your configuration to explicitly disable it (signature_encryptor: none)'
131
+ OGONE_STORE_OPTION_DEPRECATION_MESSAGE = "The 'store' option has been renamed to 'billing_id', and its usage is deprecated."
132
+
133
+ self.test_url = 'https://secure.ogone.com/ncol/test/'
134
+ self.live_url = 'https://secure.ogone.com/ncol/prod/'
135
+
136
+ self.supported_countries = %w[BE DE FR NL AT CH]
137
+ # also supports Airplus and UATP
138
+ self.supported_cardtypes = %i[visa master american_express diners_club discover jcb maestro]
139
+ self.homepage_url = 'https://www.ingenico.com/login/ogone/'
140
+ self.display_name = 'Ogone'
141
+ self.default_currency = 'EUR'
142
+ self.money_format = :cents
143
+
144
+ def initialize(options = {})
145
+ requires!(options, :login, :user, :password)
146
+ super
147
+ end
148
+
149
+ # Verify and reserve the specified amount on the account, without actually doing the transaction.
150
+ def authorize(money, payment_source, options = {})
151
+ post = {}
152
+ action = payment_source.brand == 'mastercard' ? 'PAU' : 'RES'
153
+ add_invoice(post, options)
154
+ add_payment_source(post, payment_source, options)
155
+ add_address(post, payment_source, options)
156
+ add_customer_data(post, options)
157
+ add_money(post, money, options)
158
+ commit(action, post)
159
+ end
160
+
161
+ # Verify and transfer the specified amount.
162
+ def purchase(money, payment_source, options = {})
163
+ post = {}
164
+ action = options[:action] || 'SAL'
165
+ add_invoice(post, options)
166
+ add_payment_source(post, payment_source, options)
167
+ add_address(post, payment_source, options)
168
+ add_customer_data(post, options)
169
+ add_money(post, money, options)
170
+ commit(action, post)
171
+ end
172
+
173
+ # Complete a previously authorized transaction.
174
+ def capture(money, authorization, options = {})
175
+ post = {}
176
+ action = options[:action] || 'SAL'
177
+ add_authorization(post, reference_from(authorization))
178
+ add_invoice(post, options)
179
+ add_customer_data(post, options)
180
+ add_money(post, money, options)
181
+ commit(action, post)
182
+ end
183
+
184
+ # Cancels a previously authorized transaction.
185
+ def void(identification, options = {})
186
+ post = {}
187
+ add_authorization(post, reference_from(identification))
188
+ commit('DES', post)
189
+ end
190
+
191
+ # Credit the specified account by a specific amount.
192
+ def credit(money, identification_or_credit_card, options = {})
193
+ if reference_transaction?(identification_or_credit_card)
194
+ ActiveMerchant.deprecated CREDIT_DEPRECATION_MESSAGE
195
+ # Referenced credit: refund of a settled transaction
196
+ refund(money, identification_or_credit_card, options)
197
+ else # must be a credit card or card reference
198
+ perform_non_referenced_credit(money, identification_or_credit_card, options)
199
+ end
200
+ end
201
+
202
+ # Refund of a settled transaction
203
+ def refund(money, reference, options = {})
204
+ perform_reference_credit(money, reference, options)
205
+ end
206
+
207
+ def verify(credit_card, options = {})
208
+ MultiResponse.run(:use_first_response) do |r|
209
+ r.process { authorize(100, credit_card, options) }
210
+ r.process(:ignore_result) { void(r.authorization, options) }
211
+ end
212
+ end
213
+
214
+ # Store a credit card by creating an Ogone Alias
215
+ def store(payment_source, options = {})
216
+ options[:alias_operation] = 'BYPSP' unless options.has_key?(:billing_id) || options.has_key?(:store)
217
+ response = authorize(@options[:store_amount] || 1, payment_source, options)
218
+ void(response.authorization) if response.success?
219
+ response
220
+ end
221
+
222
+ def supports_scrubbing?
223
+ true
224
+ end
225
+
226
+ def scrub(transcript)
227
+ transcript.
228
+ gsub(%r((Authorization: Basic )\w+), '\1[FILTERED]').
229
+ gsub(%r((&?cardno=)[^&]*)i, '\1[FILTERED]').
230
+ gsub(%r((&?cvc=)[^&]*)i, '\1[FILTERED]').
231
+ gsub(%r((&?pswd=)[^&]*)i, '\1[FILTERED]')
232
+ end
233
+
234
+ private
235
+
236
+ def reference_from(authorization)
237
+ authorization.split(';').first
238
+ end
239
+
240
+ def reference_transaction?(identifier)
241
+ return false unless identifier.is_a?(String)
242
+
243
+ _, action = identifier.split(';')
244
+ !action.nil?
245
+ end
246
+
247
+ def perform_reference_credit(money, payment_target, options = {})
248
+ post = {}
249
+ add_authorization(post, reference_from(payment_target))
250
+ add_money(post, money, options)
251
+ commit('RFD', post)
252
+ end
253
+
254
+ def perform_non_referenced_credit(money, payment_target, options = {})
255
+ # Non-referenced credit: acts like a reverse purchase
256
+ post = {}
257
+ add_invoice(post, options)
258
+ add_payment_source(post, payment_target, options)
259
+ add_address(post, payment_target, options)
260
+ add_customer_data(post, options)
261
+ add_money(post, money, options)
262
+ commit('RFD', post)
263
+ end
264
+
265
+ def add_payment_source(post, payment_source, options)
266
+ add_d3d(post, options) if options[:d3d]
267
+ if payment_source.is_a?(String)
268
+ add_alias(post, payment_source, options[:alias_operation])
269
+ add_eci(post, options[:eci] || '9')
270
+ else
271
+ if options.has_key?(:store)
272
+ ActiveMerchant.deprecated OGONE_STORE_OPTION_DEPRECATION_MESSAGE
273
+ options[:billing_id] ||= options[:store]
274
+ end
275
+ add_alias(post, options[:billing_id], options[:alias_operation])
276
+ add_eci(post, options[:eci] || '7')
277
+ add_creditcard(post, payment_source)
278
+ end
279
+ end
280
+
281
+ def add_d3d(post, options)
282
+ add_pair post, 'FLAG3D', 'Y'
283
+ win_3ds = THREE_D_SECURE_DISPLAY_WAYS.key?(options[:win_3ds]) ?
284
+ THREE_D_SECURE_DISPLAY_WAYS[options[:win_3ds]] :
285
+ THREE_D_SECURE_DISPLAY_WAYS[:main_window]
286
+ add_pair post, 'WIN3DS', win_3ds
287
+ add_pair post, 'HTTP_USER_AGENT', options[:http_user_agent] if options[:http_user_agent]
288
+ add_pair post, 'ACCEPTURL', options[:accept_url] if options[:accept_url]
289
+ add_pair post, 'DECLINEURL', options[:decline_url] if options[:decline_url]
290
+ add_pair post, 'EXCEPTIONURL', options[:exception_url] if options[:exception_url]
291
+ add_pair post, 'CANCELURL', options[:cancel_url] if options[:cancel_url]
292
+ add_pair post, 'PARAMVAR', options[:paramvar] if options[:paramvar]
293
+ add_pair post, 'PARAMPLUS', options[:paramplus] if options[:paramplus]
294
+ add_pair post, 'COMPLUS', options[:complus] if options[:complus]
295
+ add_pair post, 'LANGUAGE', options[:language] if options[:language]
296
+ if options[:three_ds_2]
297
+ browser_info = options[:three_ds_2][:browser_info]
298
+ ecom_postal = options[:billing_address]
299
+ if browser_info
300
+ add_pair post, 'BROWSERACCEPTHEADER', browser_info[:accept_header]
301
+ add_pair post, 'BROWSERCOLORDEPTH', browser_info[:depth]
302
+
303
+ # for 3ds v2.1 to v2.2 add BROWSERJAVASCRIPTENABLED: This boolean indicates whether your customers have enabled JavaScript in their browsers when making a purchase.
304
+ # the following BROWSER<tag> parameters will remain mandatory unless browser_info[:javascript] = false
305
+ # her documentation https://epayments-support.ingenico.com/en/integration-solutions/integrations/directlink#directlink_integration_guides_secure_payment_with_3_d_secure
306
+ add_pair post, 'BROWSERJAVASCRIPTENABLED', browser_info[:javascript]
307
+ add_pair post, 'BROWSERJAVAENABLED', browser_info[:java]
308
+ add_pair post, 'BROWSERLANGUAGE', browser_info[:language]
309
+ add_pair post, 'BROWSERSCREENHEIGHT', browser_info[:height]
310
+ add_pair post, 'BROWSERSCREENWIDTH', browser_info[:width]
311
+ add_pair post, 'BROWSERTIMEZONE', browser_info[:timezone]
312
+ add_pair post, 'BROWSERUSERAGENT', browser_info[:user_agent]
313
+ end
314
+ # recommended
315
+ if ecom_postal
316
+ add_pair post, 'ECOM_BILLTO_POSTAL_CITY', ecom_postal[:city]
317
+ add_pair post, 'ECOM_BILLTO_POSTAL_COUNTRYCODE', ecom_postal[:country]
318
+ add_pair post, 'ECOM_BILLTO_POSTAL_STREET_LINE1', ecom_postal[:address1]
319
+ add_pair post, 'ECOM_BILLTO_POSTAL_STREET_LINE2', ecom_postal[:address2]
320
+ add_pair post, 'ECOM_BILLTO_POSTAL_POSTALCODE', ecom_postal[:zip]
321
+ end
322
+ # optional
323
+ add_pair post, 'Mpi.threeDSRequestorChallengeIndicator', options[:three_ds_reqchallengeind]
324
+ else
325
+ add_pair post, 'HTTP_ACCEPT', options[:http_accept] || '*/*'
326
+ end
327
+ end
328
+
329
+ def add_eci(post, eci)
330
+ add_pair post, 'ECI', eci.to_s
331
+ end
332
+
333
+ def add_alias(post, alias_name, alias_operation = nil)
334
+ add_pair post, 'ALIAS', alias_name
335
+ add_pair post, 'ALIASOPERATION', alias_operation unless alias_operation.nil?
336
+ end
337
+
338
+ def add_authorization(post, authorization)
339
+ add_pair post, 'PAYID', authorization
340
+ end
341
+
342
+ def add_money(post, money, options)
343
+ add_pair post, 'currency', options[:currency] || @options[:currency] || currency(money)
344
+ add_pair post, 'amount', amount(money)
345
+ end
346
+
347
+ def add_customer_data(post, options)
348
+ add_pair post, 'EMAIL', options[:email]
349
+ add_pair post, 'REMOTE_ADDR', options[:ip]
350
+ end
351
+
352
+ def add_address(post, creditcard, options)
353
+ return unless options[:billing_address]
354
+
355
+ add_pair post, 'Owneraddress', options[:billing_address][:address1]
356
+ add_pair post, 'OwnerZip', options[:billing_address][:zip]
357
+ add_pair post, 'ownertown', options[:billing_address][:city]
358
+ add_pair post, 'ownercty', options[:billing_address][:country]
359
+ add_pair post, 'ownertelno', options[:billing_address][:phone]
360
+ end
361
+
362
+ def add_invoice(post, options)
363
+ add_pair post, 'orderID', options[:order_id] || generate_unique_id[0...30]
364
+ add_pair post, 'COM', options[:description]
365
+ add_pair post, 'ORIG', options[:origin] if options[:origin]
366
+ end
367
+
368
+ def add_creditcard(post, creditcard)
369
+ add_pair post, 'CN', creditcard.name
370
+ add_pair post, 'CARDNO', creditcard.number
371
+ add_pair post, 'ED', '%02d%02s' % [creditcard.month, creditcard.year.to_s[-2..-1]]
372
+ add_pair post, 'CVC', creditcard.verification_value
373
+ end
374
+
375
+ def parse(body)
376
+ xml_root = REXML::Document.new(body).root
377
+ response = convert_attributes_to_hash(xml_root.attributes)
378
+
379
+ # Add HTML_ANSWER element (3-D Secure specific to the response's params)
380
+ # Note: HTML_ANSWER is not an attribute so we add it "by hand" to the response
381
+ if html_answer = REXML::XPath.first(xml_root, '//HTML_ANSWER')
382
+ response['HTML_ANSWER'] = html_answer.text
383
+ end
384
+
385
+ response
386
+ end
387
+
388
+ def commit(action, parameters)
389
+ add_pair parameters, 'RTIMEOUT', @options[:timeout] if @options[:timeout]
390
+ add_pair parameters, 'PSPID', @options[:login]
391
+ add_pair parameters, 'USERID', @options[:user]
392
+ add_pair parameters, 'PSWD', @options[:password]
393
+
394
+ response = parse(ssl_post(url(parameters['PAYID']), post_data(action, parameters)))
395
+
396
+ options = {
397
+ authorization: [response['PAYID'], action].join(';'),
398
+ test: test?,
399
+ avs_result: { code: AVS_MAPPING[response['AAVCheck']] },
400
+ cvv_result: CVV_MAPPING[response['CVCCheck']]
401
+ }
402
+ OgoneResponse.new(successful?(response), message_from(response), response, options)
403
+ end
404
+
405
+ def url(payid)
406
+ (test? ? test_url : live_url) + (payid ? 'maintenancedirect.asp' : 'orderdirect.asp')
407
+ end
408
+
409
+ def successful?(response)
410
+ response['NCERROR'] == '0'
411
+ end
412
+
413
+ def message_from(response)
414
+ if successful?(response)
415
+ SUCCESS_MESSAGE
416
+ else
417
+ format_error_message(response['NCERRORPLUS'])
418
+ end
419
+ end
420
+
421
+ def format_error_message(message)
422
+ raw_message = message.to_s.strip
423
+ case raw_message
424
+ when /\|/
425
+ raw_message.split('|').join(', ').capitalize
426
+ when /\//
427
+ raw_message.split('/').first.to_s.capitalize
428
+ else
429
+ raw_message.to_s.capitalize
430
+ end
431
+ end
432
+
433
+ def post_data(action, parameters = {})
434
+ add_pair parameters, 'Operation', action
435
+ add_signature(parameters)
436
+ parameters.to_query
437
+ end
438
+
439
+ def add_signature(parameters)
440
+ if @options[:signature].blank?
441
+ ActiveMerchant.deprecated(OGONE_NO_SIGNATURE_DEPRECATION_MESSAGE) unless @options[:signature_encryptor] == 'none'
442
+ return
443
+ end
444
+
445
+ add_pair parameters, 'SHASIGN', calculate_signature(parameters, @options[:signature_encryptor], @options[:signature])
446
+ end
447
+
448
+ def calculate_signature(signed_parameters, algorithm, secret)
449
+ return legacy_calculate_signature(signed_parameters, secret) unless algorithm
450
+
451
+ sha_encryptor =
452
+ case algorithm
453
+ when 'sha256'
454
+ Digest::SHA256
455
+ when 'sha512'
456
+ Digest::SHA512
457
+ when 'sha1'
458
+ Digest::SHA1
459
+ else
460
+ raise "Unknown signature algorithm #{algorithm}"
461
+ end
462
+
463
+ filtered_params = signed_parameters.compact
464
+ sha_encryptor.hexdigest(
465
+ filtered_params.sort_by { |k, _v| k.upcase }.map { |k, v| "#{k.upcase}=#{v}#{secret}" }.join('')
466
+ ).upcase
467
+ end
468
+
469
+ def legacy_calculate_signature(parameters, secret)
470
+ Digest::SHA1.hexdigest(
471
+ (
472
+ %w(
473
+ orderID
474
+ amount
475
+ currency
476
+ CARDNO
477
+ PSPID
478
+ Operation
479
+ ALIAS
480
+ ).map { |key| parameters[key] } +
481
+ [secret]
482
+ ).join('')
483
+ ).upcase
484
+ end
485
+
486
+ def add_pair(post, key, value)
487
+ post[key] = value unless value.nil?
488
+ end
489
+
490
+ def convert_attributes_to_hash(rexml_attributes)
491
+ response_hash = {}
492
+ rexml_attributes.each do |key, value|
493
+ response_hash[key] = value
494
+ end
495
+ response_hash
496
+ end
497
+ end
498
+
499
+ class OgoneResponse < Response
500
+ def order_id
501
+ @params['orderID']
502
+ end
503
+
504
+ def billing_id
505
+ @params['ALIAS']
506
+ end
507
+ end
508
+ end
509
+ end