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,354 @@
1
+ require 'nokogiri'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ # Public: This gateway allows you to interact with any gateway you've
6
+ # created in Spreedly (https://spreedly.com). It's an adapter which can be
7
+ # particularly useful if you already have code interacting with
8
+ # ActiveMerchant and want to easily take advantage of Spreedly's vault.
9
+ class SpreedlyCoreGateway < Gateway
10
+ SUCCESS_CODE = 200
11
+ SOFT_DECLINE_CODES = [401, 402, 408, 415, 422].freeze
12
+
13
+ self.live_url = 'https://core.spreedly.com/v1'
14
+
15
+ self.supported_countries = %w(AD AE AT AU BD BE BG BN CA CH CY CZ DE DK EE EG ES FI FR GB
16
+ GI GR HK HU ID IE IL IM IN IS IT JO KW LB LI LK LT LU LV MC
17
+ MT MU MV MX MY NL NO NZ OM PH PL PT QA RO SA SE SG SI SK SM
18
+ TR TT UM US VA VN ZA)
19
+
20
+ self.supported_cardtypes = %i[visa master american_express discover]
21
+ self.homepage_url = 'https://spreedly.com'
22
+ self.display_name = 'Spreedly'
23
+ self.money_format = :cents
24
+ self.default_currency = 'USD'
25
+
26
+ # Public: Create a new Spreedly gateway.
27
+ #
28
+ # options - A hash of options:
29
+ # :login - The environment key.
30
+ # :password - The access secret.
31
+ # :gateway_token - The token of the gateway you've created in
32
+ # Spreedly.
33
+ def initialize(options = {})
34
+ requires!(options, :login, :password, :gateway_token)
35
+ super
36
+ end
37
+
38
+ # Public: Run a purchase transaction.
39
+ #
40
+ # money - The monetary amount of the transaction in cents.
41
+ # payment_method - The CreditCard or Check or the Spreedly payment method token.
42
+ # options - A hash of options:
43
+ # :store - Retain the payment method if the purchase
44
+ # succeeds. Defaults to false. (optional)
45
+ def purchase(money, payment_method, options = {})
46
+ request = build_transaction_request(money, payment_method, options)
47
+ commit("gateways/#{options[:gateway_token] || @options[:gateway_token]}/purchase.xml", request)
48
+ end
49
+
50
+ # Public: Run an authorize transaction.
51
+ #
52
+ # money - The monetary amount of the transaction in cents.
53
+ # payment_method - The CreditCard or the Spreedly payment method token.
54
+ # options - A hash of options:
55
+ # :store - Retain the payment method if the authorize
56
+ # succeeds. Defaults to false. (optional)
57
+ def authorize(money, payment_method, options = {})
58
+ request = build_transaction_request(money, payment_method, options)
59
+ commit("gateways/#{@options[:gateway_token]}/authorize.xml", request)
60
+ end
61
+
62
+ def capture(money, authorization, options = {})
63
+ request = build_xml_request('transaction') do |doc|
64
+ add_invoice(doc, money, options)
65
+ end
66
+
67
+ commit("transactions/#{authorization}/capture.xml", request)
68
+ end
69
+
70
+ def refund(money, authorization, options = {})
71
+ request = build_xml_request('transaction') do |doc|
72
+ add_invoice(doc, money, options)
73
+ add_extra_options(:gateway_specific_fields, doc, options)
74
+ end
75
+
76
+ commit("transactions/#{authorization}/credit.xml", request)
77
+ end
78
+
79
+ def void(authorization, options = {})
80
+ commit("transactions/#{authorization}/void.xml", '')
81
+ end
82
+
83
+ # Public: Determine whether a credit card is chargeable card and available for purchases.
84
+ #
85
+ # payment_method - The CreditCard or the Spreedly payment method token.
86
+ # options - A hash of options:
87
+ # :store - Retain the payment method if the verify
88
+ # succeeds. Defaults to false. (optional)
89
+ def verify(payment_method, options = {})
90
+ if payment_method.is_a?(String)
91
+ verify_with_token(payment_method, options)
92
+ else
93
+ MultiResponse.run do |r|
94
+ r.process { save_card(options[:store], payment_method, options) }
95
+ r.process { verify_with_token(r.authorization, options) }
96
+ end
97
+ end
98
+ end
99
+
100
+ # Public: Store a credit card in the Spreedly vault and retain it.
101
+ #
102
+ # credit_card - The CreditCard to store
103
+ # options - A standard ActiveMerchant options hash
104
+ def store(credit_card, options = {})
105
+ retain = true
106
+ save_card(retain, credit_card, options)
107
+ end
108
+
109
+ # Public: Redact the CreditCard in Spreedly. This wipes the sensitive
110
+ # payment information from the card.
111
+ #
112
+ # credit_card - The CreditCard to store
113
+ # options - A standard ActiveMerchant options hash
114
+ def unstore(authorization, options = {})
115
+ commit("payment_methods/#{authorization}/redact.xml", '', :put)
116
+ end
117
+
118
+ # Public: Get the transaction with the given token.
119
+ def find(transaction_token)
120
+ commit("transactions/#{transaction_token}.xml", nil, :get)
121
+ end
122
+
123
+ def deliver(receiver_token, request)
124
+ commit("receivers/#{receiver_token}/deliver.xml", request)
125
+ end
126
+
127
+ alias status find
128
+
129
+ def supports_scrubbing?
130
+ true
131
+ end
132
+
133
+ def scrub(transcript)
134
+ transcript.
135
+ gsub(%r((Authorization: Basic )\w+), '\1[FILTERED]').
136
+ gsub(%r((<number>).+(</number>)), '\1[FILTERED]\2').
137
+ gsub(%r((<verification_value>).+(</verification_value>)), '\1[FILTERED]\2').
138
+ gsub(%r((<payment_method_token>).+(</payment_method_token>)), '\1[FILTERED]\2')
139
+ end
140
+
141
+ private
142
+
143
+ def save_card(retain, credit_card, options)
144
+ request = build_xml_request('payment_method') do |doc|
145
+ add_credit_card(doc, credit_card, options)
146
+ add_extra_options(:data, doc, options)
147
+ doc.retained(true) if retain
148
+ end
149
+
150
+ commit('payment_methods.xml', request, :post, :payment_method_token)
151
+ end
152
+
153
+ def purchase_with_token(money, payment_method_token, options)
154
+ request = build_transaction_request(money, payment_method_token, options)
155
+ commit("gateways/#{options[:gateway_token] || @options[:gateway_token]}/purchase.xml", request)
156
+ end
157
+
158
+ def authorize_with_token(money, payment_method_token, options)
159
+ request = build_transaction_request(money, payment_method_token, options)
160
+ commit("gateways/#{@options[:gateway_token]}/authorize.xml", request)
161
+ end
162
+
163
+ def verify_with_token(payment_method_token, options)
164
+ request = build_transaction_request(nil, payment_method_token, options)
165
+ commit("gateways/#{@options[:gateway_token]}/verify.xml", request)
166
+ end
167
+
168
+ def build_transaction_request(money, payment_method, options)
169
+ build_xml_request('transaction') do |doc|
170
+ add_invoice(doc, money, options)
171
+ add_payment_method(doc, payment_method, options)
172
+ add_extra_options(:gateway_specific_fields, doc, options)
173
+ end
174
+ end
175
+
176
+ def add_invoice(doc, money, options)
177
+ doc.amount amount(money) unless money.nil?
178
+ doc.currency_code(options[:currency] || currency(money) || default_currency)
179
+ doc.order_id(options[:order_id])
180
+ doc.ip(options[:ip]) if options[:ip]
181
+ doc.description(options[:description]) if options[:description]
182
+
183
+ doc.merchant_name_descriptor(options[:merchant_name_descriptor]) if options[:merchant_name_descriptor]
184
+ doc.merchant_location_descriptor(options[:merchant_location_descriptor]) if options[:merchant_location_descriptor]
185
+ end
186
+
187
+ def add_payment_method(doc, payment_method, options)
188
+ doc.retain_on_success(true) if options[:store]
189
+
190
+ if payment_method.is_a?(String)
191
+ doc.payment_method_token(payment_method)
192
+ elsif payment_method.is_a?(CreditCard)
193
+ add_credit_card(doc, payment_method, options)
194
+ elsif payment_method.is_a?(Check)
195
+ add_bank_account(doc, payment_method, options)
196
+ end
197
+ end
198
+
199
+ def add_credit_card(doc, credit_card, options)
200
+ doc.credit_card do
201
+ doc.number(credit_card.number)
202
+ doc.verification_value(credit_card.verification_value)
203
+ doc.first_name(credit_card.first_name)
204
+ doc.last_name(credit_card.last_name)
205
+ doc.month(credit_card.month)
206
+ doc.year(format(credit_card.year, :four_digits_year))
207
+ doc.email(options[:email])
208
+ doc.address1(options[:billing_address].try(:[], :address1))
209
+ doc.address2(options[:billing_address].try(:[], :address2))
210
+ doc.city(options[:billing_address].try(:[], :city))
211
+ doc.state(options[:billing_address].try(:[], :state))
212
+ doc.zip(options[:billing_address].try(:[], :zip))
213
+ doc.country(options[:billing_address].try(:[], :country))
214
+ doc.phone_number(options[:billing_address].try(:[], :phone))
215
+ doc.shipping_address1(options[:shiping_address].try(:[], :address1))
216
+ doc.shipping_address2(options[:shiping_address].try(:[], :address2))
217
+ doc.shipping_city(options[:shiping_address].try(:[], :city))
218
+ doc.shipping_state(options[:shiping_address].try(:[], :state))
219
+ doc.shipping_zip(options[:shiping_address].try(:[], :zip))
220
+ doc.shipping_country(options[:shiping_address].try(:[], :country))
221
+ doc.shipping_phone_number(options[:shiping_address].try(:[], :phone))
222
+ end
223
+ end
224
+
225
+ def add_bank_account(doc, bank_account, options)
226
+ doc.bank_account do
227
+ doc.first_name(bank_account.first_name)
228
+ doc.last_name(bank_account.last_name)
229
+ doc.bank_routing_number(bank_account.routing_number)
230
+ doc.bank_account_number(bank_account.account_number)
231
+ doc.bank_account_type(bank_account.account_type)
232
+ doc.bank_account_holder_type(bank_account.account_holder_type)
233
+ end
234
+ end
235
+
236
+ def add_extra_options(type, doc, options)
237
+ doc.send(type) do
238
+ extra_options_to_doc(doc, options[type])
239
+ end
240
+ end
241
+
242
+ def extra_options_to_doc(doc, value)
243
+ return doc.text value unless value.kind_of? Hash
244
+
245
+ value.each do |k, v|
246
+ doc.send(k) do
247
+ extra_options_to_doc(doc, v)
248
+ end
249
+ end
250
+ end
251
+
252
+ def parse(xml)
253
+ response = {}
254
+
255
+ doc = Nokogiri::XML(xml)
256
+ doc.root.xpath('*').each do |node|
257
+ if node.elements.empty?
258
+ response[node.name.downcase.to_sym] = node.text
259
+ else
260
+ node.elements.each do |childnode|
261
+ childnode_to_response(response, node, childnode)
262
+ end
263
+ end
264
+ end
265
+
266
+ response
267
+ end
268
+
269
+ def childnode_to_response(response, node, childnode)
270
+ node_name = node.name.downcase
271
+ childnode_name = childnode.name.downcase
272
+ composed_name = "#{node_name}_#{childnode_name}"
273
+
274
+ childnodes_present = !childnode.elements.empty?
275
+
276
+ if childnodes_present && composed_name == 'payment_method_data'
277
+ response[composed_name.to_sym] = Hash.from_xml(childnode.to_s).values.first
278
+ elsif childnodes_present && node_name == 'gateway_specific_response_fields'
279
+ response[node_name.to_sym] = {
280
+ childnode_name => Hash.from_xml(childnode.to_s).values.first
281
+ }
282
+ else
283
+ response[composed_name.to_sym] = childnode.text
284
+ end
285
+ end
286
+
287
+ def build_xml_request(root)
288
+ builder = Nokogiri::XML::Builder.new
289
+ builder.__send__(root) do |doc|
290
+ yield(doc)
291
+ end
292
+ builder.to_xml
293
+ end
294
+
295
+ def commit(relative_url, request, method = :post, authorization_field = :token)
296
+ begin
297
+ raw_response = ssl_request(method, request_url(relative_url), request, headers)
298
+ rescue ResponseError => e
299
+ raw_response = e.response.body
300
+ end
301
+
302
+ response_from(raw_response, authorization_field, request, relative_url)
303
+ end
304
+
305
+ def response_from(raw_response, authorization_field, request_body, relative_url)
306
+ parsed = parse(raw_response)
307
+ options = {
308
+ authorization: parsed[authorization_field],
309
+ test: (parsed[:on_test_gateway] == 'true'),
310
+ avs_result: { code: parsed[:response_avs_code] },
311
+ cvv_result: parsed[:response_cvv_code],
312
+ response_type: response_type(@response_http_code.to_i),
313
+ response_http_code: @response_http_code,
314
+ request_endpoint: request_url(relative_url),
315
+ request_method: :post,
316
+ request_body:
317
+ }
318
+
319
+ Response.new(parsed[:succeeded] == 'true', parsed[:message] || parsed[:error], parsed, options)
320
+ end
321
+
322
+ def headers
323
+ {
324
+ 'Authorization' => ('Basic ' + Base64.strict_encode64("#{@options[:login]}:#{@options[:password]}").chomp),
325
+ 'Content-Type' => 'text/xml'
326
+ }
327
+ end
328
+
329
+ def request_url(relative_url)
330
+ "#{live_url}/#{relative_url}"
331
+ end
332
+
333
+ def handle_response(response)
334
+ @response_http_code = response.code.to_i
335
+ case @response_http_code
336
+ when 200...300
337
+ response.body
338
+ else
339
+ raise ResponseError.new(response)
340
+ end
341
+ end
342
+
343
+ def response_type(code)
344
+ if code == SUCCESS_CODE
345
+ 0
346
+ elsif SOFT_DECLINE_CODES.include?(code)
347
+ 1
348
+ else
349
+ 2
350
+ end
351
+ end
352
+ end
353
+ end
354
+ end