swiss-activemerchant 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
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 +249 -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 +243 -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 +227 -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 +312 -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 +120 -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,580 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class GlobalCollectGateway < Gateway
4
+ class_attribute :preproduction_url
5
+ class_attribute :ogone_direct_test
6
+ class_attribute :ogone_direct_live
7
+
8
+ self.display_name = 'GlobalCollect'
9
+ self.homepage_url = 'http://www.globalcollect.com/'
10
+
11
+ self.test_url = 'https://eu.sandbox.api-ingenico.com'
12
+ self.preproduction_url = 'https://world.preprod.api-ingenico.com'
13
+ self.live_url = 'https://world.api-ingenico.com'
14
+ self.ogone_direct_test = 'https://payment.preprod.direct.worldline-solutions.com'
15
+ self.ogone_direct_live = 'https://payment.direct.worldline-solutions.com'
16
+
17
+ self.supported_countries = %w[AD AE AG AI AL AM AO AR AS AT AU AW AX AZ BA BB BD BE BF BG BH BI BJ BL BM BN BO BQ BR BS BT BW BY BZ CA CC CD CF CH CI CK CL CM CN CO CR CU CV CW CX CY CZ DE DJ DK DM DO DZ EC EE EG ER ES ET FI FJ FK FM FO FR GA GB GD GE GF GH GI GL GM GN GP GQ GR GS GT GU GW GY HK HN HR HT HU ID IE IL IM IN IS IT JM JO JP KE KG KH KI KM KN KR KW KY KZ LA LB LC LI LK LR LS LT LU LV MA MC MD ME MF MG MH MK MM MN MO MP MQ MR MS MT MU MV MW MX MY MZ NA NC NE NG NI NL NO NP NR NU NZ OM PA PE PF PG PH PL PN PS PT PW QA RE RO RS RU RW SA SB SC SE SG SH SI SJ SK SL SM SN SR ST SV SZ TC TD TG TH TJ TL TM TN TO TR TT TV TW TZ UA UG US UY UZ VC VE VG VI VN WF WS ZA ZM ZW]
18
+ self.default_currency = 'USD'
19
+ self.money_format = :cents
20
+ self.supported_cardtypes = %i[visa master american_express discover naranja cabal]
21
+
22
+ def initialize(options = {})
23
+ requires!(options, :merchant_id, :api_key_id, :secret_api_key)
24
+ super
25
+ end
26
+
27
+ def purchase(money, payment, options = {})
28
+ MultiResponse.run do |r|
29
+ r.process { authorize(money, payment, options) }
30
+ r.process { capture(money, r.authorization, options) } if should_request_capture?(r, options[:requires_approval])
31
+ end
32
+ end
33
+
34
+ def authorize(money, payment, options = {})
35
+ post = nestable_hash
36
+ add_order(post, money, options)
37
+ add_payment(post, payment, options)
38
+ add_customer_data(post, options, payment)
39
+ add_address(post, payment, options)
40
+ add_creator_info(post, options)
41
+ add_fraud_fields(post, options)
42
+ add_external_cardholder_authentication_data(post, options)
43
+ commit(:post, :authorize, post, options: options)
44
+ end
45
+
46
+ def capture(money, authorization, options = {})
47
+ post = nestable_hash
48
+ add_order(post, money, options, capture: true)
49
+ add_customer_data(post, options)
50
+ add_creator_info(post, options)
51
+ commit(:post, :capture, post, authorization: authorization)
52
+ end
53
+
54
+ def refund(money, authorization, options = {})
55
+ post = nestable_hash
56
+ add_amount(post, money, options)
57
+ add_refund_customer_data(post, options)
58
+ add_creator_info(post, options)
59
+ commit(:post, :refund, post, authorization: authorization)
60
+ end
61
+
62
+ def void(authorization, options = {})
63
+ post = nestable_hash
64
+ add_creator_info(post, options)
65
+ commit(:post, :void, post, authorization: authorization)
66
+ end
67
+
68
+ def verify(payment, options = {})
69
+ MultiResponse.run(:use_first_response) do |r|
70
+ r.process { authorize(100, payment, options) }
71
+ r.process { void(r.authorization, options) }
72
+ end
73
+ end
74
+
75
+ def inquire(authorization, options = {})
76
+ commit(:get, :inquire, nil, authorization: authorization)
77
+ end
78
+
79
+ def supports_scrubbing?
80
+ true
81
+ end
82
+
83
+ def scrub(transcript)
84
+ transcript.
85
+ gsub(%r((Authorization: )[^\\]*)i, '\1[FILTERED]').
86
+ gsub(%r(("cardNumber\\+":\\+")\d+), '\1[FILTERED]').
87
+ gsub(%r(("cvv\\+":\\+")\d+), '\1[FILTERED]').
88
+ gsub(%r(("dpan\\+":\\+")\d+), '\1[FILTERED]').
89
+ gsub(%r(("pan\\+":\\+")\d+), '\1[FILTERED]').
90
+ gsub(%r(("cryptogram\\+":\\+"|("cavv\\+" : \\+"))[^\\]*), '\1[FILTERED]')
91
+ end
92
+
93
+ private
94
+
95
+ BRAND_MAP = {
96
+ 'visa' => '1',
97
+ 'american_express' => '2',
98
+ 'master' => '3',
99
+ 'discover' => '128',
100
+ 'jcb' => '125',
101
+ 'diners_club' => '132',
102
+ 'cabal' => '135',
103
+ 'naranja' => '136',
104
+ 'apple_pay': '302',
105
+ 'google_pay': '320'
106
+ }
107
+
108
+ def add_order(post, money, options, capture: false)
109
+ if capture
110
+ post['amount'] = amount(money)
111
+ else
112
+ add_amount(post['order'], money, options)
113
+ end
114
+ post['order']['references'] = {
115
+ 'merchantReference' => options[:order_id],
116
+ 'descriptor' => options[:description] # Max 256 chars
117
+ }
118
+ post['order']['references']['invoiceData'] = {
119
+ 'invoiceNumber' => options[:invoice]
120
+ }
121
+ add_airline_data(post, options) unless ogone_direct?
122
+ add_lodging_data(post, options)
123
+ add_number_of_installments(post, options) if options[:number_of_installments]
124
+ end
125
+
126
+ def add_airline_data(post, options)
127
+ return unless airline_options = options[:airline_data]
128
+
129
+ airline_data = {}
130
+
131
+ airline_data['flightDate'] = airline_options[:flight_date] if airline_options[:flight_date]
132
+ airline_data['passengerName'] = airline_options[:passenger_name] if airline_options[:passenger_name]
133
+ airline_data['code'] = airline_options[:code] if airline_options[:code]
134
+ airline_data['name'] = airline_options[:name] if airline_options[:name]
135
+ airline_data['invoiceNumber'] = options[:airline_data][:invoice_number] if options[:airline_data][:invoice_number]
136
+ airline_data['isETicket'] = options[:airline_data][:is_eticket] if options[:airline_data][:is_eticket]
137
+ airline_data['isRestrictedTicket'] = options[:airline_data][:is_restricted_ticket] if options[:airline_data][:is_restricted_ticket]
138
+ airline_data['isThirdParty'] = options[:airline_data][:is_third_party] if options[:airline_data][:is_third_party]
139
+ airline_data['issueDate'] = options[:airline_data][:issue_date] if options[:airline_data][:issue_date]
140
+ airline_data['merchantCustomerId'] = options[:airline_data][:merchant_customer_id] if options[:airline_data][:merchant_customer_id]
141
+ airline_data['flightLegs'] = add_flight_legs(airline_options)
142
+ airline_data['passengers'] = add_passengers(airline_options)
143
+
144
+ post['order']['additionalInput']['airlineData'] = airline_data
145
+ end
146
+
147
+ def add_flight_legs(airline_options)
148
+ flight_legs = []
149
+ airline_options[:flight_legs]&.each do |fl|
150
+ leg = {}
151
+ leg['airlineClass'] = fl[:airline_class] if fl[:airline_class]
152
+ leg['arrivalAirport'] = fl[:arrival_airport] if fl[:arrival_airport]
153
+ leg['arrivalTime'] = fl[:arrival_time] if fl[:arrival_time]
154
+ leg['carrierCode'] = fl[:carrier_code] if fl[:carrier_code]
155
+ leg['conjunctionTicket'] = fl[:conjunction_ticket] if fl[:conjunction_ticket]
156
+ leg['couponNumber'] = fl[:coupon_number] if fl[:coupon_number]
157
+ leg['date'] = fl[:date] if fl[:date]
158
+ leg['departureTime'] = fl[:departure_time] if fl[:departure_time]
159
+ leg['endorsementOrRestriction'] = fl[:endorsement_or_restriction] if fl[:endorsement_or_restriction]
160
+ leg['exchangeTicket'] = fl[:exchange_ticket] if fl[:exchange_ticket]
161
+ leg['fare'] = fl[:fare] if fl[:fare]
162
+ leg['fareBasis'] = fl[:fare_basis] if fl[:fare_basis]
163
+ leg['fee'] = fl[:fee] if fl[:fee]
164
+ leg['flightNumber'] = fl[:flight_number] if fl[:flight_number]
165
+ leg['number'] = fl[:number] if fl[:number]
166
+ leg['originAirport'] = fl[:origin_airport] if fl[:origin_airport]
167
+ leg['passengerClass'] = fl[:passenger_class] if fl[:passenger_class]
168
+ leg['stopoverCode'] = fl[:stopover_code] if fl[:stopover_code]
169
+ leg['taxes'] = fl[:taxes] if fl[:taxes]
170
+ flight_legs << leg
171
+ end
172
+ flight_legs
173
+ end
174
+
175
+ def add_passengers(airline_options)
176
+ passengers = []
177
+ airline_options[:passengers]&.each do |flyer|
178
+ passenger = {}
179
+ passenger['firstName'] = flyer[:first_name] if flyer[:first_name]
180
+ passenger['surname'] = flyer[:surname] if flyer[:surname]
181
+ passenger['surnamePrefix'] = flyer[:surname_prefix] if flyer[:surname_prefix]
182
+ passenger['title'] = flyer[:title] if flyer[:title]
183
+ passengers << passenger
184
+ end
185
+ passengers
186
+ end
187
+
188
+ def add_lodging_data(post, options)
189
+ return unless lodging_options = options[:lodging_data]
190
+
191
+ lodging_data = {}
192
+
193
+ lodging_data['charges'] = add_charges(lodging_options)
194
+ lodging_data['checkInDate'] = lodging_options[:check_in_date] if lodging_options[:check_in_date]
195
+ lodging_data['checkOutDate'] = lodging_options[:check_out_date] if lodging_options[:check_out_date]
196
+ lodging_data['folioNumber'] = lodging_options[:folio_number] if lodging_options[:folio_number]
197
+ lodging_data['isConfirmedReservation'] = lodging_options[:is_confirmed_reservation] if lodging_options[:is_confirmed_reservation]
198
+ lodging_data['isFacilityFireSafetyConform'] = lodging_options[:is_facility_fire_safety_conform] if lodging_options[:is_facility_fire_safety_conform]
199
+ lodging_data['isNoShow'] = lodging_options[:is_no_show] if lodging_options[:is_no_show]
200
+ lodging_data['isPreferenceSmokingRoom'] = lodging_options[:is_preference_smoking_room] if lodging_options[:is_preference_smoking_room]
201
+ lodging_data['numberOfAdults'] = lodging_options[:number_of_adults] if lodging_options[:number_of_adults]
202
+ lodging_data['numberOfNights'] = lodging_options[:number_of_nights] if lodging_options[:number_of_nights]
203
+ lodging_data['numberOfRooms'] = lodging_options[:number_of_rooms] if lodging_options[:number_of_rooms]
204
+ lodging_data['programCode'] = lodging_options[:program_code] if lodging_options[:program_code]
205
+ lodging_data['propertyCustomerServicePhoneNumber'] = lodging_options[:property_customer_service_phone_number] if lodging_options[:property_customer_service_phone_number]
206
+ lodging_data['propertyPhoneNumber'] = lodging_options[:property_phone_number] if lodging_options[:property_phone_number]
207
+ lodging_data['renterName'] = lodging_options[:renter_name] if lodging_options[:renter_name]
208
+ lodging_data['rooms'] = add_rooms(lodging_options)
209
+
210
+ post['order']['additionalInput']['lodgingData'] = lodging_data
211
+ end
212
+
213
+ def add_charges(lodging_options)
214
+ charges = []
215
+ lodging_options[:charges]&.each do |item|
216
+ charge = {}
217
+ charge['chargeAmount'] = item[:charge_amount] if item[:charge_amount]
218
+ charge['chargeAmountCurrencyCode'] = item[:charge_amount_currency_code] if item[:charge_amount_currency_code]
219
+ charge['chargeType'] = item[:charge_type] if item[:charge_type]
220
+ charges << charge
221
+ end
222
+ charges
223
+ end
224
+
225
+ def add_rooms(lodging_options)
226
+ rooms = []
227
+ lodging_options[:rooms]&.each do |item|
228
+ room = {}
229
+ room['dailyRoomRate'] = item[:daily_room_rate] if item[:daily_room_rate]
230
+ room['dailyRoomRateCurrencyCode'] = item[:daily_room_rate_currency_code] if item[:daily_room_rate_currency_code]
231
+ room['dailyRoomTaxAmount'] = item[:daily_room_tax_amount] if item[:daily_room_tax_amount]
232
+ room['dailyRoomTaxAmountCurrencyCode'] = item[:daily_room_tax_amount_currency_code] if item[:daily_room_tax_amount_currency_code]
233
+ room['numberOfNightsAtRoomRate'] = item[:number_of_nights_at_room_rate] if item[:number_of_nights_at_room_rate]
234
+ room['roomLocation'] = item[:room_location] if item[:room_location]
235
+ room['roomNumber'] = item[:room_number] if item[:room_number]
236
+ room['typeOfBed'] = item[:type_of_bed] if item[:type_of_bed]
237
+ room['typeOfRoom'] = item[:type_of_room] if item[:type_of_room]
238
+ rooms << room
239
+ end
240
+ rooms
241
+ end
242
+
243
+ def add_creator_info(post, options)
244
+ post['sdkIdentifier'] = options[:sdk_identifier] if options[:sdk_identifier]
245
+ post['sdkCreator'] = options[:sdk_creator] if options[:sdk_creator]
246
+ post['integrator'] = options[:integrator] if options[:integrator]
247
+ post['shoppingCartExtension'] = {}
248
+ post['shoppingCartExtension']['creator'] = options[:creator] if options[:creator]
249
+ post['shoppingCartExtension']['name'] = options[:name] if options[:name]
250
+ post['shoppingCartExtension']['version'] = options[:version] if options[:version]
251
+ post['shoppingCartExtension']['extensionID'] = options[:extension_ID] if options[:extension_ID]
252
+ end
253
+
254
+ def add_amount(post, money, options = {})
255
+ currency_ogone = 'EUR' if ogone_direct?
256
+ post['amountOfMoney'] = {
257
+ 'amount' => amount(money),
258
+ 'currencyCode' => options[:currency] || currency_ogone || currency(money)
259
+ }
260
+ end
261
+
262
+ def add_payment(post, payment, options)
263
+ year = format(payment.year, :two_digits)
264
+ month = format(payment.month, :two_digits)
265
+ expirydate = "#{month}#{year}"
266
+ pre_authorization = options[:pre_authorization] ? 'PRE_AUTHORIZATION' : 'FINAL_AUTHORIZATION'
267
+ product_id = options[:payment_product_id] || BRAND_MAP[payment.brand]
268
+ specifics_inputs = {
269
+ 'paymentProductId' => product_id,
270
+ 'skipAuthentication' => options[:skip_authentication] || 'true', # refers to 3DSecure
271
+ 'skipFraudService' => 'true',
272
+ 'authorizationMode' => pre_authorization
273
+ }
274
+ specifics_inputs['requiresApproval'] = options[:requires_approval] unless options[:requires_approval].nil?
275
+ if payment.is_a?(NetworkTokenizationCreditCard)
276
+ add_mobile_credit_card(post, payment, options, specifics_inputs, expirydate)
277
+ elsif payment.is_a?(CreditCard)
278
+ options[:google_pay_pan_only] ? add_mobile_credit_card(post, payment, options, specifics_inputs, expirydate) : add_credit_card(post, payment, specifics_inputs, expirydate)
279
+ end
280
+ end
281
+
282
+ def add_credit_card(post, payment, specifics_inputs, expirydate)
283
+ post['cardPaymentMethodSpecificInput'] = specifics_inputs.merge({
284
+ 'card' => {
285
+ 'cvv' => payment.verification_value,
286
+ 'cardNumber' => payment.number,
287
+ 'expiryDate' => expirydate,
288
+ 'cardholderName' => payment.name
289
+ }
290
+ })
291
+ end
292
+
293
+ def add_mobile_credit_card(post, payment, options, specifics_inputs, expirydate)
294
+ specifics_inputs['paymentProductId'] = options[:google_pay_pan_only] ? BRAND_MAP[:google_pay] : BRAND_MAP[payment.source]
295
+ post['mobilePaymentMethodSpecificInput'] = specifics_inputs
296
+ add_decrypted_payment_data(post, payment, options, expirydate)
297
+ end
298
+
299
+ def add_decrypted_payment_data(post, payment, options, expirydate)
300
+ if payment.is_a?(NetworkTokenizationCreditCard) && payment.payment_cryptogram
301
+ data = {
302
+ 'cardholderName' => payment.name,
303
+ 'cryptogram' => payment.payment_cryptogram,
304
+ 'eci' => payment.eci,
305
+ 'expiryDate' => expirydate,
306
+ 'dpan' => payment.number
307
+ }
308
+ data['paymentMethod'] = 'TOKENIZED_CARD' if payment.source == :google_pay
309
+ # else case when google payment is an ONLY_PAN, doesn't have cryptogram or eci.
310
+ elsif options[:google_pay_pan_only]
311
+ data = {
312
+ 'cardholderName' => payment.name,
313
+ 'expiryDate' => expirydate,
314
+ 'pan' => payment.number,
315
+ 'paymentMethod' => 'CARD'
316
+ }
317
+ end
318
+ post['mobilePaymentMethodSpecificInput']['decryptedPaymentData'] = data if data
319
+ end
320
+
321
+ def add_customer_data(post, options, payment = nil)
322
+ if payment
323
+ post['order']['customer']['personalInformation']['name']['firstName'] = payment.first_name[0..14] if payment.first_name
324
+ post['order']['customer']['personalInformation']['name']['surname'] = payment.last_name[0..69] if payment.last_name
325
+ end
326
+ post['order']['customer']['merchantCustomerId'] = options[:customer] if options[:customer]
327
+ post['order']['customer']['companyInformation']['name'] = options[:company] if options[:company]
328
+ post['order']['customer']['contactDetails']['emailAddress'] = options[:email] if options[:email]
329
+ if address = options[:billing_address] || options[:address]
330
+ post['order']['customer']['contactDetails']['phoneNumber'] = address[:phone] if address[:phone]
331
+ end
332
+ end
333
+
334
+ def add_refund_customer_data(post, options)
335
+ if address = options[:billing_address] || options[:address]
336
+ post['customer']['address'] = {
337
+ 'countryCode' => address[:country]
338
+ }
339
+ post['customer']['contactDetails']['emailAddress'] = options[:email] if options[:email]
340
+ if address = options[:billing_address] || options[:address]
341
+ post['customer']['contactDetails']['phoneNumber'] = address[:phone] if address[:phone]
342
+ end
343
+ end
344
+ end
345
+
346
+ def add_address(post, creditcard, options)
347
+ shipping_address = options[:shipping_address]
348
+ if billing_address = options[:billing_address] || options[:address]
349
+ post['order']['customer']['billingAddress'] = {
350
+ 'street' => truncate(billing_address[:address1], 50),
351
+ 'additionalInfo' => truncate(billing_address[:address2], 50),
352
+ 'zip' => billing_address[:zip],
353
+ 'city' => billing_address[:city],
354
+ 'state' => truncate(billing_address[:state], 35),
355
+ 'countryCode' => billing_address[:country]
356
+ }
357
+ end
358
+ if shipping_address
359
+ post['order']['customer']['shippingAddress'] = {
360
+ 'street' => truncate(shipping_address[:address1], 50),
361
+ 'additionalInfo' => truncate(shipping_address[:address2], 50),
362
+ 'zip' => shipping_address[:zip],
363
+ 'city' => shipping_address[:city],
364
+ 'state' => truncate(shipping_address[:state], 35),
365
+ 'countryCode' => shipping_address[:country]
366
+ }
367
+ post['order']['customer']['shippingAddress']['name'] = {
368
+ 'firstName' => shipping_address[:firstname],
369
+ 'surname' => shipping_address[:lastname]
370
+ }
371
+ end
372
+ end
373
+
374
+ def add_fraud_fields(post, options)
375
+ fraud_fields = {}
376
+ fraud_fields.merge!(options[:fraud_fields]) if options[:fraud_fields]
377
+ fraud_fields[:customerIpAddress] = options[:ip] if options[:ip]
378
+
379
+ post['fraudFields'] = fraud_fields unless fraud_fields.empty?
380
+ end
381
+
382
+ def add_external_cardholder_authentication_data(post, options)
383
+ return unless threeds_2_options = options[:three_d_secure]
384
+
385
+ authentication_data = {
386
+ priorThreeDSecureData: { acsTransactionId: threeds_2_options[:acs_transaction_id] }.compact,
387
+ cavv: threeds_2_options[:cavv],
388
+ cavvAlgorithm: threeds_2_options[:cavv_algorithm],
389
+ directoryServerTransactionId: threeds_2_options[:ds_transaction_id],
390
+ eci: threeds_2_options[:eci],
391
+ threeDSecureVersion: threeds_2_options[:version] || options[:three_ds_version],
392
+ validationResult: threeds_2_options[:authentication_response_status],
393
+ xid: threeds_2_options[:xid],
394
+ acsTransactionId: threeds_2_options[:acs_transaction_id],
395
+ flow: threeds_2_options[:flow]
396
+ }.compact
397
+
398
+ post['cardPaymentMethodSpecificInput'] ||= {}
399
+ post['cardPaymentMethodSpecificInput']['threeDSecure'] ||= {}
400
+ post['cardPaymentMethodSpecificInput']['threeDSecure']['merchantFraudRate'] = threeds_2_options[:merchant_fraud_rate]
401
+ post['cardPaymentMethodSpecificInput']['threeDSecure']['exemptionRequest'] = threeds_2_options[:exemption_request]
402
+ post['cardPaymentMethodSpecificInput']['threeDSecure']['secureCorporatePayment'] = threeds_2_options[:secure_corporate_payment]
403
+ post['cardPaymentMethodSpecificInput']['threeDSecure']['externalCardholderAuthenticationData'] = authentication_data unless authentication_data.empty?
404
+ end
405
+
406
+ def add_number_of_installments(post, options)
407
+ post['order']['additionalInput']['numberOfInstallments'] = options[:number_of_installments] if options[:number_of_installments]
408
+ end
409
+
410
+ def parse(body)
411
+ JSON.parse(body)
412
+ end
413
+
414
+ def url(action, authorization)
415
+ return preproduction_url + uri(action, authorization) if @options[:url_override].to_s == 'preproduction'
416
+ return ogone_direct_url(action, authorization) if ogone_direct?
417
+
418
+ (test? ? test_url : live_url) + uri(action, authorization)
419
+ end
420
+
421
+ def ogone_direct_url(action, authorization)
422
+ (test? ? ogone_direct_test : ogone_direct_live) + uri(action, authorization)
423
+ end
424
+
425
+ def ogone_direct?
426
+ @options[:url_override].to_s == 'ogone_direct'
427
+ end
428
+
429
+ def uri(action, authorization)
430
+ version = ogone_direct? ? 'v2' : 'v1'
431
+ uri = "/#{version}/#{@options[:merchant_id]}/"
432
+ case action
433
+ when :authorize
434
+ uri + 'payments'
435
+ when :capture
436
+ capture_name = ogone_direct? ? 'capture' : 'approve'
437
+ uri + "payments/#{authorization}/#{capture_name}"
438
+ when :refund
439
+ uri + "payments/#{authorization}/refund"
440
+ when :void
441
+ uri + "payments/#{authorization}/cancel"
442
+ when :inquire
443
+ uri + "payments/#{authorization}"
444
+ end
445
+ end
446
+
447
+ def idempotency_key_for_signature(options)
448
+ "x-gcs-idempotence-key:#{options[:idempotency_key]}" if options[:idempotency_key] && !ogone_direct?
449
+ end
450
+
451
+ def commit(method, action, post, authorization: nil, options: {})
452
+ begin
453
+ raw_response = ssl_request(method, url(action, authorization), post&.to_json, headers(method, action, post, authorization, options))
454
+ response = parse(raw_response)
455
+ rescue ResponseError => e
456
+ response = parse(e.response.body) if e.response.code.to_i >= 400
457
+ rescue JSON::ParserError
458
+ response = json_error(raw_response)
459
+ end
460
+
461
+ succeeded = success_from(action, response)
462
+ Response.new(
463
+ succeeded,
464
+ message_from(succeeded, response),
465
+ response,
466
+ authorization: authorization_from(response),
467
+ error_code: error_code_from(succeeded, response),
468
+ test: test?
469
+ )
470
+ end
471
+
472
+ def json_error(raw_response)
473
+ {
474
+ 'error_message' => 'Invalid response received from the Ingenico ePayments (formerly GlobalCollect) API. Please contact Ingenico ePayments if you continue to receive this message.' \
475
+ " (The raw response returned by the API was #{raw_response.inspect})"
476
+ }
477
+ end
478
+
479
+ def headers(method, action, post, authorization = nil, options = {})
480
+ headers = {
481
+ 'Content-Type' => content_type,
482
+ 'Authorization' => auth_digest(method, action, post, authorization, options),
483
+ 'Date' => date
484
+ }
485
+
486
+ headers['X-GCS-Idempotence-Key'] = options[:idempotency_key] if options[:idempotency_key] && !ogone_direct?
487
+ headers
488
+ end
489
+
490
+ def auth_digest(method, action, post, authorization = nil, options = {})
491
+ data = <<~REQUEST
492
+ #{method.to_s.upcase}
493
+ #{content_type}
494
+ #{date}
495
+ #{idempotency_key_for_signature(options)}
496
+ #{uri(action, authorization)}
497
+ REQUEST
498
+ data = data.each_line.reject { |line| line.strip == '' }.join
499
+ digest = OpenSSL::Digest.new('SHA256')
500
+ key = @options[:secret_api_key]
501
+ "GCS v1HMAC:#{@options[:api_key_id]}:#{Base64.strict_encode64(OpenSSL::HMAC.digest(digest, key, data)).strip}"
502
+ end
503
+
504
+ def date
505
+ @date ||= Time.now.gmtime.strftime('%a, %d %b %Y %H:%M:%S GMT')
506
+ end
507
+
508
+ def content_type
509
+ 'application/json'
510
+ end
511
+
512
+ def success_from(action, response)
513
+ return false if response['errorId'] || response['error_message']
514
+
515
+ return %w(CAPTURED CAPTURE_REQUESTED).include?(response.dig('payment', 'status')) if response.dig('payment', 'paymentOutput', 'paymentMethod') == 'mobile'
516
+
517
+ case action
518
+ when :authorize
519
+ response.dig('payment', 'statusOutput', 'isAuthorized')
520
+ when :capture
521
+ capture_status = response.dig('status') || response.dig('payment', 'status')
522
+ %w(CAPTURED CAPTURE_REQUESTED).include?(capture_status)
523
+ when :void
524
+ void_response_id = response.dig('cardPaymentMethodSpecificOutput', 'voidResponseId') || response.dig('mobilePaymentMethodSpecificOutput', 'voidResponseId')
525
+ %w(00 0 8 11).include?(void_response_id) || response.dig('payment', 'status') == 'CANCELLED'
526
+ when :refund
527
+ refund_status = response.dig('status') || response.dig('payment', 'status')
528
+ %w(REFUNDED REFUND_REQUESTED).include?(refund_status)
529
+ else
530
+ response['status'] != 'REJECTED'
531
+ end
532
+ end
533
+
534
+ def message_from(succeeded, response)
535
+ return 'Succeeded' if succeeded
536
+
537
+ if errors = response['errors']
538
+ errors.first.try(:[], 'message')
539
+ elsif response['error_message']
540
+ response['error_message']
541
+ elsif response['status']
542
+ 'Status: ' + response['status']
543
+ else
544
+ 'No message available'
545
+ end
546
+ end
547
+
548
+ def authorization_from(response)
549
+ response.dig('id') || response.dig('payment', 'id') || response.dig('paymentResult', 'payment', 'id')
550
+ end
551
+
552
+ def error_code_from(succeeded, response)
553
+ return if succeeded
554
+
555
+ if errors = response['errors']
556
+ errors.first.try(:[], 'code')
557
+ elsif status = response.try(:[], 'statusOutput').try(:[], 'statusCode')
558
+ status.to_s
559
+ else
560
+ 'No error code available'
561
+ end
562
+ end
563
+
564
+ def nestable_hash
565
+ Hash.new { |h, k| h[k] = Hash.new(&h.default_proc) }
566
+ end
567
+
568
+ # Capture hasn't already been requested,
569
+ # and
570
+ # `requires_approval` is not false
571
+ def should_request_capture?(response, requires_approval)
572
+ !capture_requested?(response) && requires_approval != false
573
+ end
574
+
575
+ def capture_requested?(response)
576
+ response.params.try(:[], 'payment').try(:[], 'status') == 'CAPTURE_REQUESTED'
577
+ end
578
+ end
579
+ end
580
+ end