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,343 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class DLocalGateway < Gateway
4
+ self.test_url = 'https://sandbox.dlocal.com'
5
+ self.live_url = 'https://api.dlocal.com'
6
+
7
+ self.supported_countries = %w[AR BD BO BR CL CM CN CO CR DO EC EG GH GT IN ID JP KE MY MX MA NG PA PY PE PH SN SV TH TR TZ UG UY VN ZA]
8
+ self.default_currency = 'USD'
9
+ self.supported_cardtypes = %i[visa master american_express discover jcb diners_club maestro naranja cabal elo alia carnet]
10
+
11
+ self.homepage_url = 'https://dlocal.com/'
12
+ self.display_name = 'dLocal'
13
+
14
+ def initialize(options = {})
15
+ requires!(options, :login, :trans_key, :secret_key)
16
+ super
17
+ end
18
+
19
+ def purchase(money, payment, options = {})
20
+ post = {}
21
+ add_auth_purchase_params(post, money, payment, 'purchase', options)
22
+ add_three_ds(post, options)
23
+
24
+ commit('purchase', post, options)
25
+ end
26
+
27
+ def authorize(money, payment, options = {})
28
+ post = {}
29
+ add_auth_purchase_params(post, money, payment, 'authorize', options)
30
+ add_three_ds(post, options)
31
+ post[:card][:verify] = true if options[:verify].to_s == 'true'
32
+
33
+ commit('authorize', post, options)
34
+ end
35
+
36
+ def capture(money, authorization, options = {})
37
+ post = {}
38
+ post[:authorization_id] = authorization
39
+ add_invoice(post, money, options) if money
40
+ commit('capture', post, options)
41
+ end
42
+
43
+ def refund(money, authorization, options = {})
44
+ post = {}
45
+ post[:payment_id] = authorization
46
+ post[:notification_url] = options[:notification_url]
47
+ add_invoice(post, money, options) if money
48
+ commit('refund', post, options)
49
+ end
50
+
51
+ def void(authorization, options = {})
52
+ post = {}
53
+ post[:authorization_id] = authorization
54
+ commit('void', post, options)
55
+ end
56
+
57
+ def verify(credit_card, options = {})
58
+ authorize(0, credit_card, options.merge(verify: 'true'))
59
+ end
60
+
61
+ def inquire(authorization, options = {})
62
+ post = {}
63
+ post[:payment_id] = authorization
64
+ action = authorization ? 'status' : 'orders'
65
+ commit(action, post, options)
66
+ end
67
+
68
+ def supports_scrubbing?
69
+ true
70
+ end
71
+
72
+ def supports_network_tokenization?
73
+ true
74
+ end
75
+
76
+ def scrub(transcript)
77
+ transcript.
78
+ gsub(%r((X-Trans-Key: )\w+), '\1[FILTERED]').
79
+ gsub(%r((\"number\\\":\\\")\d+), '\1[FILTERED]').
80
+ gsub(%r((\"cvv\\\":\\\")\d+), '\1[FILTERED]')
81
+ end
82
+
83
+ private
84
+
85
+ def add_auth_purchase_params(post, money, card, action, options)
86
+ add_invoice(post, money, options)
87
+ post[:payment_method_id] = 'CARD'
88
+ post[:payment_method_flow] = 'DIRECT'
89
+ add_country(post, card, options)
90
+ add_payer(post, card, options)
91
+ add_card(post, card, action, options)
92
+ add_additional_data(post, options)
93
+ post[:order_id] = options[:order_id] || generate_unique_id
94
+ post[:original_order_id] = options[:original_order_id] if options[:original_order_id]
95
+ post[:description] = options[:description] if options[:description]
96
+ end
97
+
98
+ def add_invoice(post, money, options)
99
+ post[:amount] = amount(money)
100
+ post[:currency] = (options[:currency] || currency(money))
101
+ end
102
+
103
+ def add_additional_data(post, options)
104
+ post[:additional_risk_data] = options[:additional_data]
105
+ end
106
+
107
+ def add_country(post, card, options)
108
+ return unless address = options[:billing_address] || options[:address]
109
+
110
+ post[:country] = lookup_country_code(address[:country])
111
+ end
112
+
113
+ def lookup_country_code(country_field)
114
+ Country.find(country_field).code(:alpha2).value
115
+ rescue InvalidCountryCodeError
116
+ nil
117
+ end
118
+
119
+ def add_payer(post, card, options)
120
+ address = options[:billing_address] || options[:address]
121
+ post[:payer] = {}
122
+ post[:payer][:name] = card.name
123
+ post[:payer][:email] = options[:email] if options[:email]
124
+ post[:payer][:birth_date] = options[:birth_date] if options[:birth_date]
125
+ post[:payer][:phone] = address[:phone] if address && address[:phone]
126
+ post[:payer][:document] = options[:document] if options[:document]
127
+ post[:payer][:document2] = options[:document2] if options[:document2]
128
+ post[:payer][:user_reference] = options[:user_reference] if options[:user_reference]
129
+ post[:payer][:event_uuid] = options[:device_id] if options[:device_id]
130
+ post[:payer][:onboarding_ip_address] = options[:ip] if options[:ip]
131
+ post[:payer][:address] = add_address(post, card, options)
132
+ end
133
+
134
+ def add_address(post, card, options)
135
+ return unless address = options[:billing_address] || options[:address]
136
+
137
+ address_object = {}
138
+ address_object[:state] = address[:state] if address[:state]
139
+ address_object[:city] = address[:city] if address[:city]
140
+ address_object[:zip_code] = address[:zip] if address[:zip]
141
+ address_object[:street] = address[:street] || parse_street(address) if parse_street(address)
142
+ address_object[:number] = address[:number] || parse_house_number(address) if parse_house_number(address)
143
+ address_object
144
+ end
145
+
146
+ def parse_street(address)
147
+ return unless address[:address1]
148
+
149
+ street = address[:address1].split(/\s+/).keep_if { |x| x !~ /\d/ }.join(' ')
150
+ street.empty? ? nil : street
151
+ end
152
+
153
+ def parse_house_number(address)
154
+ return unless address[:address1]
155
+
156
+ house = address[:address1].split(/\s+/).keep_if { |x| x =~ /\d/ }.join(' ')
157
+ house.empty? ? nil : house
158
+ end
159
+
160
+ def add_card(post, card, action, options = {})
161
+ post[:card] = {}
162
+ if card.is_a?(NetworkTokenizationCreditCard)
163
+ post[:card][:network_token] = card.number
164
+ post[:card][:cryptogram] = card.payment_cryptogram
165
+ post[:card][:eci] = card.eci
166
+ # used case of Network Token: 'CARD_ON_FILE', 'SUBSCRIPTION', 'UNSCHEDULED_CARD_ON_FILE'
167
+ if options.dig(:stored_credential, :reason_type) == 'unscheduled'
168
+ if options.dig(:stored_credential, :initiator) == 'merchant'
169
+ post[:card][:stored_credential_type] = 'UNSCHEDULED_CARD_ON_FILE'
170
+ else
171
+ post[:card][:stored_credential_type] = 'CARD_ON_FILE'
172
+ end
173
+ else
174
+ post[:card][:stored_credential_type] = 'SUBSCRIPTION'
175
+ end
176
+ # required for MC debit recurrent in BR 'USED'(subsecuence Payments) . 'FIRST' an inital payment
177
+ post[:card][:stored_credential_usage] = (options[:stored_credential][:initial_transaction] ? 'FIRST' : 'USED') if options[:stored_credential]
178
+ else
179
+ post[:card][:number] = card.number
180
+ post[:card][:cvv] = card.verification_value
181
+ end
182
+
183
+ post[:card][:holder_name] = card.name
184
+ post[:card][:expiration_month] = card.month
185
+ post[:card][:expiration_year] = card.year
186
+ post[:card][:descriptor] = options[:dynamic_descriptor] if options[:dynamic_descriptor]
187
+ post[:card][:capture] = (action == 'purchase')
188
+ post[:card][:installments] = options[:installments] if options[:installments]
189
+ post[:card][:installments_id] = options[:installments_id] if options[:installments_id]
190
+ post[:card][:force_type] = options[:force_type].to_s.upcase if options[:force_type]
191
+ post[:card][:save] = options[:save] if options[:save]
192
+ end
193
+
194
+ def parse(body)
195
+ JSON.parse(body)
196
+ end
197
+
198
+ def commit(action, parameters, options = {})
199
+ three_ds_errors = validate_three_ds_params(parameters[:three_dsecure]) if parameters[:three_dsecure].present?
200
+ return three_ds_errors if three_ds_errors
201
+
202
+ url = url(action, parameters, options)
203
+ post = post_data(action, parameters)
204
+ begin
205
+ raw = if %w(status orders).include?(action)
206
+ ssl_get(url, headers(nil, options))
207
+ else
208
+ ssl_post(url, post, headers(post, options))
209
+ end
210
+ response = parse(raw)
211
+ rescue ResponseError => e
212
+ raw = e.response.body
213
+ response = parse(raw)
214
+ end
215
+
216
+ Response.new(
217
+ success_from(action, response),
218
+ message_from(action, response),
219
+ response,
220
+ authorization: authorization_from(response),
221
+ avs_result: AVSResult.new(code: response['some_avs_response_key']),
222
+ cvv_result: CVVResult.new(response['some_cvv_response_key']),
223
+ test: test?,
224
+ error_code: error_code_from(action, response)
225
+ )
226
+ end
227
+
228
+ # A refund may not be immediate, and return a status_code of 100, "Pending".
229
+ # Since we aren't handling async notifications of eventual success,
230
+ # we count 100 as a success.
231
+ def success_from(action, response)
232
+ return false unless response['status_code']
233
+
234
+ %w[100 200 400 600 700].include? response['status_code'].to_s
235
+ end
236
+
237
+ def message_from(action, response)
238
+ response['status_detail'] || response['message']
239
+ end
240
+
241
+ def authorization_from(response)
242
+ response['id']
243
+ end
244
+
245
+ def error_code_from(action, response)
246
+ return if success_from(action, response)
247
+
248
+ code = response['status_code'] || response['code']
249
+ code&.to_s
250
+ end
251
+
252
+ def url(action, parameters, options = {})
253
+ "#{(test? ? test_url : live_url)}/#{endpoint(action, parameters, options)}/"
254
+ end
255
+
256
+ def endpoint(action, parameters, options)
257
+ case action
258
+ when 'purchase'
259
+ 'secure_payments'
260
+ when 'authorize'
261
+ 'secure_payments'
262
+ when 'refund'
263
+ 'refunds'
264
+ when 'capture'
265
+ 'payments'
266
+ when 'void'
267
+ "payments/#{parameters[:authorization_id]}/cancel"
268
+ when 'status'
269
+ "payments/#{parameters[:payment_id]}/status"
270
+ when 'orders'
271
+ "orders/#{options[:order_id]}"
272
+ end
273
+ end
274
+
275
+ def headers(post, options = {})
276
+ timestamp = Time.now.utc.iso8601
277
+ headers = {
278
+ 'Content-Type' => 'application/json',
279
+ 'X-Date' => timestamp,
280
+ 'X-Login' => @options[:login],
281
+ 'X-Trans-Key' => @options[:trans_key],
282
+ 'X-Version' => '2.1',
283
+ 'Authorization' => signature(post, timestamp)
284
+ }
285
+ headers['X-Idempotency-Key'] = options[:idempotency_key] if options[:idempotency_key]
286
+ headers
287
+ end
288
+
289
+ def signature(post, timestamp)
290
+ content = "#{@options[:login]}#{timestamp}#{post}"
291
+ digest = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), @options[:secret_key], content)
292
+ "V2-HMAC-SHA256, Signature: #{digest}"
293
+ end
294
+
295
+ def post_data(action, parameters = {})
296
+ parameters.to_json
297
+ end
298
+
299
+ def xid_or_ds_trans_id(three_d_secure)
300
+ if three_d_secure[:version].to_f >= 2
301
+ { ds_transaction_id: three_d_secure[:ds_transaction_id] }
302
+ else
303
+ { xid: three_d_secure[:xid] }
304
+ end
305
+ end
306
+
307
+ def add_three_ds(post, options)
308
+ return unless three_d_secure = options[:three_d_secure]
309
+
310
+ post[:three_dsecure] = {
311
+ mpi: true,
312
+ three_dsecure_version: three_d_secure[:version],
313
+ cavv: three_d_secure[:cavv],
314
+ eci: three_d_secure[:eci],
315
+ enrollment_response: formatted_enrollment(three_d_secure[:enrolled]),
316
+ authentication_response: three_d_secure[:authentication_response_status]
317
+ }.merge(xid_or_ds_trans_id(three_d_secure))
318
+ end
319
+
320
+ def validate_three_ds_params(three_ds)
321
+ errors = {}
322
+ supported_version = %w{1.0 2.0 2.1.0 2.2.0}.include?(three_ds[:three_dsecure_version])
323
+ supported_enrollment = ['Y', 'N', 'U', nil].include?(three_ds[:enrollment_response])
324
+ supported_auth_response = ['Y', 'N', 'U', nil].include?(three_ds[:authentication_response])
325
+
326
+ errors[:three_ds_version] = 'ThreeDs version not supported' unless supported_version
327
+ errors[:enrollment] = 'Enrollment value not supported' unless supported_enrollment
328
+ errors[:auth_response] = 'Authentication response value not supported' unless supported_auth_response
329
+ errors.compact!
330
+
331
+ errors.present? ? Response.new(false, 'ThreeDs data is invalid', errors) : nil
332
+ end
333
+
334
+ def formatted_enrollment(val)
335
+ case val
336
+ when 'Y', 'N', 'U' then val
337
+ when true, 'true' then 'Y'
338
+ when false, 'false' then 'N'
339
+ end
340
+ end
341
+ end
342
+ end
343
+ end
@@ -0,0 +1,302 @@
1
+ require 'active_support/core_ext/string/access'
2
+
3
+ module ActiveMerchant
4
+ module Billing
5
+ class DataCashGateway < Gateway
6
+ self.default_currency = 'GBP'
7
+ self.supported_countries = ['GB']
8
+
9
+ self.supported_cardtypes = %i[visa master american_express discover diners_club jcb maestro]
10
+
11
+ self.homepage_url = 'http://www.datacash.com/'
12
+ self.display_name = 'DataCash'
13
+
14
+ self.test_url = 'https://testserver.datacash.com/Transaction'
15
+ self.live_url = 'https://mars.transaction.datacash.com/Transaction'
16
+
17
+ AUTH_TYPE = 'auth'
18
+ CANCEL_TYPE = 'cancel'
19
+ FULFILL_TYPE = 'fulfill'
20
+ PRE_TYPE = 'pre'
21
+ REFUND_TYPE = 'refund'
22
+ TRANSACTION_REFUND_TYPE = 'txn_refund'
23
+
24
+ POLICY_ACCEPT = 'accept'
25
+ POLICY_REJECT = 'reject'
26
+
27
+ def initialize(options = {})
28
+ requires!(options, :login, :password)
29
+ super
30
+ end
31
+
32
+ def purchase(money, authorization_or_credit_card, options = {})
33
+ requires!(options, :order_id)
34
+
35
+ if authorization_or_credit_card.is_a?(String)
36
+ request = build_purchase_or_authorization_request_with_continuous_authority_reference_request(AUTH_TYPE, money, authorization_or_credit_card, options)
37
+ else
38
+ request = build_purchase_or_authorization_request_with_credit_card_request(AUTH_TYPE, money, authorization_or_credit_card, options)
39
+ end
40
+
41
+ commit(request)
42
+ end
43
+
44
+ def authorize(money, authorization_or_credit_card, options = {})
45
+ requires!(options, :order_id)
46
+
47
+ if authorization_or_credit_card.is_a?(String)
48
+ request = build_purchase_or_authorization_request_with_continuous_authority_reference_request(AUTH_TYPE, money, authorization_or_credit_card, options)
49
+ else
50
+ request = build_purchase_or_authorization_request_with_credit_card_request(PRE_TYPE, money, authorization_or_credit_card, options)
51
+ end
52
+
53
+ commit(request)
54
+ end
55
+
56
+ def capture(money, authorization, options = {})
57
+ commit(build_void_or_capture_request(FULFILL_TYPE, money, authorization, options))
58
+ end
59
+
60
+ def void(authorization, options = {})
61
+ request = build_void_or_capture_request(CANCEL_TYPE, nil, authorization, options)
62
+
63
+ commit(request)
64
+ end
65
+
66
+ def credit(money, reference_or_credit_card, options = {})
67
+ if reference_or_credit_card.is_a?(String)
68
+ ActiveMerchant.deprecated CREDIT_DEPRECATION_MESSAGE
69
+ refund(money, reference_or_credit_card)
70
+ else
71
+ request = build_credit_request(money, reference_or_credit_card, options)
72
+ commit(request)
73
+ end
74
+ end
75
+
76
+ def refund(money, reference, options = {})
77
+ commit(build_transaction_refund_request(money, reference))
78
+ end
79
+
80
+ def supports_scrubbing?
81
+ true
82
+ end
83
+
84
+ def scrub(transcript)
85
+ transcript.
86
+ gsub(/(<pan>)\d+(<\/pan>)/i, '\1[FILTERED]\2').
87
+ gsub(/(<cv2>)\d+(<\/cv2>)/i, '\1[FILTERED]\2').
88
+ gsub(/(<password>).+(<\/password>)/i, '\1[FILTERED]\2')
89
+ end
90
+
91
+ private
92
+
93
+ def build_void_or_capture_request(type, money, authorization, options)
94
+ parsed_authorization = parse_authorization_string(authorization)
95
+ xml = Builder::XmlMarkup.new indent: 2
96
+ xml.instruct!
97
+ xml.tag! :Request, version: '2' do
98
+ add_authentication(xml)
99
+
100
+ xml.tag! :Transaction do
101
+ xml.tag! :HistoricTxn do
102
+ xml.tag! :reference, parsed_authorization[:reference]
103
+ xml.tag! :authcode, parsed_authorization[:auth_code]
104
+ xml.tag! :method, type
105
+ end
106
+
107
+ if money
108
+ xml.tag! :TxnDetails do
109
+ xml.tag! :merchantreference, format_reference_number(options[:order_id])
110
+ xml.tag! :amount, amount(money), currency: options[:currency] || currency(money)
111
+ xml.tag! :capturemethod, 'ecomm'
112
+ end
113
+ end
114
+ end
115
+ end
116
+ xml.target!
117
+ end
118
+
119
+ def build_purchase_or_authorization_request_with_credit_card_request(type, money, credit_card, options)
120
+ xml = Builder::XmlMarkup.new indent: 2
121
+ xml.instruct!
122
+ xml.tag! :Request, version: '2' do
123
+ add_authentication(xml)
124
+
125
+ xml.tag! :Transaction do
126
+ xml.tag! :ContAuthTxn, type: 'setup' if options[:set_up_continuous_authority]
127
+ xml.tag! :CardTxn do
128
+ xml.tag! :method, type
129
+ add_credit_card(xml, credit_card, options[:billing_address])
130
+ end
131
+ xml.tag! :TxnDetails do
132
+ xml.tag! :merchantreference, format_reference_number(options[:order_id])
133
+ xml.tag! :amount, amount(money), currency: options[:currency] || currency(money)
134
+ xml.tag! :capturemethod, 'ecomm'
135
+ end
136
+ end
137
+ end
138
+ xml.target!
139
+ end
140
+
141
+ def build_purchase_or_authorization_request_with_continuous_authority_reference_request(type, money, authorization, options)
142
+ parsed_authorization = parse_authorization_string(authorization)
143
+ raise ArgumentError, 'The continuous authority reference is required for continuous authority transactions' if parsed_authorization[:ca_reference].blank?
144
+
145
+ xml = Builder::XmlMarkup.new indent: 2
146
+ xml.instruct!
147
+ xml.tag! :Request, version: '2' do
148
+ add_authentication(xml)
149
+ xml.tag! :Transaction do
150
+ xml.tag! :ContAuthTxn, type: 'historic'
151
+ xml.tag! :HistoricTxn do
152
+ xml.tag! :reference, parsed_authorization[:ca_reference]
153
+ xml.tag! :method, type
154
+ end
155
+ xml.tag! :TxnDetails do
156
+ xml.tag! :merchantreference, format_reference_number(options[:order_id])
157
+ xml.tag! :amount, amount(money), currency: options[:currency] || currency(money)
158
+ xml.tag! :capturemethod, 'cont_auth'
159
+ end
160
+ end
161
+ end
162
+ xml.target!
163
+ end
164
+
165
+ def build_transaction_refund_request(money, authorization)
166
+ parsed_authorization = parse_authorization_string(authorization)
167
+ xml = Builder::XmlMarkup.new indent: 2
168
+ xml.instruct!
169
+ xml.tag! :Request, version: '2' do
170
+ add_authentication(xml)
171
+ xml.tag! :Transaction do
172
+ xml.tag! :HistoricTxn do
173
+ xml.tag! :reference, parsed_authorization[:reference]
174
+ xml.tag! :method, TRANSACTION_REFUND_TYPE
175
+ end
176
+ unless money.nil?
177
+ xml.tag! :TxnDetails do
178
+ xml.tag! :amount, amount(money)
179
+ xml.tag! :capturemethod, 'ecomm'
180
+ end
181
+ end
182
+ end
183
+ end
184
+ xml.target!
185
+ end
186
+
187
+ def build_credit_request(money, credit_card, options)
188
+ xml = Builder::XmlMarkup.new indent: 2
189
+ xml.instruct!
190
+ xml.tag! :Request, version: '2' do
191
+ add_authentication(xml)
192
+ xml.tag! :Transaction do
193
+ xml.tag! :CardTxn do
194
+ xml.tag! :method, REFUND_TYPE
195
+ add_credit_card(xml, credit_card, options[:billing_address])
196
+ end
197
+ xml.tag! :TxnDetails do
198
+ xml.tag! :merchantreference, format_reference_number(options[:order_id])
199
+ xml.tag! :amount, amount(money)
200
+ xml.tag! :capturemethod, 'ecomm'
201
+ end
202
+ end
203
+ end
204
+ xml.target!
205
+ end
206
+
207
+ def add_authentication(xml)
208
+ xml.tag! :Authentication do
209
+ xml.tag! :client, @options[:login]
210
+ xml.tag! :password, @options[:password]
211
+ end
212
+ end
213
+
214
+ def add_credit_card(xml, credit_card, address)
215
+ xml.tag! :Card do
216
+ # DataCash calls the CC number 'pan'
217
+ xml.tag! :pan, credit_card.number
218
+ xml.tag! :expirydate, format_date(credit_card.month, credit_card.year)
219
+
220
+ xml.tag! :Cv2Avs do
221
+ xml.tag! :cv2, credit_card.verification_value if credit_card.verification_value?
222
+ if address
223
+ xml.tag! :street_address1, address[:address1] unless address[:address1].blank?
224
+ xml.tag! :street_address2, address[:address2] unless address[:address2].blank?
225
+ xml.tag! :street_address3, address[:address3] unless address[:address3].blank?
226
+ xml.tag! :street_address4, address[:address4] unless address[:address4].blank?
227
+ xml.tag! :postcode, address[:zip] unless address[:zip].blank?
228
+ end
229
+
230
+ # The ExtendedPolicy defines what to do when the passed data
231
+ # matches, or not...
232
+ #
233
+ # All of the following elements MUST be present for the
234
+ # xml to be valid (or can drop the ExtendedPolicy and use
235
+ # a predefined one
236
+ xml.tag! :ExtendedPolicy do
237
+ xml.tag! :cv2_policy,
238
+ notprovided: POLICY_REJECT,
239
+ notchecked: POLICY_REJECT,
240
+ matched: POLICY_ACCEPT,
241
+ notmatched: POLICY_REJECT,
242
+ partialmatch: POLICY_REJECT
243
+ xml.tag! :postcode_policy,
244
+ notprovided: POLICY_ACCEPT,
245
+ notchecked: POLICY_ACCEPT,
246
+ matched: POLICY_ACCEPT,
247
+ notmatched: POLICY_REJECT,
248
+ partialmatch: POLICY_ACCEPT
249
+ xml.tag! :address_policy,
250
+ notprovided: POLICY_ACCEPT,
251
+ notchecked: POLICY_ACCEPT,
252
+ matched: POLICY_ACCEPT,
253
+ notmatched: POLICY_REJECT,
254
+ partialmatch: POLICY_ACCEPT
255
+ end
256
+ end
257
+ end
258
+ end
259
+
260
+ def commit(request)
261
+ response = parse(ssl_post(test? ? self.test_url : self.live_url, request))
262
+
263
+ Response.new(response[:status] == '1', response[:reason], response,
264
+ test: test?,
265
+ authorization: "#{response[:datacash_reference]};#{response[:authcode]};#{response[:ca_reference]}")
266
+ end
267
+
268
+ def format_date(month, year)
269
+ "#{format(month, :two_digits)}/#{format(year, :two_digits)}"
270
+ end
271
+
272
+ def parse(body)
273
+ response = {}
274
+ xml = REXML::Document.new(body)
275
+ root = REXML::XPath.first(xml, '//Response')
276
+
277
+ root.elements.to_a.each do |node|
278
+ parse_element(response, node)
279
+ end
280
+
281
+ response
282
+ end
283
+
284
+ def parse_element(response, node)
285
+ if node.has_elements?
286
+ node.elements.each { |e| parse_element(response, e) }
287
+ else
288
+ response[node.name.underscore.to_sym] = node.text
289
+ end
290
+ end
291
+
292
+ def format_reference_number(number)
293
+ number.to_s.gsub(/[^A-Za-z0-9]/, '').rjust(6, '0').first(30)
294
+ end
295
+
296
+ def parse_authorization_string(authorization)
297
+ reference, auth_code, ca_reference = authorization.to_s.split(';')
298
+ { reference: reference, auth_code: auth_code, ca_reference: ca_reference }
299
+ end
300
+ end
301
+ end
302
+ end