swiss-activemerchant 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (287) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +4033 -0
  3. data/CONTRIBUTORS +568 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +249 -0
  6. data/lib/active_merchant/billing/apple_pay_payment_token.rb +22 -0
  7. data/lib/active_merchant/billing/avs_result.rb +95 -0
  8. data/lib/active_merchant/billing/base.rb +48 -0
  9. data/lib/active_merchant/billing/check.rb +112 -0
  10. data/lib/active_merchant/billing/compatibility.rb +118 -0
  11. data/lib/active_merchant/billing/credit_card.rb +451 -0
  12. data/lib/active_merchant/billing/credit_card_formatting.rb +24 -0
  13. data/lib/active_merchant/billing/credit_card_methods.rb +512 -0
  14. data/lib/active_merchant/billing/cvv_result.rb +37 -0
  15. data/lib/active_merchant/billing/gateway.rb +332 -0
  16. data/lib/active_merchant/billing/gateways/adyen.rb +774 -0
  17. data/lib/active_merchant/billing/gateways/airwallex.rb +370 -0
  18. data/lib/active_merchant/billing/gateways/alelo.rb +256 -0
  19. data/lib/active_merchant/billing/gateways/allied_wallet.rb +205 -0
  20. data/lib/active_merchant/billing/gateways/authorize_net.rb +1125 -0
  21. data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +424 -0
  22. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +977 -0
  23. data/lib/active_merchant/billing/gateways/axcessms.rb +243 -0
  24. data/lib/active_merchant/billing/gateways/balanced.rb +263 -0
  25. data/lib/active_merchant/billing/gateways/bambora_apac.rb +222 -0
  26. data/lib/active_merchant/billing/gateways/bank_frick.rb +225 -0
  27. data/lib/active_merchant/billing/gateways/banwire.rb +116 -0
  28. data/lib/active_merchant/billing/gateways/barclaycard_smartpay.rb +397 -0
  29. data/lib/active_merchant/billing/gateways/barclays_epdq_extra_plus.rb +15 -0
  30. data/lib/active_merchant/billing/gateways/be2bill.rb +131 -0
  31. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +474 -0
  32. data/lib/active_merchant/billing/gateways/beanstream.rb +238 -0
  33. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +57 -0
  34. data/lib/active_merchant/billing/gateways/blue_pay.rb +549 -0
  35. data/lib/active_merchant/billing/gateways/blue_snap.rb +644 -0
  36. data/lib/active_merchant/billing/gateways/bogus.rb +190 -0
  37. data/lib/active_merchant/billing/gateways/borgun.rb +272 -0
  38. data/lib/active_merchant/billing/gateways/bpoint.rb +277 -0
  39. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +28 -0
  40. data/lib/active_merchant/billing/gateways/braintree/token_nonce.rb +113 -0
  41. data/lib/active_merchant/billing/gateways/braintree.rb +19 -0
  42. data/lib/active_merchant/billing/gateways/braintree_blue.rb +952 -0
  43. data/lib/active_merchant/billing/gateways/braintree_orange.rb +19 -0
  44. data/lib/active_merchant/billing/gateways/bridge_pay.rb +244 -0
  45. data/lib/active_merchant/billing/gateways/cams.rb +230 -0
  46. data/lib/active_merchant/billing/gateways/card_connect.rb +338 -0
  47. data/lib/active_merchant/billing/gateways/card_save.rb +21 -0
  48. data/lib/active_merchant/billing/gateways/card_stream.rb +394 -0
  49. data/lib/active_merchant/billing/gateways/cardknox.rb +327 -0
  50. data/lib/active_merchant/billing/gateways/cardprocess.rb +256 -0
  51. data/lib/active_merchant/billing/gateways/cashnet.rb +235 -0
  52. data/lib/active_merchant/billing/gateways/cc5.rb +198 -0
  53. data/lib/active_merchant/billing/gateways/cecabank.rb +249 -0
  54. data/lib/active_merchant/billing/gateways/cenpos.rb +328 -0
  55. data/lib/active_merchant/billing/gateways/checkout.rb +212 -0
  56. data/lib/active_merchant/billing/gateways/checkout_v2.rb +587 -0
  57. data/lib/active_merchant/billing/gateways/citrus_pay.rb +21 -0
  58. data/lib/active_merchant/billing/gateways/clearhaus.rb +219 -0
  59. data/lib/active_merchant/billing/gateways/commerce_hub.rb +366 -0
  60. data/lib/active_merchant/billing/gateways/commercegate.rb +142 -0
  61. data/lib/active_merchant/billing/gateways/conekta.rb +230 -0
  62. data/lib/active_merchant/billing/gateways/creditcall.rb +272 -0
  63. data/lib/active_merchant/billing/gateways/credorax.rb +526 -0
  64. data/lib/active_merchant/billing/gateways/ct_payment.rb +269 -0
  65. data/lib/active_merchant/billing/gateways/culqi.rb +279 -0
  66. data/lib/active_merchant/billing/gateways/cyber_source/cyber_source_common.rb +36 -0
  67. data/lib/active_merchant/billing/gateways/cyber_source.rb +1148 -0
  68. data/lib/active_merchant/billing/gateways/cyber_source_rest.rb +454 -0
  69. data/lib/active_merchant/billing/gateways/d_local.rb +343 -0
  70. data/lib/active_merchant/billing/gateways/data_cash.rb +302 -0
  71. data/lib/active_merchant/billing/gateways/decidir.rb +358 -0
  72. data/lib/active_merchant/billing/gateways/decidir_plus.rb +344 -0
  73. data/lib/active_merchant/billing/gateways/dibs.rb +199 -0
  74. data/lib/active_merchant/billing/gateways/digitzs.rb +295 -0
  75. data/lib/active_merchant/billing/gateways/ebanx.rb +346 -0
  76. data/lib/active_merchant/billing/gateways/efsnet.rb +215 -0
  77. data/lib/active_merchant/billing/gateways/elavon.rb +475 -0
  78. data/lib/active_merchant/billing/gateways/element.rb +406 -0
  79. data/lib/active_merchant/billing/gateways/epay.rb +296 -0
  80. data/lib/active_merchant/billing/gateways/evo_ca.rb +307 -0
  81. data/lib/active_merchant/billing/gateways/eway.rb +226 -0
  82. data/lib/active_merchant/billing/gateways/eway_managed.rb +289 -0
  83. data/lib/active_merchant/billing/gateways/eway_rapid.rb +578 -0
  84. data/lib/active_merchant/billing/gateways/exact.rb +219 -0
  85. data/lib/active_merchant/billing/gateways/ezic.rb +195 -0
  86. data/lib/active_merchant/billing/gateways/fat_zebra.rb +223 -0
  87. data/lib/active_merchant/billing/gateways/federated_canada.rb +158 -0
  88. data/lib/active_merchant/billing/gateways/finansbank.rb +22 -0
  89. data/lib/active_merchant/billing/gateways/first_giving.rb +143 -0
  90. data/lib/active_merchant/billing/gateways/first_pay.rb +182 -0
  91. data/lib/active_merchant/billing/gateways/firstdata_e4.rb +452 -0
  92. data/lib/active_merchant/billing/gateways/firstdata_e4_v27.rb +505 -0
  93. data/lib/active_merchant/billing/gateways/flo2cash.rb +215 -0
  94. data/lib/active_merchant/billing/gateways/flo2cash_simple.rb +20 -0
  95. data/lib/active_merchant/billing/gateways/fluidpay.rb +275 -0
  96. data/lib/active_merchant/billing/gateways/forte.rb +286 -0
  97. data/lib/active_merchant/billing/gateways/garanti.rb +256 -0
  98. data/lib/active_merchant/billing/gateways/global_collect.rb +580 -0
  99. data/lib/active_merchant/billing/gateways/global_transport.rb +193 -0
  100. data/lib/active_merchant/billing/gateways/hdfc.rb +205 -0
  101. data/lib/active_merchant/billing/gateways/hps.rb +472 -0
  102. data/lib/active_merchant/billing/gateways/iats_payments.rb +312 -0
  103. data/lib/active_merchant/billing/gateways/in_context_paypal_express.rb +15 -0
  104. data/lib/active_merchant/billing/gateways/inspire.rb +213 -0
  105. data/lib/active_merchant/billing/gateways/instapay.rb +159 -0
  106. data/lib/active_merchant/billing/gateways/ipg.rb +420 -0
  107. data/lib/active_merchant/billing/gateways/ipp.rb +176 -0
  108. data/lib/active_merchant/billing/gateways/iridium.rb +467 -0
  109. data/lib/active_merchant/billing/gateways/itransact.rb +448 -0
  110. data/lib/active_merchant/billing/gateways/iveri.rb +290 -0
  111. data/lib/active_merchant/billing/gateways/ixopay.rb +320 -0
  112. data/lib/active_merchant/billing/gateways/jetpay.rb +395 -0
  113. data/lib/active_merchant/billing/gateways/jetpay_v2.rb +432 -0
  114. data/lib/active_merchant/billing/gateways/klarna.rb +317 -0
  115. data/lib/active_merchant/billing/gateways/komoju.rb +115 -0
  116. data/lib/active_merchant/billing/gateways/kushki.rb +297 -0
  117. data/lib/active_merchant/billing/gateways/latitude19.rb +412 -0
  118. data/lib/active_merchant/billing/gateways/linkpoint.rb +448 -0
  119. data/lib/active_merchant/billing/gateways/litle.rb +643 -0
  120. data/lib/active_merchant/billing/gateways/mastercard.rb +286 -0
  121. data/lib/active_merchant/billing/gateways/maxipago.rb +220 -0
  122. data/lib/active_merchant/billing/gateways/mercado_pago.rb +348 -0
  123. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +228 -0
  124. data/lib/active_merchant/billing/gateways/merchant_one.rb +110 -0
  125. data/lib/active_merchant/billing/gateways/merchant_partners.rb +245 -0
  126. data/lib/active_merchant/billing/gateways/merchant_ware.rb +313 -0
  127. data/lib/active_merchant/billing/gateways/merchant_ware_version_four.rb +284 -0
  128. data/lib/active_merchant/billing/gateways/merchant_warrior.rb +248 -0
  129. data/lib/active_merchant/billing/gateways/mercury.rb +352 -0
  130. data/lib/active_merchant/billing/gateways/metrics_global.rb +293 -0
  131. data/lib/active_merchant/billing/gateways/micropayment.rb +182 -0
  132. data/lib/active_merchant/billing/gateways/migs/migs_codes.rb +100 -0
  133. data/lib/active_merchant/billing/gateways/migs.rb +329 -0
  134. data/lib/active_merchant/billing/gateways/mit.rb +260 -0
  135. data/lib/active_merchant/billing/gateways/modern_payments.rb +37 -0
  136. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +215 -0
  137. data/lib/active_merchant/billing/gateways/moka.rb +290 -0
  138. data/lib/active_merchant/billing/gateways/monei.rb +424 -0
  139. data/lib/active_merchant/billing/gateways/moneris.rb +488 -0
  140. data/lib/active_merchant/billing/gateways/money_movers.rb +150 -0
  141. data/lib/active_merchant/billing/gateways/mundipagg.rb +366 -0
  142. data/lib/active_merchant/billing/gateways/nab_transact.rb +299 -0
  143. data/lib/active_merchant/billing/gateways/ncr_secure_pay.rb +163 -0
  144. data/lib/active_merchant/billing/gateways/net_registry.rb +198 -0
  145. data/lib/active_merchant/billing/gateways/netaxept.rb +180 -0
  146. data/lib/active_merchant/billing/gateways/netbanx.rb +376 -0
  147. data/lib/active_merchant/billing/gateways/netbilling.rb +229 -0
  148. data/lib/active_merchant/billing/gateways/netpay.rb +223 -0
  149. data/lib/active_merchant/billing/gateways/network_merchants.rb +238 -0
  150. data/lib/active_merchant/billing/gateways/nmi.rb +396 -0
  151. data/lib/active_merchant/billing/gateways/ogone.rb +509 -0
  152. data/lib/active_merchant/billing/gateways/omise.rb +323 -0
  153. data/lib/active_merchant/billing/gateways/openpay.rb +246 -0
  154. data/lib/active_merchant/billing/gateways/opp.rb +394 -0
  155. data/lib/active_merchant/billing/gateways/optimal_payment.rb +331 -0
  156. data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +45 -0
  157. data/lib/active_merchant/billing/gateways/orbital.rb +1267 -0
  158. data/lib/active_merchant/billing/gateways/pac_net_raven.rb +206 -0
  159. data/lib/active_merchant/billing/gateways/pagarme.rb +239 -0
  160. data/lib/active_merchant/billing/gateways/pago_facil.rb +120 -0
  161. data/lib/active_merchant/billing/gateways/pay_arc.rb +392 -0
  162. data/lib/active_merchant/billing/gateways/pay_conex.rb +245 -0
  163. data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +277 -0
  164. data/lib/active_merchant/billing/gateways/pay_hub.rb +213 -0
  165. data/lib/active_merchant/billing/gateways/pay_junction.rb +390 -0
  166. data/lib/active_merchant/billing/gateways/pay_junction_v2.rb +206 -0
  167. data/lib/active_merchant/billing/gateways/pay_secure.rb +110 -0
  168. data/lib/active_merchant/billing/gateways/pay_trace.rb +450 -0
  169. data/lib/active_merchant/billing/gateways/paybox_direct.rb +224 -0
  170. data/lib/active_merchant/billing/gateways/payeezy.rb +513 -0
  171. data/lib/active_merchant/billing/gateways/payex.rb +409 -0
  172. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +235 -0
  173. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +42 -0
  174. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
  175. data/lib/active_merchant/billing/gateways/payflow.rb +473 -0
  176. data/lib/active_merchant/billing/gateways/payflow_express.rb +220 -0
  177. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +14 -0
  178. data/lib/active_merchant/billing/gateways/payflow_uk.rb +20 -0
  179. data/lib/active_merchant/billing/gateways/payment_express.rb +373 -0
  180. data/lib/active_merchant/billing/gateways/paymentez.rb +365 -0
  181. data/lib/active_merchant/billing/gateways/paymill.rb +369 -0
  182. data/lib/active_merchant/billing/gateways/paynetworx.rb +227 -0
  183. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +718 -0
  184. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +69 -0
  185. data/lib/active_merchant/billing/gateways/paypal/paypal_recurring_api.rb +262 -0
  186. data/lib/active_merchant/billing/gateways/paypal.rb +136 -0
  187. data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
  188. data/lib/active_merchant/billing/gateways/paypal_digital_goods.rb +44 -0
  189. data/lib/active_merchant/billing/gateways/paypal_express.rb +272 -0
  190. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +30 -0
  191. data/lib/active_merchant/billing/gateways/paypal_standard.rb +281 -0
  192. data/lib/active_merchant/billing/gateways/paysafe.rb +420 -0
  193. data/lib/active_merchant/billing/gateways/payscout.rb +159 -0
  194. data/lib/active_merchant/billing/gateways/paystation.rb +204 -0
  195. data/lib/active_merchant/billing/gateways/payu_in.rb +249 -0
  196. data/lib/active_merchant/billing/gateways/payu_latam.rb +482 -0
  197. data/lib/active_merchant/billing/gateways/payway.rb +207 -0
  198. data/lib/active_merchant/billing/gateways/payway_dot_com.rb +253 -0
  199. data/lib/active_merchant/billing/gateways/pin.rb +273 -0
  200. data/lib/active_merchant/billing/gateways/pixxels.rb +263 -0
  201. data/lib/active_merchant/billing/gateways/plexo.rb +308 -0
  202. data/lib/active_merchant/billing/gateways/plugnpay.rb +283 -0
  203. data/lib/active_merchant/billing/gateways/priority.rb +392 -0
  204. data/lib/active_merchant/billing/gateways/pro_pay.rb +325 -0
  205. data/lib/active_merchant/billing/gateways/psigate.rb +227 -0
  206. data/lib/active_merchant/billing/gateways/psl_card.rb +295 -0
  207. data/lib/active_merchant/billing/gateways/qbms.rb +302 -0
  208. data/lib/active_merchant/billing/gateways/quantum.rb +274 -0
  209. data/lib/active_merchant/billing/gateways/quickbooks.rb +377 -0
  210. data/lib/active_merchant/billing/gateways/quickpay/quickpay_common.rb +184 -0
  211. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb +297 -0
  212. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v4to7.rb +226 -0
  213. data/lib/active_merchant/billing/gateways/quickpay.rb +24 -0
  214. data/lib/active_merchant/billing/gateways/qvalent.rb +305 -0
  215. data/lib/active_merchant/billing/gateways/rapyd.rb +319 -0
  216. data/lib/active_merchant/billing/gateways/reach.rb +277 -0
  217. data/lib/active_merchant/billing/gateways/realex.rb +400 -0
  218. data/lib/active_merchant/billing/gateways/redsys.rb +723 -0
  219. data/lib/active_merchant/billing/gateways/s5.rb +247 -0
  220. data/lib/active_merchant/billing/gateways/safe_charge.rb +298 -0
  221. data/lib/active_merchant/billing/gateways/sage.rb +446 -0
  222. data/lib/active_merchant/billing/gateways/sage_pay.rb +434 -0
  223. data/lib/active_merchant/billing/gateways/sallie_mae.rb +141 -0
  224. data/lib/active_merchant/billing/gateways/secure_net.rb +260 -0
  225. data/lib/active_merchant/billing/gateways/secure_pay.rb +191 -0
  226. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +290 -0
  227. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +103 -0
  228. data/lib/active_merchant/billing/gateways/securion_pay.rb +305 -0
  229. data/lib/active_merchant/billing/gateways/shift4.rb +345 -0
  230. data/lib/active_merchant/billing/gateways/simetrik.rb +368 -0
  231. data/lib/active_merchant/billing/gateways/skip_jack.rb +450 -0
  232. data/lib/active_merchant/billing/gateways/smart_ps.rb +274 -0
  233. data/lib/active_merchant/billing/gateways/so_easy_pay.rb +194 -0
  234. data/lib/active_merchant/billing/gateways/spreedly_core.rb +312 -0
  235. data/lib/active_merchant/billing/gateways/stripe.rb +866 -0
  236. data/lib/active_merchant/billing/gateways/stripe_payment_intents.rb +602 -0
  237. data/lib/active_merchant/billing/gateways/swipe_checkout.rb +151 -0
  238. data/lib/active_merchant/billing/gateways/telr.rb +273 -0
  239. data/lib/active_merchant/billing/gateways/tns.rb +23 -0
  240. data/lib/active_merchant/billing/gateways/trans_first.rb +240 -0
  241. data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +612 -0
  242. data/lib/active_merchant/billing/gateways/transact_pro.rb +222 -0
  243. data/lib/active_merchant/billing/gateways/transax.rb +21 -0
  244. data/lib/active_merchant/billing/gateways/transnational.rb +9 -0
  245. data/lib/active_merchant/billing/gateways/trexle.rb +221 -0
  246. data/lib/active_merchant/billing/gateways/trust_commerce.rb +500 -0
  247. data/lib/active_merchant/billing/gateways/usa_epay.rb +24 -0
  248. data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +1612 -0
  249. data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +367 -0
  250. data/lib/active_merchant/billing/gateways/vanco.rb +303 -0
  251. data/lib/active_merchant/billing/gateways/verifi.rb +224 -0
  252. data/lib/active_merchant/billing/gateways/viaklix.rb +171 -0
  253. data/lib/active_merchant/billing/gateways/visanet_peru.rb +250 -0
  254. data/lib/active_merchant/billing/gateways/vpos.rb +223 -0
  255. data/lib/active_merchant/billing/gateways/webpay.rb +97 -0
  256. data/lib/active_merchant/billing/gateways/wepay.rb +235 -0
  257. data/lib/active_merchant/billing/gateways/wirecard.rb +430 -0
  258. data/lib/active_merchant/billing/gateways/wompi.rb +197 -0
  259. data/lib/active_merchant/billing/gateways/world_net.rb +345 -0
  260. data/lib/active_merchant/billing/gateways/worldpay.rb +1050 -0
  261. data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +208 -0
  262. data/lib/active_merchant/billing/gateways/worldpay_us.rb +221 -0
  263. data/lib/active_merchant/billing/gateways.rb +14 -0
  264. data/lib/active_merchant/billing/model.rb +30 -0
  265. data/lib/active_merchant/billing/network_tokenization_credit_card.rb +39 -0
  266. data/lib/active_merchant/billing/payment_token.rb +21 -0
  267. data/lib/active_merchant/billing/rails.rb +3 -0
  268. data/lib/active_merchant/billing/response.rb +120 -0
  269. data/lib/active_merchant/billing/three_d_secure_eci_mapper.rb +27 -0
  270. data/lib/active_merchant/billing.rb +16 -0
  271. data/lib/active_merchant/connection.rb +194 -0
  272. data/lib/active_merchant/country.rb +338 -0
  273. data/lib/active_merchant/empty.rb +20 -0
  274. data/lib/active_merchant/errors.rb +38 -0
  275. data/lib/active_merchant/net_http_ssl_connection.rb +11 -0
  276. data/lib/active_merchant/network_connection_retries.rb +78 -0
  277. data/lib/active_merchant/post_data.rb +26 -0
  278. data/lib/active_merchant/posts_data.rb +92 -0
  279. data/lib/active_merchant/version.rb +3 -0
  280. data/lib/active_merchant.rb +63 -0
  281. data/lib/activemerchant.rb +1 -0
  282. data/lib/certs/cacert.pem +3214 -0
  283. data/lib/support/gateway_support.rb +69 -0
  284. data/lib/support/outbound_hosts.rb +28 -0
  285. data/lib/support/ssl_verify.rb +88 -0
  286. data/lib/support/ssl_version.rb +86 -0
  287. metadata +506 -0
@@ -0,0 +1,220 @@
1
+ require 'active_merchant/billing/gateways/payflow/payflow_common_api'
2
+ require 'active_merchant/billing/gateways/payflow/payflow_express_response'
3
+ require 'active_merchant/billing/gateways/paypal_express_common'
4
+
5
+ module ActiveMerchant #:nodoc:
6
+ module Billing #:nodoc:
7
+ # ==General Parameters
8
+ # The following parameters are supported for #setup_authorization, #setup_purchase, #authorize and #purchase transactions. I've read
9
+ # in the docs that they recommend you pass the exact same parameters to both setup and authorize/purchase.
10
+ #
11
+ # This information was gleaned from a mix of:
12
+ # * {PayFlow documentation}[https://developer.paypal.com/docs/classic/payflow/integration-guide/]
13
+ # * previous ActiveMerchant code
14
+ # * trial & error
15
+ #
16
+ # The following parameters are currently supported.
17
+ # [<tt>:ip</tt>] (opt) Customer IP Address
18
+ # [<tt>:order_id</tt>] (opt) An order or invoice number. This will be passed through to the Payflow backend at manager.paypal.com, and show up as "Supplier Reference #"
19
+ # [<tt>:description</tt>] (opt) Order description, shown to buyer (after redirected to PayPal). If Order Line Items are used (see below), then the description is suppressed. This will not be passed through to the Payflow backend.
20
+ # [<tt>:billing_address</tt>] (opt) See ActiveMerchant::Billing::Gateway for details
21
+ # [<tt>:shipping_address</tt>] (opt) See ActiveMerchant::Billing::Gateway for details
22
+ # [<tt>:currency</tt>] (req) Currency of transaction, will be set to USD by default for PayFlow Express if not specified
23
+ # [<tt>:email</tt>] (opt) Email of buyer; used to pre-fill PayPal login screen
24
+ # [<tt>:payer_id</tt>] (opt) Unique PayPal buyer account identification number, as returned by details_for request
25
+ # [<tt>:token</tt>] (req for #authorize & #purchase) Token returned by setup transaction
26
+ # [<tt>:no_shipping</tt>] (opt) Boolean for whether or not to display shipping address to buyer
27
+ # [<tt>:address_override</tt>] (opt) Boolean. If true, display shipping address passed by parameters, rather than shipping address on file with PayPal
28
+ # [<tt>:allow_note</tt>] (opt) Boolean for permitting buyer to add note during checkout. Note contents can be retrieved with details_for transaction
29
+ # [<tt>:return_url</tt>] (req) URL to which the buyer’s browser is returned after choosing to pay.
30
+ # [<tt>:cancel_return_url</tt>] (req) URL to which the buyer is returned if the buyer cancels the order.
31
+ # [<tt>:notify_url</tt>] (opt) Your URL for receiving Instant Payment Notification (IPN) about this transaction.
32
+ # [<tt>:comment</tt>] (opt) Comment field which will be reported to Payflow backend (at manager.paypal.com) as Comment1
33
+ # [<tt>:comment2</tt>] (opt) Comment field which will be reported to Payflow backend (at manager.paypal.com) as Comment2
34
+ # [<tt>:discount</tt>] (opt) Total discounts in cents
35
+ #
36
+ # ==Line Items
37
+ # Support for order line items is available, but has to be enabled on the PayFlow backend. This is what I was told by Todd Sieber at Technical Support:
38
+ #
39
+ # <em>You will need to call Payflow Support at 1-888-883-9770, choose option #2. Request that they update your account in "Pandora" under Product Settings >> PayPal Mark and update the Features Bitmap to 1111111111111112. This is 15 ones and a two.</em>
40
+ #
41
+ # See here[https://www.x.com/message/206214#206214] for the forum discussion (requires login to {x.com}[https://x.com]
42
+ #
43
+ # [<tt>:items</tt>] (opt) Array of Order Line Items hashes. These are shown to the buyer after redirect to PayPal.
44
+ #
45
+ #
46
+ #
47
+ # The following keys are supported for line items:
48
+ # [<tt>:name</tt>] Name of line item
49
+ # [<tt>:description</tt>] Description of line item
50
+ # [<tt>:amount</tt>] Line Item Amount in Cents (as Integer)
51
+ # [<tt>:quantity</tt>] Line Item Quantity (default to 1 if left blank)
52
+ #
53
+ # ====Customization of Payment Page
54
+ # [<tt>:page_style</tt>] (opt) Your URL for receiving Instant Payment Notification (IPN) about this transaction.
55
+ # [<tt>:header_image</tt>] (opt) Your URL for receiving Instant Payment Notification (IPN) about this transaction.
56
+ # [<tt>:background_color</tt>] (opt) Your URL for receiving Instant Payment Notification (IPN) about this transaction.
57
+ # ====Additional options for old Checkout Experience, being phased out in 2010 and 2011
58
+ # [<tt>:header_background_color</tt>] (opt) Your URL for receiving Instant Payment Notification (IPN) about this transaction.
59
+ # [<tt>:header_border_color</tt>] (opt) Your URL for receiving Instant Payment Notification (IPN) about this transaction.
60
+
61
+ class PayflowExpressGateway < Gateway
62
+ include PayflowCommonAPI
63
+ include PaypalExpressCommon
64
+
65
+ self.test_redirect_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr'
66
+ self.homepage_url = 'https://www.paypal.com/cgi-bin/webscr?cmd=xpt/merchant/ExpressCheckoutIntro-outside'
67
+ self.display_name = 'PayPal Express Checkout'
68
+
69
+ def authorize(money, options = {})
70
+ requires!(options, :token, :payer_id)
71
+ request = build_sale_or_authorization_request('Authorization', money, options)
72
+ commit(request, options)
73
+ end
74
+
75
+ def purchase(money, options = {})
76
+ requires!(options, :token, :payer_id)
77
+ request = build_sale_or_authorization_request('Sale', money, options)
78
+ commit(request, options)
79
+ end
80
+
81
+ def refund(money, identification, options = {})
82
+ request = build_reference_request(:credit, money, identification, options)
83
+ commit(request, options)
84
+ end
85
+
86
+ def credit(money, identification, options = {})
87
+ ActiveMerchant.deprecated CREDIT_DEPRECATION_MESSAGE
88
+ refund(money, identification, options)
89
+ end
90
+
91
+ def setup_authorization(money, options = {})
92
+ requires!(options, :return_url, :cancel_return_url)
93
+
94
+ request = build_setup_express_sale_or_authorization_request('Authorization', money, options)
95
+ commit(request, options)
96
+ end
97
+
98
+ def setup_purchase(money, options = {})
99
+ requires!(options, :return_url, :cancel_return_url)
100
+
101
+ request = build_setup_express_sale_or_authorization_request('Sale', money, options)
102
+ commit(request, options)
103
+ end
104
+
105
+ def details_for(token)
106
+ request = build_get_express_details_request(token)
107
+ commit(request, options)
108
+ end
109
+
110
+ private
111
+
112
+ def build_get_express_details_request(token)
113
+ xml = Builder::XmlMarkup.new indent: 2
114
+ xml.tag! 'GetExpressCheckout' do
115
+ xml.tag! 'Authorization' do
116
+ xml.tag! 'PayData' do
117
+ xml.tag! 'Tender' do
118
+ xml.tag! 'PayPal' do
119
+ xml.tag! 'Token', token
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
125
+ xml.target!
126
+ end
127
+
128
+ def build_setup_express_sale_or_authorization_request(action, money, options = {})
129
+ xml = Builder::XmlMarkup.new indent: 2
130
+ xml.tag! 'SetExpressCheckout' do
131
+ xml.tag! action do
132
+ add_pay_data xml, money, options
133
+ end
134
+ end
135
+ xml.target!
136
+ end
137
+
138
+ def build_sale_or_authorization_request(action, money, options)
139
+ xml = Builder::XmlMarkup.new indent: 2
140
+ xml.tag! 'DoExpressCheckout' do
141
+ xml.tag! action do
142
+ add_pay_data xml, money, options
143
+ end
144
+ end
145
+ xml.target!
146
+ end
147
+
148
+ def add_pay_data(xml, money, options)
149
+ xml.tag! 'PayData' do
150
+ xml.tag! 'Invoice' do
151
+ xml.tag! 'CustIP', options[:ip] unless options[:ip].blank?
152
+ xml.tag! 'InvNum', options[:order_id] unless options[:order_id].blank?
153
+ # Description field will be shown to buyer, unless line items are also being supplied (then only line items are shown).
154
+ xml.tag! 'Description', options[:description] unless options[:description].blank?
155
+ # Comment, Comment2 should make it to the backend at manager.paypal.com, as with Payflow credit card transactions
156
+ # but that doesn't seem to work (yet?). See: https://www.x.com/thread/51908?tstart=0
157
+ xml.tag! 'Comment', options[:comment] unless options[:comment].nil?
158
+ xml.tag!('ExtData', 'Name' => 'COMMENT2', 'Value' => options[:comment2]) unless options[:comment2].nil?
159
+
160
+ billing_address = options[:billing_address] || options[:address]
161
+ add_address(xml, 'BillTo', billing_address, options) if billing_address
162
+ add_address(xml, 'ShipTo', options[:shipping_address], options) if options[:shipping_address]
163
+
164
+ # Note: To get order line-items to show up with Payflow Express, this feature has to be enabled on the backend.
165
+ # Call Support at 888 883 9770, press 2. Then request that they update your account in "Pandora" under Product Settings >> PayPal
166
+ # Mark and update the Features Bitmap to 1111111111111112. This is 15 ones and a two.
167
+ # See here for the forum discussion: https://www.x.com/message/206214#206214
168
+ items = options[:items] || []
169
+ items.each_with_index do |item, index|
170
+ xml.tag! 'ExtData', 'Name' => "L_DESC#{index}", 'Value' => item[:description]
171
+ xml.tag! 'ExtData', 'Name' => "L_COST#{index}", 'Value' => amount(item[:amount])
172
+ xml.tag! 'ExtData', 'Name' => "L_QTY#{index}", 'Value' => item[:quantity] || '1'
173
+ xml.tag! 'ExtData', 'Name' => "L_NAME#{index}", 'Value' => item[:name]
174
+ # Note: An ItemURL is supported in Paypal Express (different API), but not PayFlow Express, as far as I can tell.
175
+ # L_URLn nor L_ITEMURLn seem to work
176
+ end
177
+ if items.any?
178
+ xml.tag! 'ExtData', 'Name' => 'CURRENCY', 'Value' => options[:currency] || currency(money)
179
+ xml.tag! 'ExtData', 'Name' => 'ITEMAMT', 'Value' => amount(options[:subtotal] || money)
180
+ end
181
+ xml.tag! 'DiscountAmt', amount(options[:discount]) if options[:discount]
182
+ xml.tag! 'TotalAmt', amount(money), 'Currency' => options[:currency] || currency(money)
183
+ end
184
+
185
+ xml.tag! 'Tender' do
186
+ add_paypal_details(xml, options)
187
+ end
188
+ end
189
+ end
190
+
191
+ def add_paypal_details(xml, options)
192
+ xml.tag! 'PayPal' do
193
+ xml.tag! 'EMail', options[:email] unless options[:email].blank?
194
+ xml.tag! 'ReturnURL', options[:return_url] unless options[:return_url].blank?
195
+ xml.tag! 'CancelURL', options[:cancel_return_url] unless options[:cancel_return_url].blank?
196
+ xml.tag! 'NotifyURL', options[:notify_url] unless options[:notify_url].blank?
197
+ xml.tag! 'PayerID', options[:payer_id] unless options[:payer_id].blank?
198
+ xml.tag! 'Token', options[:token] unless options[:token].blank?
199
+ xml.tag! 'NoShipping', options[:no_shipping] ? '1' : '0'
200
+ xml.tag! 'AddressOverride', options[:address_override] ? '1' : '0'
201
+ xml.tag! 'ButtonSource', application_id.to_s.slice(0, 32) unless application_id.blank?
202
+
203
+ # Customization of the payment page
204
+ xml.tag! 'PageStyle', options[:page_style] unless options[:page_style].blank?
205
+ xml.tag! 'HeaderImage', options[:header_image] unless options[:header_image].blank?
206
+ xml.tag! 'PayflowColor', options[:background_color] unless options[:background_color].blank?
207
+ # Note: HeaderImage and PayflowColor apply to both the new (as of 2010) and the old checkout experience
208
+ # HeaderBackColor and HeaderBorderColor apply only to the old checkout experience which is being phased out.
209
+ xml.tag! 'HeaderBackColor', options[:header_background_color] unless options[:header_background_color].blank?
210
+ xml.tag! 'HeaderBorderColor', options[:header_border_color] unless options[:header_border_color].blank?
211
+ xml.tag! 'ExtData', 'Name' => 'ALLOWNOTE', 'Value' => options[:allow_note]
212
+ end
213
+ end
214
+
215
+ def build_response(success, message, response, options = {})
216
+ PayflowExpressResponse.new(success, message, response, options)
217
+ end
218
+ end
219
+ end
220
+ end
@@ -0,0 +1,14 @@
1
+ require 'active_merchant/billing/gateways/payflow_express'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ class PayflowExpressUkGateway < PayflowExpressGateway
6
+ self.default_currency = 'GBP'
7
+ self.partner = 'PayPalUk'
8
+
9
+ self.supported_countries = ['GB']
10
+ self.homepage_url = 'https://www.paypal.com/uk/cgi-bin/webscr?cmd=_additional-payment-overview-outside'
11
+ self.display_name = 'PayPal Express Checkout (UK)'
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,20 @@
1
+ require 'active_merchant/billing/gateways/payflow'
2
+ require 'active_merchant/billing/gateways/payflow_express_uk'
3
+
4
+ module ActiveMerchant #:nodoc:
5
+ module Billing #:nodoc:
6
+ class PayflowUkGateway < PayflowGateway
7
+ self.default_currency = 'GBP'
8
+ self.partner = 'PayPalUk'
9
+
10
+ def express
11
+ @express ||= PayflowExpressUkGateway.new(@options)
12
+ end
13
+
14
+ self.supported_cardtypes = %i[visa master american_express discover]
15
+ self.supported_countries = ['GB']
16
+ self.homepage_url = 'https://www.paypal.com/uk/webapps/mpp/pro'
17
+ self.display_name = 'PayPal Payments Pro (UK)'
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,373 @@
1
+ require 'rexml/document'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ # In NZ DPS supports ANZ, Westpac, National Bank, ASB and BNZ.
6
+ # In Australia DPS supports ANZ, NAB, Westpac, CBA, St George and Bank of South Australia.
7
+ # The Maybank in Malaysia is supported and the Citibank for Singapore.
8
+ class PaymentExpressGateway < Gateway
9
+ self.default_currency = 'NZD'
10
+ # PS supports all major credit cards; Visa, Mastercard, Amex, Diners, BankCard & JCB.
11
+ # Various white label cards can be accepted as well; Farmers, AirNZCard and Elders etc.
12
+ # Please note that not all acquirers and Eftpos networks can support some of these card types.
13
+ # VISA, Mastercard, Diners Club and Farmers cards are supported
14
+ #
15
+ # However, regular accounts with DPS only support VISA and Mastercard
16
+ self.supported_cardtypes = %i[visa master american_express diners_club jcb]
17
+
18
+ self.supported_countries = %w[AU FJ GB HK IE MY NZ PG SG US]
19
+
20
+ self.homepage_url = 'https://www.windcave.com/'
21
+ self.display_name = 'Windcave (formerly PaymentExpress)'
22
+
23
+ self.live_url = 'https://sec.paymentexpress.com/pxpost.aspx'
24
+ self.test_url = 'https://uat.paymentexpress.com/pxpost.aspx'
25
+
26
+ APPROVED = '1'
27
+
28
+ TRANSACTIONS = {
29
+ purchase: 'Purchase',
30
+ credit: 'Refund',
31
+ authorization: 'Auth',
32
+ capture: 'Complete',
33
+ validate: 'Validate'
34
+ }
35
+
36
+ # We require the DPS gateway username and password when the object is created.
37
+ #
38
+ # The PaymentExpress gateway also supports a :use_custom_payment_token boolean option.
39
+ # If set to true the gateway will use BillingId for the Token type. If set to false,
40
+ # then the token will be sent as the DPS specified "DpsBillingId". This is per the documentation at
41
+ # http://www.paymentexpress.com/technical_resources/ecommerce_nonhosted/pxpost.html#Tokenbilling
42
+ def initialize(options = {})
43
+ requires!(options, :login, :password)
44
+ super
45
+ end
46
+
47
+ # Funds are transferred immediately.
48
+ #
49
+ # `payment_source` can be a usual ActiveMerchant credit_card object, or can also
50
+ # be a string of the `DpsBillingId` or `BillingId` which can be gotten through the
51
+ # store method. If you are using a `BillingId` instead of `DpsBillingId` you must
52
+ # also set the instance method `#use_billing_id_for_token` to true, see the `#store`
53
+ # method for an example of how to do this.
54
+ def purchase(money, payment_source, options = {})
55
+ request = build_purchase_or_authorization_request(money, payment_source, options)
56
+ commit(:purchase, request)
57
+ end
58
+
59
+ # NOTE: Perhaps in options we allow a transaction note to be inserted
60
+ # Verifies that funds are available for the requested card and amount and reserves the specified amount.
61
+ # See: http://www.paymentexpress.com/technical_resources/ecommerce_nonhosted/pxpost.html#Authcomplete
62
+ #
63
+ # `payment_source` can be a usual ActiveMerchant credit_card object or a token, see #purchased method
64
+ def authorize(money, payment_source, options = {})
65
+ request = build_purchase_or_authorization_request(money, payment_source, options)
66
+ commit(:authorization, request)
67
+ end
68
+
69
+ # Transfer pre-authorized funds immediately
70
+ # See: http://www.paymentexpress.com/technical_resources/ecommerce_nonhosted/pxpost.html#Authcomplete
71
+ def capture(money, identification, options = {})
72
+ request = build_capture_or_credit_request(money, identification, options)
73
+ commit(:capture, request)
74
+ end
75
+
76
+ # Refund funds to the card holder
77
+ def refund(money, identification, options = {})
78
+ requires!(options, :description)
79
+
80
+ request = build_capture_or_credit_request(money, identification, options)
81
+ commit(:credit, request)
82
+ end
83
+
84
+ def credit(money, identification, options = {})
85
+ ActiveMerchant.deprecated CREDIT_DEPRECATION_MESSAGE
86
+ refund(money, identification, options)
87
+ end
88
+
89
+ def verify(payment_source, options = {})
90
+ request = build_purchase_or_authorization_request(100, payment_source, options)
91
+ commit(:validate, request)
92
+ end
93
+
94
+ # Token Based Billing
95
+ #
96
+ # Instead of storing the credit card details locally, you can store them inside the
97
+ # Payment Express system and instead bill future transactions against a token.
98
+ #
99
+ # This token can either be specified by your code or autogenerated by the PaymentExpress
100
+ # system. The default is to let PaymentExpress generate the token for you and so use
101
+ # the `DpsBillingId`. If you do not pass in any option of the `billing_id`, then the store
102
+ # method will ask PaymentExpress to create a token for you. Additionally, if you are
103
+ # using the default `DpsBillingId`, you do not have to do anything extra in the
104
+ # initialization of your gateway object.
105
+ #
106
+ # To specify and use your own token, you need to do two things.
107
+ #
108
+ # Firstly, pass in a `:billing_id` as an option in the hash of this store method. No
109
+ # validation is done on this BillingId by PaymentExpress so you must ensure that it is unique.
110
+ #
111
+ # gateway.store(credit_card, {:billing_id => 'YourUniqueBillingId'})
112
+ #
113
+ # Secondly, you will need to pass in the option `{:use_custom_payment_token => true}` when
114
+ # initializing your gateway instance, like so:
115
+ #
116
+ # gateway = ActiveMerchant::Billing::PaymentExpressGateway.new(
117
+ # :login => 'USERNAME',
118
+ # :password => 'PASSWORD',
119
+ # :use_custom_payment_token => true
120
+ # )
121
+ #
122
+ # see: http://www.paymentexpress.com/technical_resources/ecommerce_nonhosted/pxpost.html#Tokenbilling
123
+ #
124
+ # Note, once stored, PaymentExpress does not support unstoring a stored card.
125
+ def store(credit_card, options = {})
126
+ request = build_token_request(credit_card, options)
127
+ commit(:validate, request)
128
+ end
129
+
130
+ def supports_scrubbing
131
+ true
132
+ end
133
+
134
+ def scrub(transcript)
135
+ transcript.
136
+ gsub(%r((<PostPassword>).+(</PostPassword>)), '\1[FILTERED]\2').
137
+ gsub(%r((Authorization: Basic )\w+), '\1[FILTERED]\2').
138
+ gsub(%r((<CardNumber>)\d+(</CardNumber>)), '\1[FILTERED]\2').
139
+ gsub(%r((<Cvc2>)\d+(</Cvc2>)), '\1[FILTERED]\2')
140
+ end
141
+
142
+ private
143
+
144
+ def use_custom_payment_token?
145
+ @options[:use_custom_payment_token]
146
+ end
147
+
148
+ def build_purchase_or_authorization_request(money, payment_source, options)
149
+ result = new_transaction
150
+
151
+ if payment_source.is_a?(String)
152
+ add_billing_token(result, payment_source)
153
+ else
154
+ add_credit_card(result, payment_source)
155
+ end
156
+
157
+ add_amount(result, money, options) if money
158
+ add_invoice(result, options)
159
+ add_address_verification_data(result, options)
160
+ add_optional_elements(result, options)
161
+ add_ip(result, options)
162
+ result
163
+ end
164
+
165
+ def build_capture_or_credit_request(money, identification, options)
166
+ result = new_transaction
167
+
168
+ add_amount(result, money, options)
169
+ add_invoice(result, options)
170
+ add_reference(result, identification)
171
+ add_optional_elements(result, options)
172
+ add_ip(result, options)
173
+ result
174
+ end
175
+
176
+ def build_token_request(credit_card, options)
177
+ result = new_transaction
178
+ add_credit_card(result, credit_card)
179
+ add_amount(result, 100, options) # need to make an auth request for $1
180
+ add_token_request(result, options)
181
+ add_optional_elements(result, options)
182
+ add_ip(result, options)
183
+ result
184
+ end
185
+
186
+ def add_credentials(xml)
187
+ xml.add_element('PostUsername').text = @options[:login]
188
+ xml.add_element('PostPassword').text = @options[:password]
189
+ end
190
+
191
+ def add_reference(xml, identification)
192
+ xml.add_element('DpsTxnRef').text = identification
193
+ end
194
+
195
+ def add_credit_card(xml, credit_card)
196
+ xml.add_element('CardHolderName').text = credit_card.name
197
+ xml.add_element('CardNumber').text = credit_card.number
198
+ xml.add_element('DateExpiry').text = format_date(credit_card.month, credit_card.year)
199
+
200
+ if credit_card.verification_value?
201
+ xml.add_element('Cvc2').text = credit_card.verification_value
202
+ xml.add_element('Cvc2Presence').text = '1'
203
+ end
204
+ end
205
+
206
+ def add_billing_token(xml, token)
207
+ if use_custom_payment_token?
208
+ xml.add_element('BillingId').text = token
209
+ else
210
+ xml.add_element('DpsBillingId').text = token
211
+ end
212
+ end
213
+
214
+ def add_token_request(xml, options)
215
+ xml.add_element('BillingId').text = options[:billing_id] if options[:billing_id]
216
+ xml.add_element('EnableAddBillCard').text = 1
217
+ end
218
+
219
+ def add_amount(xml, money, options)
220
+ xml.add_element('Amount').text = amount(money)
221
+ xml.add_element('InputCurrency').text = options[:currency] || currency(money)
222
+ end
223
+
224
+ def add_transaction_type(xml, action)
225
+ xml.add_element('TxnType').text = TRANSACTIONS[action]
226
+ end
227
+
228
+ def add_invoice(xml, options)
229
+ xml.add_element('TxnId').text = options[:order_id].to_s.slice(0, 16) unless options[:order_id].blank?
230
+ xml.add_element('MerchantReference').text = options[:description].to_s.slice(0, 50) unless options[:description].blank?
231
+ end
232
+
233
+ def add_address_verification_data(xml, options)
234
+ address = options[:billing_address] || options[:address]
235
+ return if address.nil?
236
+
237
+ xml.add_element('EnableAvsData').text = options[:enable_avs_data] || 1
238
+ xml.add_element('AvsAction').text = options[:avs_action] || 1
239
+
240
+ xml.add_element('AvsStreetAddress').text = address[:address1]
241
+ xml.add_element('AvsPostCode').text = address[:zip]
242
+ end
243
+
244
+ def add_ip(xml, options)
245
+ xml.add_element('ClientInfo').text = options[:ip] if options[:ip]
246
+ end
247
+
248
+ # The options hash may contain optional data which will be passed
249
+ # through the specialized optional fields at PaymentExpress
250
+ # as follows:
251
+ #
252
+ # {
253
+ # :client_type => :web, # Possible values are: :web, :ivr, :moto, :unattended, :internet, or :recurring
254
+ # :txn_data1 => "String up to 255 characters",
255
+ # :txn_data2 => "String up to 255 characters",
256
+ # :txn_data3 => "String up to 255 characters"
257
+ # }
258
+ #
259
+ # +:client_type+, while not documented for PxPost, will be sent as
260
+ # the +ClientType+ XML element as described in the documentation for
261
+ # the PaymentExpress WebService: http://www.paymentexpress.com/Technical_Resources/Ecommerce_NonHosted/WebService#clientType
262
+ # (PaymentExpress have confirmed that this value works the same in PxPost).
263
+ # The value sent for +:client_type+ will be normalized and sent
264
+ # as one of the explicit values allowed by PxPost:
265
+ #
266
+ # :web => "Web"
267
+ # :ivr => "IVR"
268
+ # :moto => "MOTO"
269
+ # :unattended => "Unattended"
270
+ # :internet => "Internet"
271
+ # :recurring => "Recurring"
272
+ #
273
+ # If you set the +:client_type+ to any value not listed above,
274
+ # the ClientType element WILL NOT BE INCLUDED at all in the
275
+ # POST data.
276
+ #
277
+ # +:txn_data1+, +:txn_data2+, and +:txn_data3+ will be sent as
278
+ # +TxnData1+, +TxnData2+, and +TxnData3+, respectively, and are
279
+ # free form fields of the merchant's choosing, as documented here:
280
+ # http://www.paymentexpress.com/technical_resources/ecommerce_nonhosted/pxpost.html#txndata
281
+ #
282
+ # These optional elements are added to all transaction types:
283
+ # +purchase+, +authorize+, +capture+, +refund+, +store+
284
+ def add_optional_elements(xml, options)
285
+ if client_type = normalized_client_type(options[:client_type])
286
+ xml.add_element('ClientType').text = client_type
287
+ end
288
+
289
+ xml.add_element('TxnData1').text = options[:txn_data1].to_s.slice(0, 255) unless options[:txn_data1].blank?
290
+ xml.add_element('TxnData2').text = options[:txn_data2].to_s.slice(0, 255) unless options[:txn_data2].blank?
291
+ xml.add_element('TxnData3').text = options[:txn_data3].to_s.slice(0, 255) unless options[:txn_data3].blank?
292
+ end
293
+
294
+ def new_transaction
295
+ REXML::Document.new.add_element('Txn')
296
+ end
297
+
298
+ # Take in the request and post it to DPS
299
+ def commit(action, request)
300
+ add_credentials(request)
301
+ add_transaction_type(request, action)
302
+
303
+ url = test? ? self.test_url : self.live_url
304
+
305
+ # Parse the XML response
306
+ response = parse(ssl_post(url, request.to_s))
307
+
308
+ # Return a response
309
+ PaymentExpressResponse.new(response[:success] == APPROVED, message_from(response), response,
310
+ test: response[:test_mode] == '1',
311
+ authorization: authorization_from(action, response))
312
+ end
313
+
314
+ # Response XML documentation: http://www.paymentexpress.com/technical_resources/ecommerce_nonhosted/pxpost.html#XMLTxnOutput
315
+ def parse(xml_string)
316
+ response = {}
317
+
318
+ xml = REXML::Document.new(xml_string)
319
+
320
+ # Gather all root elements such as HelpText
321
+ xml.elements.each('Txn/*') do |element|
322
+ response[element.name.underscore.to_sym] = element.text unless element.name == 'Transaction'
323
+ end
324
+
325
+ # Gather all transaction elements and prefix with "account_"
326
+ # So we could access the MerchantResponseText by going
327
+ # response[account_merchant_response_text]
328
+ xml.elements.each('Txn/Transaction/*') do |element|
329
+ response[element.name.underscore.to_sym] = element.text
330
+ end
331
+
332
+ response
333
+ end
334
+
335
+ def message_from(response)
336
+ (response[:card_holder_help_text] || response[:response_text])
337
+ end
338
+
339
+ def authorization_from(action, response)
340
+ case action
341
+ when :validate
342
+ (response[:billing_id] || response[:dps_billing_id] || response[:dps_txn_ref])
343
+ else
344
+ response[:dps_txn_ref]
345
+ end
346
+ end
347
+
348
+ def format_date(month, year)
349
+ "#{format(month, :two_digits)}#{format(year, :two_digits)}"
350
+ end
351
+
352
+ def normalized_client_type(client_type_from_options)
353
+ case client_type_from_options.to_s.downcase
354
+ when 'web' then 'Web'
355
+ when 'ivr' then 'IVR'
356
+ when 'moto' then 'MOTO'
357
+ when 'unattended' then 'Unattended'
358
+ when 'internet' then 'Internet'
359
+ when 'recurring' then 'Recurring'
360
+ else nil
361
+ end
362
+ end
363
+ end
364
+
365
+ class PaymentExpressResponse < Response
366
+ # add a method to response so we can easily get the token
367
+ # for Validate transactions
368
+ def token
369
+ @params['billing_id'] || @params['dps_billing_id'] || @params['dps_txn_ref']
370
+ end
371
+ end
372
+ end
373
+ end