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,452 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class FirstdataE4Gateway < Gateway
4
+ # TransArmor support requires v11 or lower
5
+ self.test_url = 'https://api.demo.globalgatewaye4.firstdata.com/transaction/v11'
6
+ self.live_url = 'https://api.globalgatewaye4.firstdata.com/transaction/v11'
7
+
8
+ TRANSACTIONS = {
9
+ sale: '00',
10
+ authorization: '01',
11
+ verify: '05',
12
+ capture: '32',
13
+ void: '33',
14
+ credit: '34',
15
+ store: '05'
16
+ }
17
+
18
+ POST_HEADERS = {
19
+ 'Accepts' => 'application/xml',
20
+ 'Content-Type' => 'application/xml'
21
+ }
22
+
23
+ SUCCESS = 'true'
24
+
25
+ SENSITIVE_FIELDS = %i[verification_str2 expiry_date card_number]
26
+
27
+ BRANDS = {
28
+ visa: 'Visa',
29
+ master: 'Mastercard',
30
+ american_express: 'American Express',
31
+ jcb: 'JCB',
32
+ discover: 'Discover'
33
+ }
34
+
35
+ E4_BRANDS = BRANDS.merge({ mastercard: 'Mastercard' })
36
+
37
+ DEFAULT_ECI = '07'
38
+
39
+ self.supported_cardtypes = BRANDS.keys
40
+ self.supported_countries = %w[CA US]
41
+ self.default_currency = 'USD'
42
+ self.homepage_url = 'http://www.firstdata.com'
43
+ self.display_name = 'FirstData Global Gateway e4'
44
+
45
+ STANDARD_ERROR_CODE_MAPPING = {
46
+ # Bank error codes: https://firstdata.zendesk.com/entries/471297-First-Data-Global-Gateway-e4-Bank-Response-Codes
47
+ '201' => STANDARD_ERROR_CODE[:incorrect_number],
48
+ '531' => STANDARD_ERROR_CODE[:invalid_cvc],
49
+ '503' => STANDARD_ERROR_CODE[:invalid_cvc],
50
+ '811' => STANDARD_ERROR_CODE[:invalid_cvc],
51
+ '605' => STANDARD_ERROR_CODE[:invalid_expiry_date],
52
+ '522' => STANDARD_ERROR_CODE[:expired_card],
53
+ '303' => STANDARD_ERROR_CODE[:card_declined],
54
+ '530' => STANDARD_ERROR_CODE[:card_declined],
55
+ '401' => STANDARD_ERROR_CODE[:call_issuer],
56
+ '402' => STANDARD_ERROR_CODE[:call_issuer],
57
+ '501' => STANDARD_ERROR_CODE[:pickup_card],
58
+ # Ecommerce error codes -- https://firstdata.zendesk.com/entries/451980-ecommerce-response-codes-etg-codes
59
+ '22' => STANDARD_ERROR_CODE[:invalid_number],
60
+ '25' => STANDARD_ERROR_CODE[:invalid_expiry_date],
61
+ '31' => STANDARD_ERROR_CODE[:incorrect_cvc],
62
+ '44' => STANDARD_ERROR_CODE[:incorrect_zip],
63
+ '42' => STANDARD_ERROR_CODE[:processing_error]
64
+ }
65
+
66
+ # Create a new FirstdataE4Gateway
67
+ #
68
+ # The gateway requires that a valid login and password be passed
69
+ # in the +options+ hash.
70
+ #
71
+ # ==== Options
72
+ #
73
+ # * <tt>:login</tt> -- The EXACT ID. Also known as the Gateway ID.
74
+ # (Found in your administration terminal settings)
75
+ # * <tt>:password</tt> -- The terminal password (not your account password)
76
+ def initialize(options = {})
77
+ requires!(options, :login, :password)
78
+ @options = options
79
+
80
+ super
81
+ end
82
+
83
+ def authorize(money, credit_card_or_store_authorization, options = {})
84
+ commit(:authorization, build_sale_or_authorization_request(money, credit_card_or_store_authorization, options))
85
+ end
86
+
87
+ def purchase(money, credit_card_or_store_authorization, options = {})
88
+ commit(:sale, build_sale_or_authorization_request(money, credit_card_or_store_authorization, options))
89
+ end
90
+
91
+ def capture(money, authorization, options = {})
92
+ commit(:capture, build_capture_or_credit_request(money, authorization, options))
93
+ end
94
+
95
+ def void(authorization, options = {})
96
+ commit(:void, build_capture_or_credit_request(money_from_authorization(authorization), authorization, options))
97
+ end
98
+
99
+ def refund(money, authorization, options = {})
100
+ commit(:credit, build_capture_or_credit_request(money, authorization, options))
101
+ end
102
+
103
+ def verify(credit_card, options = {})
104
+ commit(:verify, build_sale_or_authorization_request(0, credit_card, options))
105
+ end
106
+
107
+ # Tokenize a credit card with TransArmor
108
+ #
109
+ # The TransArmor token and other card data necessary for subsequent
110
+ # transactions is stored in the response's +authorization+ attribute.
111
+ # The authorization string may be passed to +authorize+ and +purchase+
112
+ # instead of a +ActiveMerchant::Billing::CreditCard+ instance.
113
+ #
114
+ # TransArmor support must be explicitly activated on your gateway
115
+ # account by FirstData. If your authorization string is empty, contact
116
+ # FirstData support for account setup assistance.
117
+ #
118
+ # === Example
119
+ #
120
+ # # Generate token
121
+ # result = gateway.store(credit_card)
122
+ # if result.success?
123
+ # my_record.update_attributes(:authorization => result.authorization)
124
+ # end
125
+ #
126
+ # # Use token
127
+ # result = gateway.purchase(1000, my_record.authorization)
128
+ #
129
+ # https://firstdata.zendesk.com/entries/21303361-transarmor-tokenization
130
+ def store(credit_card, options = {})
131
+ commit(:store, build_store_request(credit_card, options), credit_card)
132
+ end
133
+
134
+ def verify_credentials
135
+ response = void('0')
136
+ response.message != 'Unauthorized Request. Bad or missing credentials.'
137
+ end
138
+
139
+ def supports_scrubbing?
140
+ true
141
+ end
142
+
143
+ def scrub(transcript)
144
+ transcript.
145
+ gsub(%r((<Card_Number>).+(</Card_Number>)), '\1[FILTERED]\2').
146
+ gsub(%r((<VerificationStr2>).+(</VerificationStr2>)), '\1[FILTERED]\2').
147
+ gsub(%r((<Password>).+(</Password>))i, '\1[FILTERED]\2').
148
+ gsub(%r((<CAVV>).+(</CAVV>)), '\1[FILTERED]\2').
149
+ gsub(%r((Card Number : ).*\d)i, '\1[FILTERED]')
150
+ end
151
+
152
+ def supports_network_tokenization?
153
+ true
154
+ end
155
+
156
+ private
157
+
158
+ def build_request(action, body)
159
+ xml = Builder::XmlMarkup.new
160
+
161
+ xml.instruct!
162
+ xml.tag! 'Transaction', xmlns: 'http://secure2.e-xact.com/vplug-in/transaction/rpc-enc/encodedTypes' do
163
+ add_credentials(xml)
164
+ add_transaction_type(xml, action)
165
+ xml << body
166
+ end
167
+
168
+ xml.target!
169
+ end
170
+
171
+ def build_sale_or_authorization_request(money, credit_card_or_store_authorization, options)
172
+ xml = Builder::XmlMarkup.new
173
+
174
+ add_amount(xml, money, options)
175
+
176
+ if credit_card_or_store_authorization.is_a? String
177
+ add_credit_card_token(xml, credit_card_or_store_authorization, options)
178
+ else
179
+ add_credit_card(xml, credit_card_or_store_authorization, options)
180
+ end
181
+
182
+ add_customer_data(xml, options)
183
+ add_invoice(xml, options)
184
+ add_tax_fields(xml, options)
185
+ add_level_3(xml, options)
186
+
187
+ xml.target!
188
+ end
189
+
190
+ def build_capture_or_credit_request(money, identification, options)
191
+ xml = Builder::XmlMarkup.new
192
+
193
+ add_identification(xml, identification)
194
+ add_amount(xml, money, options)
195
+ add_customer_data(xml, options)
196
+ add_card_authentication_data(xml, options)
197
+
198
+ xml.target!
199
+ end
200
+
201
+ def build_store_request(credit_card, options)
202
+ xml = Builder::XmlMarkup.new
203
+
204
+ add_credit_card(xml, credit_card, options)
205
+ add_customer_data(xml, options)
206
+
207
+ xml.target!
208
+ end
209
+
210
+ def add_credentials(xml)
211
+ xml.tag! 'ExactID', @options[:login]
212
+ xml.tag! 'Password', @options[:password]
213
+ end
214
+
215
+ def add_transaction_type(xml, action)
216
+ xml.tag! 'Transaction_Type', TRANSACTIONS[action]
217
+ end
218
+
219
+ def add_identification(xml, identification)
220
+ authorization_num, transaction_tag, = identification.split(';')
221
+
222
+ xml.tag! 'Authorization_Num', authorization_num
223
+ xml.tag! 'Transaction_Tag', transaction_tag
224
+ end
225
+
226
+ def add_amount(xml, money, options)
227
+ currency_code = options[:currency] || default_currency
228
+ xml.tag! 'DollarAmount', localized_amount(money, currency_code)
229
+ xml.tag! 'Currency', currency_code
230
+ end
231
+
232
+ def add_credit_card(xml, credit_card, options)
233
+ if credit_card.respond_to?(:track_data) && credit_card.track_data.present?
234
+ xml.tag! 'Track1', credit_card.track_data
235
+ xml.tag! 'Ecommerce_Flag', 'R'
236
+ else
237
+ xml.tag! 'Card_Number', credit_card.number
238
+ xml.tag! 'Expiry_Date', expdate(credit_card)
239
+ xml.tag! 'CardHoldersName', credit_card.name
240
+ xml.tag! 'CardType', card_type(credit_card.brand)
241
+
242
+ add_credit_card_eci(xml, credit_card, options)
243
+ add_credit_card_verification_strings(xml, credit_card, options)
244
+ end
245
+ end
246
+
247
+ def add_credit_card_eci(xml, credit_card, options)
248
+ eci =
249
+ if credit_card.is_a?(NetworkTokenizationCreditCard) && credit_card.source == :apple_pay && card_brand(credit_card) == 'discover'
250
+ # Discover requires any Apple Pay transaction, regardless of in-app
251
+ # or web, and regardless of the ECI contained in the PKPaymentToken,
252
+ # to have an ECI value explicitly of 04.
253
+ '04'
254
+ else
255
+ (credit_card.respond_to?(:eci) ? credit_card.eci : nil) || options[:eci] || DEFAULT_ECI
256
+ end
257
+
258
+ xml.tag! 'Ecommerce_Flag', /^[0-9]+$/.match?(eci.to_s) ? eci.to_s.rjust(2, '0') : eci
259
+ end
260
+
261
+ def add_credit_card_verification_strings(xml, credit_card, options)
262
+ address = options[:billing_address] || options[:address]
263
+ if address
264
+ address_values = []
265
+ %i[address1 zip city state country].each { |part| address_values << address[part].to_s.tr("\r\n", ' ').strip }
266
+ xml.tag! 'VerificationStr1', address_values.join('|')
267
+ end
268
+
269
+ if credit_card.is_a?(NetworkTokenizationCreditCard)
270
+ add_network_tokenization_credit_card(xml, credit_card)
271
+ else
272
+ if credit_card.verification_value?
273
+ xml.tag! 'CVD_Presence_Ind', '1'
274
+ xml.tag! 'VerificationStr2', credit_card.verification_value
275
+ end
276
+
277
+ add_card_authentication_data(xml, options)
278
+ end
279
+ end
280
+
281
+ def add_network_tokenization_credit_card(xml, credit_card)
282
+ case card_brand(credit_card).to_sym
283
+ when :american_express
284
+ cryptogram = Base64.decode64(credit_card.payment_cryptogram)
285
+ xml.tag!('XID', Base64.encode64(cryptogram[20...40]))
286
+ xml.tag!('CAVV', Base64.encode64(cryptogram[0...20]))
287
+ else
288
+ xml.tag!('XID', credit_card.transaction_id) if credit_card.transaction_id
289
+ xml.tag!('CAVV', credit_card.payment_cryptogram)
290
+ end
291
+ end
292
+
293
+ def add_card_authentication_data(xml, options)
294
+ xml.tag! 'CAVV', options[:cavv]
295
+ xml.tag! 'XID', options[:xid]
296
+ end
297
+
298
+ def add_credit_card_token(xml, store_authorization, options)
299
+ params = store_authorization.split(';')
300
+ credit_card = CreditCard.new(
301
+ brand: params[1],
302
+ first_name: params[2],
303
+ last_name: params[3],
304
+ month: params[4],
305
+ year: params[5]
306
+ )
307
+
308
+ xml.tag! 'TransarmorToken', params[0]
309
+ xml.tag! 'Expiry_Date', expdate(credit_card)
310
+ xml.tag! 'CardHoldersName', credit_card.name
311
+ xml.tag! 'CardType', card_type(credit_card.brand)
312
+ add_card_authentication_data(xml, options)
313
+ end
314
+
315
+ def add_customer_data(xml, options)
316
+ xml.tag! 'Customer_Ref', options[:customer] if options[:customer]
317
+ xml.tag! 'Client_IP', options[:ip] if options[:ip]
318
+ xml.tag! 'Client_Email', options[:email] if options[:email]
319
+ end
320
+
321
+ def add_address(xml, options)
322
+ if address = (options[:billing_address] || options[:address])
323
+ xml.tag! 'ZipCode', address[:zip]
324
+ end
325
+ end
326
+
327
+ def add_invoice(xml, options)
328
+ xml.tag! 'Reference_No', options[:order_id]
329
+ xml.tag! 'Reference_3', options[:description] if options[:description]
330
+ end
331
+
332
+ def add_tax_fields(xml, options)
333
+ xml.tag! 'Tax1Amount', options[:tax1_amount] if options[:tax1_amount]
334
+ xml.tag! 'Tax1Number', options[:tax1_number] if options[:tax1_number]
335
+ end
336
+
337
+ def add_level_3(xml, options)
338
+ xml.tag!('Level3') { |x| x << options[:level_3] } if options[:level_3]
339
+ end
340
+
341
+ def expdate(credit_card)
342
+ "#{format(credit_card.month, :two_digits)}#{format(credit_card.year, :two_digits)}"
343
+ end
344
+
345
+ def card_type(credit_card_brand)
346
+ E4_BRANDS[credit_card_brand.to_sym] if credit_card_brand
347
+ end
348
+
349
+ def commit(action, request, credit_card = nil)
350
+ url = (test? ? self.test_url : self.live_url)
351
+ begin
352
+ response = parse(ssl_post(url, build_request(action, request), POST_HEADERS))
353
+ rescue ResponseError => e
354
+ response = parse_error(e.response)
355
+ end
356
+
357
+ Response.new(successful?(response), message_from(response), response,
358
+ test: test?,
359
+ authorization: successful?(response) ? response_authorization(action, response, credit_card) : '',
360
+ avs_result: { code: response[:avs] },
361
+ cvv_result: response[:cvv2],
362
+ error_code: standard_error_code(response))
363
+ end
364
+
365
+ def successful?(response)
366
+ response[:transaction_approved] == SUCCESS
367
+ end
368
+
369
+ def response_authorization(action, response, credit_card)
370
+ if action == :store
371
+ store_authorization_from(response, credit_card)
372
+ else
373
+ authorization_from(response)
374
+ end
375
+ end
376
+
377
+ def authorization_from(response)
378
+ if response[:authorization_num] && response[:transaction_tag]
379
+ [
380
+ response[:authorization_num],
381
+ response[:transaction_tag],
382
+ (response[:dollar_amount].to_f * 100).round
383
+ ].join(';')
384
+ else
385
+ ''
386
+ end
387
+ end
388
+
389
+ def store_authorization_from(response, credit_card)
390
+ if response[:transarmor_token].present?
391
+ [
392
+ response[:transarmor_token],
393
+ credit_card.brand,
394
+ credit_card.first_name,
395
+ credit_card.last_name,
396
+ credit_card.month,
397
+ credit_card.year
398
+ ].map { |value| value.to_s.delete(';') }.join(';')
399
+ else
400
+ raise StandardError, "TransArmor support is not enabled on your #{display_name} account"
401
+ end
402
+ end
403
+
404
+ def money_from_authorization(auth)
405
+ _, _, amount = auth.split(/;/, 3)
406
+ amount.to_i
407
+ end
408
+
409
+ def message_from(response)
410
+ if response[:faultcode] && response[:faultstring]
411
+ response[:faultstring]
412
+ elsif response[:error_number] && response[:error_number] != '0'
413
+ response[:error_description]
414
+ else
415
+ result = (response[:exact_message] || '')
416
+ result << " - #{response[:bank_message]}" if response[:bank_message].present?
417
+ result
418
+ end
419
+ end
420
+
421
+ def parse_error(error)
422
+ {
423
+ transaction_approved: 'false',
424
+ error_number: error.code,
425
+ error_description: error.body,
426
+ ecommerce_error_code: error.body.gsub(/[^\d]/, '')
427
+ }
428
+ end
429
+
430
+ def standard_error_code(response)
431
+ STANDARD_ERROR_CODE_MAPPING[response[:bank_resp_code] || response[:ecommerce_error_code]]
432
+ end
433
+
434
+ def parse(xml)
435
+ response = {}
436
+ xml = REXML::Document.new(xml)
437
+
438
+ if root = REXML::XPath.first(xml, '//TransactionResult')
439
+ parse_elements(response, root)
440
+ end
441
+
442
+ response.delete_if { |k, _v| SENSITIVE_FIELDS.include?(k) }
443
+ end
444
+
445
+ def parse_elements(response, root)
446
+ root.elements.to_a.each do |node|
447
+ response[node.name.gsub(/EXact/, 'Exact').underscore.to_sym] = (node.text || '').strip
448
+ end
449
+ end
450
+ end
451
+ end
452
+ end