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,272 @@
1
+ require 'active_merchant/billing/gateways/paypal/paypal_common_api'
2
+ require 'active_merchant/billing/gateways/paypal/paypal_express_response'
3
+ require 'active_merchant/billing/gateways/paypal/paypal_recurring_api'
4
+ require 'active_merchant/billing/gateways/paypal_express_common'
5
+
6
+ module ActiveMerchant #:nodoc:
7
+ module Billing #:nodoc:
8
+ class PaypalExpressGateway < Gateway
9
+ include PaypalCommonAPI
10
+ include PaypalExpressCommon
11
+ include PaypalRecurringApi
12
+
13
+ NON_STANDARD_LOCALE_CODES = {
14
+ 'DK' => 'da_DK',
15
+ 'IL' => 'he_IL',
16
+ 'ID' => 'id_ID',
17
+ 'JP' => 'jp_JP',
18
+ 'NO' => 'no_NO',
19
+ 'BR' => 'pt_BR',
20
+ 'RU' => 'ru_RU',
21
+ 'SE' => 'sv_SE',
22
+ 'TH' => 'th_TH',
23
+ 'TR' => 'tr_TR',
24
+ 'CN' => 'zh_CN',
25
+ 'HK' => 'zh_HK',
26
+ 'TW' => 'zh_TW'
27
+ }
28
+
29
+ self.test_redirect_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr'
30
+ self.supported_countries = ['US']
31
+ self.homepage_url = 'https://www.paypal.com/cgi-bin/webscr?cmd=xpt/merchant/ExpressCheckoutIntro-outside'
32
+ self.display_name = 'PayPal Express Checkout'
33
+ self.currencies_without_fractions = %w(HUF JPY TWD)
34
+
35
+ def setup_authorization(money, options = {})
36
+ requires!(options, :return_url, :cancel_return_url)
37
+
38
+ commit 'SetExpressCheckout', build_setup_request('Authorization', money, options)
39
+ end
40
+
41
+ def setup_purchase(money, options = {})
42
+ requires!(options, :return_url, :cancel_return_url)
43
+
44
+ commit 'SetExpressCheckout', build_setup_request('Sale', money, options)
45
+ end
46
+
47
+ def details_for(token)
48
+ commit 'GetExpressCheckoutDetails', build_get_details_request(token)
49
+ end
50
+
51
+ def authorize(money, options = {})
52
+ requires!(options, :token, :payer_id)
53
+
54
+ commit 'DoExpressCheckoutPayment', build_sale_or_authorization_request('Authorization', money, options)
55
+ end
56
+
57
+ def purchase(money, options = {})
58
+ requires!(options, :token, :payer_id)
59
+
60
+ commit 'DoExpressCheckoutPayment', build_sale_or_authorization_request('Sale', money, options)
61
+ end
62
+
63
+ def store(token, options = {})
64
+ commit 'CreateBillingAgreement', build_create_billing_agreement_request(token, options)
65
+ end
66
+
67
+ def unstore(token, options = {})
68
+ commit 'BAUpdate', build_cancel_billing_agreement_request(token)
69
+ end
70
+
71
+ def agreement_details(reference_id, options = {})
72
+ commit 'BAUpdate', build_details_billing_agreement_request(reference_id)
73
+ end
74
+
75
+ def authorize_reference_transaction(money, options = {})
76
+ requires!(options, :reference_id)
77
+
78
+ commit 'DoReferenceTransaction', build_reference_transaction_request('Authorization', money, options)
79
+ end
80
+
81
+ def reference_transaction(money, options = {})
82
+ requires!(options, :reference_id)
83
+
84
+ commit 'DoReferenceTransaction', build_reference_transaction_request('Sale', money, options)
85
+ end
86
+
87
+ private
88
+ def build_get_details_request(token)
89
+ xml = Builder::XmlMarkup.new :indent => 2
90
+ xml.tag! 'GetExpressCheckoutDetailsReq', 'xmlns' => PAYPAL_NAMESPACE do
91
+ xml.tag! 'GetExpressCheckoutDetailsRequest', 'xmlns:n2' => EBAY_NAMESPACE do
92
+ xml.tag! 'n2:Version', API_VERSION
93
+ xml.tag! 'Token', token
94
+ end
95
+ end
96
+
97
+ xml.target!
98
+ end
99
+
100
+ def build_sale_or_authorization_request(action, money, options)
101
+ currency_code = options[:currency] || currency(money)
102
+
103
+ xml = Builder::XmlMarkup.new :indent => 2
104
+ xml.tag! 'DoExpressCheckoutPaymentReq', 'xmlns' => PAYPAL_NAMESPACE do
105
+ xml.tag! 'DoExpressCheckoutPaymentRequest', 'xmlns:n2' => EBAY_NAMESPACE do
106
+ xml.tag! 'n2:Version', API_VERSION
107
+ xml.tag! 'n2:DoExpressCheckoutPaymentRequestDetails' do
108
+ xml.tag! 'n2:PaymentAction', action
109
+ xml.tag! 'n2:Token', options[:token]
110
+ xml.tag! 'n2:PayerID', options[:payer_id]
111
+ xml.tag! 'n2:MsgSubID', options[:idempotency_key] if options[:idempotency_key]
112
+ add_payment_details(xml, money, currency_code, options)
113
+ end
114
+ end
115
+ end
116
+
117
+ xml.target!
118
+ end
119
+
120
+ def build_setup_request(action, money, options)
121
+ currency_code = options[:currency] || currency(money)
122
+ options[:payment_action] = action
123
+ options[:express_request] = true
124
+ options[:shipping_address] ||= options[:address]
125
+
126
+ xml = Builder::XmlMarkup.new :indent => 2
127
+ xml.tag! 'SetExpressCheckoutReq', 'xmlns' => PAYPAL_NAMESPACE do
128
+ xml.tag! 'SetExpressCheckoutRequest', 'xmlns:n2' => EBAY_NAMESPACE do
129
+ xml.tag! 'n2:Version', API_VERSION
130
+ xml.tag! 'n2:SetExpressCheckoutRequestDetails' do
131
+ xml.tag! 'n2:ReturnURL', options[:return_url]
132
+ xml.tag! 'n2:CancelURL', options[:cancel_return_url]
133
+ if options[:max_amount]
134
+ xml.tag! 'n2:MaxAmount', localized_amount(options[:max_amount], currency_code), 'currencyID' => currency_code
135
+ end
136
+ xml.tag! 'n2:ReqBillingAddress', options[:req_billing_address] ? '1' : '0'
137
+ xml.tag! 'n2:NoShipping', options[:no_shipping] ? '1' : '0'
138
+ xml.tag! 'n2:AddressOverride', options[:address_override] ? '1' : '0'
139
+ xml.tag! 'n2:LocaleCode', locale_code(options[:locale]) unless options[:locale].blank?
140
+ xml.tag! 'n2:BrandName', options[:brand_name] unless options[:brand_name].blank?
141
+ # Customization of the payment page
142
+ xml.tag! 'n2:PageStyle', options[:page_style] unless options[:page_style].blank?
143
+ xml.tag! 'n2:cpp-logo-image', options[:logo_image] unless options[:logo_image].blank?
144
+ xml.tag! 'n2:cpp-header-image', options[:header_image] unless options[:header_image].blank?
145
+ xml.tag! 'n2:cpp-header-border-color', options[:header_border_color] unless options[:header_border_color].blank?
146
+ xml.tag! 'n2:cpp-header-back-color', options[:header_background_color] unless options[:header_background_color].blank?
147
+ xml.tag! 'n2:cpp-payflow-color', options[:background_color] unless options[:background_color].blank?
148
+ if options[:allow_guest_checkout]
149
+ xml.tag! 'n2:SolutionType', 'Sole'
150
+ unless options[:paypal_chooses_landing_page]
151
+ xml.tag! 'n2:LandingPage', options[:landing_page] || 'Billing'
152
+ end
153
+ end
154
+ xml.tag! 'n2:BuyerEmail', options[:email] unless options[:email].blank?
155
+
156
+ if options[:billing_agreement]
157
+ xml.tag! 'n2:BillingAgreementDetails' do
158
+ xml.tag! 'n2:BillingType', options[:billing_agreement][:type]
159
+ xml.tag! 'n2:BillingAgreementDescription', options[:billing_agreement][:description]
160
+ xml.tag! 'n2:PaymentType', options[:billing_agreement][:payment_type] || 'InstantOnly'
161
+ end
162
+ end
163
+
164
+ if !options[:allow_note].nil?
165
+ xml.tag! 'n2:AllowNote', options[:allow_note] ? '1' : '0'
166
+ end
167
+
168
+ if options[:funding_sources]
169
+ xml.tag! 'n2:FundingSourceDetails' do
170
+ xml.tag! 'n2:UserSelectedFundingSource', options[:funding_sources][:source]
171
+ end
172
+ end
173
+
174
+ xml.tag! 'n2:CallbackURL', options[:callback_url] unless options[:callback_url].blank?
175
+
176
+ add_payment_details(xml, money, currency_code, options)
177
+ if options[:shipping_options]
178
+ options[:shipping_options].each do |shipping_option|
179
+ xml.tag! 'n2:FlatRateShippingOptions' do
180
+ xml.tag! 'n2:ShippingOptionIsDefault', shipping_option[:default]
181
+ xml.tag! 'n2:ShippingOptionAmount', localized_amount(shipping_option[:amount], currency_code), 'currencyID' => currency_code
182
+ xml.tag! 'n2:ShippingOptionName', shipping_option[:name]
183
+ end
184
+ end
185
+ end
186
+
187
+ xml.tag! 'n2:CallbackTimeout', options[:callback_timeout] unless options[:callback_timeout].blank?
188
+ xml.tag! 'n2:CallbackVersion', options[:callback_version] unless options[:callback_version].blank?
189
+
190
+ if options.has_key?(:allow_buyer_optin)
191
+ xml.tag! 'n2:BuyerEmailOptInEnable', (options[:allow_buyer_optin] ? '1' : '0')
192
+ end
193
+
194
+ xml.tag! 'n2:TotalType', options[:total_type] unless options[:total_type].blank?
195
+ end
196
+ end
197
+ end
198
+
199
+ xml.target!
200
+ end
201
+
202
+ def build_create_billing_agreement_request(token, options = {})
203
+ xml = Builder::XmlMarkup.new :indent => 2
204
+ xml.tag! 'CreateBillingAgreementReq', 'xmlns' => PAYPAL_NAMESPACE do
205
+ xml.tag! 'CreateBillingAgreementRequest', 'xmlns:n2' => EBAY_NAMESPACE do
206
+ xml.tag! 'n2:Version', API_VERSION
207
+ xml.tag! 'Token', token
208
+ end
209
+ end
210
+
211
+ xml.target!
212
+ end
213
+
214
+ def build_cancel_billing_agreement_request(token)
215
+ xml = Builder::XmlMarkup.new :indent => 2
216
+ xml.tag! 'BillAgreementUpdateReq', 'xmlns' => PAYPAL_NAMESPACE do
217
+ xml.tag! 'BAUpdateRequest', 'xmlns:n2' => EBAY_NAMESPACE do
218
+ xml.tag! 'n2:Version', API_VERSION
219
+ xml.tag! 'ReferenceID', token
220
+ xml.tag! 'BillingAgreementStatus', "Canceled"
221
+ end
222
+ end
223
+
224
+ xml.target!
225
+ end
226
+
227
+ def build_details_billing_agreement_request(reference_id)
228
+ xml = Builder::XmlMarkup.new :indent => 2
229
+ xml.tag! 'BillAgreementUpdateReq', 'xmlns' => PAYPAL_NAMESPACE do
230
+ xml.tag! 'BAUpdateRequest', 'xmlns:n2' => EBAY_NAMESPACE do
231
+ xml.tag! 'n2:Version', API_VERSION
232
+ xml.tag! 'ReferenceID', reference_id
233
+ end
234
+ end
235
+
236
+ xml.target!
237
+ end
238
+
239
+ def build_reference_transaction_request(action, money, options)
240
+ currency_code = options[:currency] || currency(money)
241
+
242
+ # I am not sure why it's set like this for express gateway
243
+ # but I don't want to break the existing behavior
244
+ xml = Builder::XmlMarkup.new :indent => 2
245
+ xml.tag! 'DoReferenceTransactionReq', 'xmlns' => PAYPAL_NAMESPACE do
246
+ xml.tag! 'DoReferenceTransactionRequest', 'xmlns:n2' => EBAY_NAMESPACE do
247
+ xml.tag! 'n2:Version', API_VERSION
248
+ xml.tag! 'n2:DoReferenceTransactionRequestDetails' do
249
+ xml.tag! 'n2:ReferenceID', options[:reference_id]
250
+ xml.tag! 'n2:PaymentAction', action
251
+ xml.tag! 'n2:PaymentType', options[:payment_type] || 'Any'
252
+ add_payment_details(xml, money, currency_code, options)
253
+ xml.tag! 'n2:IPAddress', options[:ip]
254
+ xml.tag! 'n2:MerchantSessionId', options[:merchant_session_id] if options[:merchant_session_id].present?
255
+ xml.tag! 'n2:MsgSubID', options[:idempotency_key] if options[:idempotency_key]
256
+ end
257
+ end
258
+ end
259
+
260
+ xml.target!
261
+ end
262
+
263
+ def build_response(success, message, response, options = {})
264
+ PaypalExpressResponse.new(success, message, response, options)
265
+ end
266
+
267
+ def locale_code(country_code)
268
+ NON_STANDARD_LOCALE_CODES[country_code] || country_code
269
+ end
270
+ end
271
+ end
272
+ end
@@ -0,0 +1,30 @@
1
+ module ActiveMerchant
2
+ module Billing
3
+ module PaypalExpressCommon
4
+ def self.included(base)
5
+ if base.respond_to?(:class_attribute)
6
+ base.class_attribute :test_redirect_url
7
+ base.class_attribute :live_redirect_url
8
+ else
9
+ base.class_inheritable_accessor :test_redirect_url
10
+ base.class_inheritable_accessor :live_redirect_url
11
+ end
12
+ base.live_redirect_url = 'https://www.paypal.com/cgi-bin/webscr'
13
+ end
14
+
15
+ def redirect_url
16
+ test? ? test_redirect_url : live_redirect_url
17
+ end
18
+
19
+ def redirect_url_for(token, options = {})
20
+ options = { review: true, mobile: false }.update(options)
21
+
22
+ cmd = options[:mobile] ? '_express-checkout-mobile' : '_express-checkout'
23
+ url = "#{redirect_url}?cmd=#{cmd}&token=#{token}"
24
+ url += '&useraction=commit' unless options[:review]
25
+
26
+ url
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,281 @@
1
+ module ActiveMerchant
2
+ module Billing
3
+ class PaypalStandardGateway < Gateway
4
+ self.test_url = 'https://api-m.sandbox.paypal.com'
5
+ self.live_url = 'https://api-m.paypal.com'
6
+ self.supported_countries = %w[AL DZ AD AO AI AG AR AM AW AU AT AZ BS BH BB BY BE BZ BJ BM BT BO BA BW BR VG BN BG BF BI KH CM CA CV KY TD CL CO KM CG CD CK CR CI HR CY CZ DK DJ DM DO EC EG SV ER EE ET FK FO FJ FI FR GF PF GA GM GE DE GI GR GL GD GP GT GN GW GY HN HK HU IS IN ID IE IL IT JM JP JO KZ KE KI KW KG LA LV LS LI LT LU MK MG MW MY MV ML MT MH MQ MR MU YT MX FM MD MC MN ME MS MA MZ NA NR NP NL NC NZ NI NE NG NU NF NO OM PW PA PG PY PE PH PN PL PT QA RE RO RU RW WS SM ST SA SN RS SC SL SG SK SI SB SO ZA KR ES LK SH KN LC PM VC SR SJ SZ SE CH TW TJ TZ TH TG TO TT TN TM TC TV UG UA AE GB US UY VU VA VE VN WF YE ZM ZW].freeze
7
+ self.default_currency = 'USD'
8
+ self.money_format = :cents
9
+ self.supported_cardtypes = %i[visa master american_express diners_club maestro discover jcb mada bp_plus]
10
+ self.display_name = 'PayPal'
11
+
12
+ ENDPOINTS = {
13
+ generate_token: '/v1/oauth2/token',
14
+ create_order: '/v2/checkout/orders',
15
+ capture_order: '/v2/checkout/orders/%{id}/capture',
16
+ refund: '/v2/payments/captures/%{id}/refund'
17
+ }
18
+
19
+ SOFT_DECLINE_CODES = %w[INVALID_REQUEST AUTHENTICATION_FAILURE UNPROCESSABLE_ENTITY RATE_LIMIT_REACHED].freeze
20
+ SUCCESS_CODES = %w[COMPLETED].freeze
21
+
22
+ def initialize(options = {})
23
+ requires!(options, :client_id, :client_secret)
24
+ @client_id = options[:client_id]
25
+ @client_secret = options[:client_secret]
26
+ @response_http_code = nil
27
+
28
+ super
29
+ @access_token = setup_access_token
30
+ @request_id = SecureRandom.uuid
31
+ end
32
+
33
+ def purchase(amount, payment_method, options = {})
34
+ post ||= {}
35
+
36
+ amount = to_currency(amount)
37
+
38
+ add_payment_intent(post)
39
+ add_purchase_units(post, amount, options)
40
+ add_payment_source(post, payment_method, options)
41
+
42
+ commit(:create_order, post)
43
+ end
44
+
45
+ def capture(authorization, options = {})
46
+ post = {}
47
+
48
+ commit(:capture_order, post, authorization)
49
+ end
50
+
51
+ def refund(amount, authorization, options = {})
52
+ post = {}
53
+
54
+ amount = to_currency(amount)
55
+
56
+ add_refund_amount(post, amount, options)
57
+ add_refund_reason(post, options)
58
+
59
+ commit(:refund, post, authorization)
60
+ end
61
+
62
+ private
63
+
64
+ def commit(action, post, id = nil)
65
+ begin
66
+ url = build_request_url(action, id)
67
+ response = parse(ssl_post(url, post_data(post), headers))
68
+ succeeded = success_from(response)
69
+ rescue ResponseError => e
70
+ response = parse(e.response.body, error: e.response)
71
+ end
72
+
73
+ Response.new(
74
+ succeeded,
75
+ message_from(succeeded, response),
76
+ normalize_response(action, response),
77
+ test: test?,
78
+ authorization: authorization_from(action, response),
79
+ error_code: succeeded ? nil : error_code_from(response),
80
+ avs_result: { code: response['avs'] },
81
+ cvv_result: response['cvv2'],
82
+ response_type: response_type(action, response),
83
+ response_http_code: @response_http_code,
84
+ request_endpoint: url,
85
+ request_method: request_method(action),
86
+ request_body: post,
87
+ request_id: @request_id
88
+ )
89
+ end
90
+
91
+ def base_url
92
+ if test?
93
+ test_url
94
+ else
95
+ live_url
96
+ end
97
+ end
98
+
99
+ def normalize_response(action, response)
100
+ if action == :create_order && response.present?
101
+ redirect_link = response['links'].find { |link| link['rel'] == 'payer-action' }
102
+ response['_links'] = { 'redirect' => { 'href' => redirect_link['href'] } } if redirect_link
103
+ response['order_id'] = response['id']
104
+ end
105
+ response
106
+ end
107
+
108
+ def request_method(action)
109
+ case action
110
+ when :generate_token, :create_order, :capture_order, :refund
111
+ 'post'
112
+ end
113
+ end
114
+
115
+ def setup_access_token
116
+ headers = {
117
+ 'Content-Type' => 'application/json',
118
+ 'Authorization' => "Basic #{encoded_credentials}"
119
+ }
120
+
121
+ response = ssl_post(build_request_url(:generate_token), grant_type, headers)
122
+ JSON.parse(response)['access_token']
123
+ end
124
+
125
+ def build_request_url(action, id = nil)
126
+ base_url = (test? ? test_url : live_url)
127
+ base_url + ENDPOINTS[action].to_s % { id: id }
128
+ end
129
+
130
+ def encoded_credentials
131
+ Base64.strict_encode64("#{@client_id}:#{@client_secret}")
132
+ end
133
+
134
+ def headers
135
+ { 'Authorization' => "Bearer #{@access_token}", 'Content-Type' => 'application/json', 'PayPal-Request-Id' => @request_id }
136
+ end
137
+
138
+ def post_data(post)
139
+ post.to_json
140
+ end
141
+
142
+ def parse(body, error: nil)
143
+ JSON.parse(body)
144
+ rescue JSON::ParserError
145
+ response = {
146
+ 'error_type' => error&.code,
147
+ 'message' => 'Invalid JSON response received from Paypal.com Unified Payments Gateway. Please contact Paypal.com if you continue to receive this message.'
148
+ }
149
+
150
+ response['error_codes'] = [error&.message] if error&.message
151
+ response
152
+ end
153
+
154
+ def grant_type
155
+ 'grant_type=client_credentials'
156
+ end
157
+
158
+ def success_from(response)
159
+ SUCCESS_CODES.include?(response['status'])
160
+ end
161
+
162
+ def message_from(succeeded, response)
163
+ if succeeded
164
+ response['status']
165
+ elsif response['message']
166
+ response['name'] + ': ' + response['message']
167
+ else
168
+ response['error'] || response['error_description'] || response['status'] || response['message'] || 'Unable to read error message'
169
+ end
170
+ end
171
+
172
+ def authorization_from(action, response)
173
+ case action
174
+ when :create_order, :refund_order
175
+ response.dig('id')
176
+ when :capture_order
177
+ purchase_unit = response.dig('purchase_units', 0)
178
+ captures = purchase_unit&.dig('payments', 'captures', 0)
179
+ captures&.dig('id')
180
+ end
181
+ end
182
+
183
+ def error_code_from(response)
184
+ response['name'] unless success_from(response)
185
+ end
186
+
187
+ def add_purchase_units(post, amount, options)
188
+ purchase_unit = {}
189
+ purchase_unit[:reference_id] = options[:order_id]
190
+ purchase_unit[:amount] = {}
191
+ purchase_unit[:amount][:value] = amount
192
+ purchase_unit[:amount][:currency_code] = options[:currency]
193
+ add_shipping_address(purchase_unit, options)
194
+
195
+ post[:purchase_units] ||= []
196
+ post[:purchase_units] << purchase_unit
197
+ end
198
+
199
+ def add_payment_source(post, payment_method, options)
200
+ post[:payment_source] = {}
201
+ redirect_links = options[:redirect_links]
202
+
203
+ case payment_method.paypal_method_type
204
+ when 'paypal'
205
+ payment_source = post[:payment_source][:paypal] = {}
206
+ experience_context = payment_source[:experience_context] = {}
207
+
208
+ experience_context[:landing_page] = 'LOGIN'
209
+ experience_context[:user_action] = 'PAY_NOW'
210
+ experience_context[:return_url] = redirect_links[:success_url] if redirect_links
211
+ experience_context[:cancel_url] = redirect_links[:failure_url] if redirect_links
212
+ when 'giropay'
213
+ payment_source = post[:payment_source][:giropay] = {}
214
+
215
+ add_payment_source_details(payment_source, redirect_links, options)
216
+ when 'sofort'
217
+ payment_source = post[:payment_source][:sofort] = {}
218
+
219
+ add_payment_source_details(payment_source, redirect_links, options)
220
+ end
221
+ end
222
+
223
+ def add_shipping_address(purchase_unit, options)
224
+ purchase_unit[:shipping] = {}
225
+ purchase_unit[:shipping][:address] = {}
226
+ purchase_unit[:shipping][:address][:address_line_1] = options[:billing_address][:address1]
227
+ purchase_unit[:shipping][:address][:admin_area_2] = options[:billing_address][:city]
228
+ purchase_unit[:shipping][:address][:admin_area_1] = options[:billing_address][:state]
229
+ purchase_unit[:shipping][:address][:postal_code] = options[:billing_address][:zip]
230
+ purchase_unit[:shipping][:address][:country_code] = options[:billing_address][:country]
231
+ end
232
+
233
+ def add_payment_source_details(payment_source, redirect_links, options)
234
+ payment_source[:name] = options[:billing_address] ? options[:billing_address][:name] : ''
235
+ payment_source[:country_code] = options[:billing_address] ? options[:billing_address][:country] : ''
236
+
237
+ payment_source[:experience_context] = {}
238
+ payment_source[:experience_context][:brand_name] = options[:campaign_name]
239
+ payment_source[:experience_context][:return_url] = redirect_links[:success_url] if redirect_links
240
+ payment_source[:experience_context][:cancel_url] = redirect_links[:failure_url] if redirect_links
241
+ end
242
+
243
+ def add_payment_intent(post)
244
+ post[:intent] = 'CAPTURE'
245
+ end
246
+
247
+ def add_refund_amount(post, amount, options)
248
+ post[:amount] = {
249
+ "value": amount,
250
+ "currency_code": options[:currency]
251
+ }
252
+ end
253
+
254
+ def add_refund_reason(post, options)
255
+ post[:note_to_payer] = options[:refund_reason]
256
+ end
257
+
258
+ def handle_response(response)
259
+ @response_http_code = response.code.to_i
260
+ super
261
+ end
262
+
263
+ def response_type(action, response)
264
+ return unless action == :capture_order
265
+
266
+ if SUCCESS_CODES.include?(response['status'])
267
+ 0
268
+ elsif SOFT_DECLINE_CODES.include?(response['name'])
269
+ 1
270
+ else
271
+ 2
272
+ end
273
+ end
274
+
275
+ def to_currency(amount)
276
+ dollars = amount.to_f / 100.0
277
+ sprintf('%.2f', dollars)
278
+ end
279
+ end
280
+ end
281
+ end