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,549 @@
1
+ require 'digest/md5'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ class BluePayGateway < Gateway
6
+ class_attribute :rebilling_url, :ignore_http_status
7
+
8
+ self.live_url = 'https://secure.bluepay.com/interfaces/bp20post'
9
+ self.rebilling_url = 'https://secure.bluepay.com/interfaces/bp20rebadmin'
10
+
11
+ self.ignore_http_status = true
12
+
13
+ CARD_CODE_ERRORS = %w(N S)
14
+ AVS_ERRORS = %w(A E N R W Z)
15
+ AVS_REASON_CODES = %w(27 45)
16
+
17
+ FIELD_MAP = {
18
+ 'TRANS_ID' => :transaction_id,
19
+ 'STATUS' => :response_code,
20
+ 'AVS' => :avs_result_code,
21
+ 'CVV2' => :card_code,
22
+ 'AUTH_CODE' => :authorization,
23
+ 'MESSAGE' => :message,
24
+ 'REBID' => :rebid,
25
+ 'TRANS_TYPE' => :trans_type,
26
+ 'PAYMENT_ACCOUNT_MASK' => :acct_mask,
27
+ 'CARD_TYPE' => :card_type
28
+ }
29
+
30
+ REBILL_FIELD_MAP = {
31
+ 'REBILL_ID' => :rebill_id,
32
+ 'ACCOUNT_ID' => :account_id,
33
+ 'USER_ID' => :user_id,
34
+ 'TEMPLATE_ID' => :template_id,
35
+ 'STATUS' => :status,
36
+ 'CREATION_DATE' => :creation_date,
37
+ 'NEXT_DATE' => :next_date,
38
+ 'LAST_DATE' => :last_date,
39
+ 'SCHED_EXPR' => :schedule,
40
+ 'CYCLES_REMAIN' => :cycles_remain,
41
+ 'REB_AMOUNT' => :rebill_amount,
42
+ 'NEXT_AMOUNT' => :next_amount,
43
+ 'USUAL_DATE' => :undoc_usual_date, # Not found in the bp20rebadmin API doc.
44
+ 'CUST_TOKEN' => :cust_token
45
+ }
46
+
47
+ self.supported_countries = %w[US CA]
48
+ self.supported_cardtypes = %i[visa master american_express discover diners_club jcb]
49
+ self.homepage_url = 'http://www.bluepay.com/'
50
+ self.display_name = 'BluePay'
51
+ self.money_format = :dollars
52
+
53
+ # Creates a new BluepayGateway
54
+ #
55
+ # The gateway requires that a valid Account ID and Secret Key be passed
56
+ # in the +options+ hash.
57
+ #
58
+ # ==== Options
59
+ #
60
+ # * <tt>:account_id</tt> -- The BluePay gateway Account ID (REQUIRED)
61
+ # * <tt>:secret_key</tt> -- The BluePay gateway Secret Key (REQUIRED)
62
+ # * <tt>:test</tt> -- set to true for TEST mode or false for LIVE mode
63
+ def initialize(options = {})
64
+ requires!(options, :login, :password)
65
+ super
66
+ end
67
+
68
+ # Performs an authorization, which reserves the funds on the customer's credit card. This does not actually take funds from the customer
69
+ # This is referred to an AUTH transaction in BluePay
70
+ #
71
+ # ==== Parameters
72
+ #
73
+ # * <tt>money</tt> -- The amount to be authorized as an Integer value in cents.
74
+ # * <tt>payment_object</tt> -- This can either be one of three things:
75
+ # A CreditCard object,
76
+ # A Check object,
77
+ # or a token. The token is called the Master ID. This is a unique transaction ID returned from a previous transaction. This token associates all the stored information for a previous transaction.
78
+ # * <tt>options</tt> -- A hash of optional parameters.
79
+ def authorize(money, payment_object, options = {})
80
+ post = {}
81
+ add_payment_method(post, payment_object)
82
+ add_invoice(post, options)
83
+ add_address(post, options)
84
+ add_customer_data(post, options)
85
+ add_rebill(post, options) if options[:rebill]
86
+ add_duplicate_override(post, options)
87
+ add_stored_credential(post, options)
88
+ post[:TRANS_TYPE] = 'AUTH'
89
+ commit('AUTH_ONLY', money, post, options)
90
+ end
91
+
92
+ # Perform a purchase, which is essentially an authorization and capture in a single operation.
93
+ # This is referred to a SALE transaction in BluePay
94
+ #
95
+ # ==== Parameters
96
+ #
97
+ # * <tt>money</tt> -- The amount to be purchased as an Integer value in cents.
98
+ # * <tt>payment_object</tt> -- This can either be one of three things:
99
+ # A CreditCard object,
100
+ # A Check object,
101
+ # or a token. The token is called the Master ID. This is a unique transaction ID returned from a previous transaction. This token associates all the stored information for a previous transaction.
102
+ # * <tt>options</tt> -- A hash of optional parameters.,
103
+ def purchase(money, payment_object, options = {})
104
+ post = {}
105
+ add_payment_method(post, payment_object)
106
+ add_invoice(post, options)
107
+ add_address(post, options)
108
+ add_customer_data(post, options)
109
+ add_rebill(post, options) if options[:rebill]
110
+ add_duplicate_override(post, options)
111
+ add_stored_credential(post, options)
112
+ post[:TRANS_TYPE] = 'SALE'
113
+ commit('AUTH_CAPTURE', money, post, options)
114
+ end
115
+
116
+ # Captures the funds from an authorize transaction.
117
+ # This is referred to a CAPTURE transaction in BluePay
118
+ #
119
+ # ==== Parameters
120
+ #
121
+ # * <tt>money</tt> -- The amount to be captured as an Integer value in cents.
122
+ # * <tt>identification</tt> -- The Master ID, or token, returned from the previous authorize transaction.
123
+ def capture(money, identification, options = {})
124
+ post = {}
125
+ add_address(post, options)
126
+ add_customer_data(post, options)
127
+ post[:MASTER_ID] = identification
128
+ post[:TRANS_TYPE] = 'CAPTURE'
129
+ commit('PRIOR_AUTH_CAPTURE', money, post, options)
130
+ end
131
+
132
+ # Void a previous transaction
133
+ # This is referred to a VOID transaction in BluePay
134
+ #
135
+ # ==== Parameters
136
+ #
137
+ # * <tt>identification</tt> - The Master ID, or token, returned from a previous authorize transaction.
138
+ def void(identification, options = {})
139
+ post = {}
140
+ post[:MASTER_ID] = identification
141
+ post[:TRANS_TYPE] = 'VOID'
142
+ commit('VOID', nil, post, options)
143
+ end
144
+
145
+ # Performs a credit.
146
+ #
147
+ # This transaction indicates that money should flow from the merchant to the customer.
148
+ #
149
+ # ==== Parameters
150
+ #
151
+ # * <tt>money</tt> -- The amount to be credited to the customer as an Integer value in cents.
152
+ # * <tt>payment_object</tt> -- This can either be one of three things:
153
+ # A CreditCard object,
154
+ # A Check object,
155
+ # or a token. The token is called the Master ID. This is a unique transaction ID returned from a previous transaction. This token associates all the stored information for a previous transaction.
156
+ # If the payment_object is a token, then the transaction type will reverse a previous capture or purchase transaction, returning the funds to the customer. If the amount is nil, a full credit will be processed. This is referred to a REFUND transaction in BluePay.
157
+ # If the payment_object is either a CreditCard or Check object, then the transaction type will be an unmatched credit placing funds in the specified account. This is referred to a CREDIT transaction in BluePay.
158
+ # * <tt>options</tt> -- A hash of parameters.
159
+ def refund(money, identification, options = {})
160
+ if identification && !identification.kind_of?(String)
161
+ ActiveMerchant.deprecated 'refund should only be used to refund a referenced transaction'
162
+ return credit(money, identification, options)
163
+ end
164
+
165
+ post = {}
166
+ post[:PAYMENT_ACCOUNT] = ''
167
+ post[:MASTER_ID] = identification
168
+ post[:TRANS_TYPE] = 'REFUND'
169
+ post[:DOC_TYPE] = options[:doc_type] if options[:doc_type]
170
+ post[:NAME1] = options[:first_name] || ''
171
+ post[:NAME2] = options[:last_name] if options[:last_name]
172
+ post[:ZIP] = options[:zip] if options[:zip]
173
+ add_invoice(post, options)
174
+ add_address(post, options)
175
+ add_customer_data(post, options)
176
+ commit('CREDIT', money, post, options)
177
+ end
178
+
179
+ def credit(money, payment_object, options = {})
180
+ if payment_object&.kind_of?(String)
181
+ ActiveMerchant.deprecated 'credit should only be used to credit a payment method'
182
+ return refund(money, payment_object, options)
183
+ end
184
+
185
+ post = {}
186
+ post[:PAYMENT_ACCOUNT] = ''
187
+ add_payment_method(post, payment_object)
188
+ post[:TRANS_TYPE] = 'CREDIT'
189
+ post[:DOC_TYPE] = options[:doc_type] if options[:doc_type]
190
+
191
+ post[:NAME1] = options[:first_name] || ''
192
+ post[:NAME2] = options[:last_name] if options[:last_name]
193
+ post[:ZIP] = options[:zip] if options[:zip]
194
+ add_invoice(post, options)
195
+ add_address(post, options)
196
+ add_customer_data(post, options)
197
+ commit('CREDIT', money, post, options)
198
+ end
199
+
200
+ # Create a new recurring payment.
201
+ #
202
+ # ==== Parameters
203
+ #
204
+ # * <tt>money</tt> -- The amount to charge the customer at the time of the recurring payment setup, in cents. Set to zero if you do not want the customer to be charged at this time.
205
+ # * <tt>payment_object</tt> -- This can either be one of three things:
206
+ # A CreditCard object,
207
+ # A Check object,
208
+ # or a token. The token is called the Master ID. This is a unique transaction ID returned from a previous transaction. This token associates all the stored information for a previous transaction.
209
+ # * <tt>options</tt> -- A hash of optional parameters.,
210
+
211
+ # ==== Options
212
+ #
213
+ # * <tt>:rebill_start_date</tt> is a string that tells the gateway when to start the rebill. (REQUIRED)
214
+ # Has two valid formats:
215
+ # "YYYY-MM-DD HH:MM:SS" Hours, minutes, and seconds are optional.
216
+ # "XX UNITS" Relative date as explained below. Marked from the time of the
217
+ # transaction (i.e.: 10 DAYS, 1 MONTH, 1 YEAR)
218
+ # * <tt>:rebill_expression</tt> is the period of time in-between rebillings. (REQUIRED)
219
+ # It uses the same "XX UNITS" format as rebill_start_date, explained above.
220
+ # Optional parameters include:
221
+ # * <tt>rebill_cycles</tt>: Number of times to rebill. Don't send or set to nil for infinite rebillings (or
222
+ # until canceled).
223
+ # * <tt>rebill_amount</tt>: Amount to rebill. Defaults to amount of transaction for rebillings.
224
+ #
225
+ # For example, to charge the customer $19.95 now and then charge $39.95 in 60 days every 3 months for 5 times, the options hash would be as follows:
226
+ # :rebill_start_date => '60 DAYS',
227
+ # :rebill_expression => '3 MONTHS',
228
+ # :rebill_cycles => '5',
229
+ # :rebill_amount => '39.95'
230
+ # A money object of 1995 cents would be passed into the 'money' parameter.
231
+ def recurring(money, payment_object, options = {})
232
+ ActiveMerchant.deprecated RECURRING_DEPRECATION_MESSAGE
233
+
234
+ requires!(options, :rebill_start_date, :rebill_expression)
235
+ options[:rebill] = true
236
+ if money
237
+ purchase(money, payment_object, options)
238
+ else
239
+ authorize(money, payment_object, options)
240
+ end
241
+ end
242
+
243
+ # View a recurring payment
244
+ #
245
+ # This will pull data associated with a current recurring billing
246
+ #
247
+ # ==== Parameters
248
+ #
249
+ # * <tt>rebill_id</tt> -- A string containing the rebill_id of the recurring billing that is already active (REQUIRED)
250
+ def status_recurring(rebill_id)
251
+ ActiveMerchant.deprecated RECURRING_DEPRECATION_MESSAGE
252
+
253
+ post = {}
254
+ requires!(rebill_id)
255
+ post[:REBILL_ID] = rebill_id
256
+ post[:TRANS_TYPE] = 'GET'
257
+ commit('rebill', 'nil', post)
258
+ end
259
+
260
+ # Update a recurring payment's details.
261
+ #
262
+ # This transaction updates an existing recurring billing
263
+ #
264
+ # ==== Options
265
+ #
266
+ # * <tt>:rebill_id</tt> -- The 12 digit rebill ID used to update a particular rebilling cycle. (REQUIRED)
267
+ # * <tt>:rebill_amount</tt> -- A string containing the new rebilling amount.
268
+ # * <tt>:rebill_next_date</tt> -- A string containing the new rebilling next date.
269
+ # * <tt>:rebill_expression</tt> -- A string containing the new rebilling expression.
270
+ # * <tt>:rebill_cycles</tt> -- A string containing the new rebilling cycles.
271
+ # * <tt>:rebill_next_amount</tt> -- A string containing the next rebilling amount to charge the customer. This ONLY affects the next scheduled charge; all other rebillings will continue at the regular (rebill_amount) amount.
272
+ # Take a look above at the recurring_payment method for similar examples on how to use.
273
+ def update_recurring(options = {})
274
+ ActiveMerchant.deprecated RECURRING_DEPRECATION_MESSAGE
275
+
276
+ post = {}
277
+ requires!(options, :rebill_id)
278
+ post[:REBILL_ID] = options[:rebill_id]
279
+ post[:TRANS_TYPE] = 'SET'
280
+ post[:REB_AMOUNT] = amount(options[:rebill_amount]) if options[:rebill_amount]
281
+ post[:NEXT_DATE] = options[:rebill_next_date]
282
+ post[:REB_EXPR] = options[:rebill_expression]
283
+ post[:REB_CYCLES] = options[:rebill_cycles]
284
+ post[:NEXT_AMOUNT] = options[:rebill_next_amount]
285
+ commit('rebill', 'nil', post)
286
+ end
287
+
288
+ # Cancel a recurring payment.
289
+ #
290
+ # This transaction cancels an existing recurring billing.
291
+ #
292
+ # ==== Parameters
293
+ #
294
+ # * <tt>rebill_id</tt> -- A string containing the rebill_id of the recurring billing that you wish to cancel/stop (REQUIRED)
295
+ def cancel_recurring(rebill_id)
296
+ ActiveMerchant.deprecated RECURRING_DEPRECATION_MESSAGE
297
+
298
+ post = {}
299
+ requires!(rebill_id)
300
+ post[:REBILL_ID] = rebill_id
301
+ post[:TRANS_TYPE] = 'SET'
302
+ post[:STATUS] = 'stopped'
303
+ commit('rebill', 'nil', post)
304
+ end
305
+
306
+ def supports_scrubbing
307
+ true
308
+ end
309
+
310
+ def scrub(transcript)
311
+ transcript.
312
+ gsub(%r((Authorization: Basic )\w+), '\1[FILTERED]').
313
+ gsub(%r((&?card_num=)[^&]*)i, '\1[FILTERED]').
314
+ gsub(%r((&?CARD_CVV2=)[^&]*)i, '\1[FILTERED]').
315
+ gsub(%r((&?PAYMENT_ACCOUNT=)[^&]*)i, '\1[FILTERED]').
316
+ gsub(%r((&?TAMPER_PROOF_SEAL=)[^&"]*)i, '\1[FILTERED]')
317
+ end
318
+
319
+ private
320
+
321
+ def commit(action, money, fields, options = {})
322
+ fields[:AMOUNT] = amount(money) unless fields[:TRANS_TYPE] == 'VOID' || action == 'rebill'
323
+ fields[:MODE] = (test? ? 'TEST' : 'LIVE')
324
+ fields[:ACCOUNT_ID] = @options[:login]
325
+ fields[:CUSTOMER_IP] = options[:ip] if options[:ip]
326
+
327
+ if action == 'rebill'
328
+ url = rebilling_url
329
+ fields[:TAMPER_PROOF_SEAL] = calc_rebill_tps(fields)
330
+ else
331
+ url = live_url
332
+ fields[:TAMPER_PROOF_SEAL] = calc_tps(amount(money), fields)
333
+ end
334
+ parse(ssl_post(url, post_data(action, fields)))
335
+ end
336
+
337
+ def parse_recurring(response_fields, opts = {}) # expected status?
338
+ parsed = {}
339
+ response_fields.each do |k, v|
340
+ mapped_key = REBILL_FIELD_MAP.include?(k) ? REBILL_FIELD_MAP[k] : k
341
+ parsed[mapped_key] = v
342
+ end
343
+
344
+ success = parsed[:status] != 'error'
345
+ message = parsed[:status]
346
+
347
+ Response.new(success, message, parsed,
348
+ test: test?,
349
+ authorization: parsed[:rebill_id])
350
+ end
351
+
352
+ def parse(body)
353
+ # The bp20api has max one value per form field.
354
+ response_fields = Hash[CGI::parse(body).map { |k, v| [k.upcase, v.first] }]
355
+
356
+ return parse_recurring(response_fields) if response_fields.include? 'REBILL_ID'
357
+
358
+ parsed = {}
359
+ response_fields.each do |k, v|
360
+ mapped_key = FIELD_MAP.include?(k) ? FIELD_MAP[k] : k
361
+ parsed[mapped_key] = v
362
+ end
363
+
364
+ # normalize message
365
+ message = message_from(parsed)
366
+ success = parsed[:response_code] == '1'
367
+ Response.new(success, message, parsed,
368
+ test: test?,
369
+ authorization: (parsed[:rebid] && parsed[:rebid] != '' ? parsed[:rebid] : parsed[:transaction_id]),
370
+ avs_result: { code: parsed[:avs_result_code] },
371
+ cvv_result: parsed[:card_code])
372
+ end
373
+
374
+ def message_from(parsed)
375
+ message = parsed[:message]
376
+ if parsed[:response_code].to_i == 2
377
+ if CARD_CODE_ERRORS.include?(parsed[:card_code])
378
+ message = CVVResult.messages[parsed[:card_code]]
379
+ elsif AVS_ERRORS.include?(parsed[:avs_result_code])
380
+ message = AVSResult.messages[parsed[:avs_result_code]]
381
+ else
382
+ message = message.chomp('.')
383
+ end
384
+ elsif message == 'Missing ACCOUNT_ID'
385
+ message = 'The merchant login ID or password is invalid'
386
+ elsif /Approved/.match?(message)
387
+ message = 'This transaction has been approved'
388
+ elsif /Expired/.match?(message)
389
+ message = 'The credit card has expired'
390
+ end
391
+ message
392
+ end
393
+
394
+ def add_invoice(post, options)
395
+ post[:ORDER_ID] = options[:order_id]
396
+ post[:INVOICE_ID] = options[:invoice]
397
+ post[:invoice_num] = options[:order_id]
398
+ post[:MEMO] = options[:description]
399
+ post[:description] = options[:description]
400
+ end
401
+
402
+ def add_payment_method(post, payment_object)
403
+ post[:MASTER_ID] = ''
404
+ case payment_object
405
+ when String
406
+ post[:MASTER_ID] = payment_object
407
+ when Check
408
+ add_check(post, payment_object)
409
+ else
410
+ add_creditcard(post, payment_object)
411
+ end
412
+ end
413
+
414
+ def add_creditcard(post, creditcard)
415
+ post[:PAYMENT_TYPE] = 'CREDIT'
416
+ post[:PAYMENT_ACCOUNT] = creditcard.number
417
+ post[:CARD_CVV2] = creditcard.verification_value
418
+ post[:CARD_EXPIRE] = expdate(creditcard)
419
+ post[:NAME1] = creditcard.first_name
420
+ post[:NAME2] = creditcard.last_name
421
+ end
422
+
423
+ CHECK_ACCOUNT_TYPES = {
424
+ 'checking' => 'C',
425
+ 'savings' => 'S'
426
+ }
427
+
428
+ def add_check(post, check)
429
+ post[:PAYMENT_TYPE] = 'ACH'
430
+ post[:PAYMENT_ACCOUNT] = [CHECK_ACCOUNT_TYPES[check.account_type], check.routing_number, check.account_number].join(':')
431
+ post[:NAME1] = check.first_name
432
+ post[:NAME2] = check.last_name
433
+ end
434
+
435
+ def add_customer_data(post, options)
436
+ post[:EMAIL] = options[:email]
437
+ post[:CUSTOM_ID] = options[:customer]
438
+ post[:CUSTOM_ID2] = options[:custom_id2]
439
+ end
440
+
441
+ def add_duplicate_override(post, options)
442
+ post[:DUPLICATE_OVERRIDE] = options[:duplicate_override]
443
+ end
444
+
445
+ def add_address(post, options)
446
+ if address = (options[:shipping_address] || options[:billing_address] || options[:address])
447
+ post[:ADDR1] = address[:address1]
448
+ post[:ADDR2] = address[:address2]
449
+ post[:COMPANY_NAME] = address[:company]
450
+ post[:PHONE] = address[:phone]
451
+ post[:CITY] = address[:city]
452
+ post[:STATE] = (address[:state].blank? ? 'n/a' : address[:state])
453
+ post[:ZIP] = address[:zip]
454
+ post[:COUNTRY] = address[:country]
455
+ end
456
+ end
457
+
458
+ def add_rebill(post, options)
459
+ post[:DO_REBILL] = '1'
460
+ post[:REB_AMOUNT] = amount(options[:rebill_amount])
461
+ post[:REB_FIRST_DATE] = options[:rebill_start_date]
462
+ post[:REB_EXPR] = options[:rebill_expression]
463
+ post[:REB_CYCLES] = options[:rebill_cycles]
464
+ end
465
+
466
+ def add_stored_credential(post, options)
467
+ post[:cof] = initiator(options)
468
+ post[:cofscheduled] = scheduled(options)
469
+ end
470
+
471
+ def initiator(options)
472
+ return unless initiator = options.dig(:stored_credential, :initiator)
473
+
474
+ case initiator
475
+ when 'merchant'
476
+ 'M'
477
+ when 'cardholder'
478
+ 'C'
479
+ end
480
+ end
481
+
482
+ def scheduled(options)
483
+ return unless reason_type = options.dig(:stored_credential, :reason_type)
484
+
485
+ case reason_type
486
+ when 'recurring', 'installment'
487
+ 'Y'
488
+ when 'unscheduled'
489
+ 'N'
490
+ end
491
+ end
492
+
493
+ def post_data(action, parameters = {})
494
+ post = {}
495
+ post[:version] = '1'
496
+ post[:login] = ''
497
+ post[:tran_key] = ''
498
+ post[:relay_response] = 'FALSE'
499
+ post[:type] = action
500
+ post[:delim_data] = 'TRUE'
501
+ post[:delim_char] = ','
502
+ post[:encap_char] = '$'
503
+ post[:card_num] = '4111111111111111'
504
+ post[:exp_date] = '1212'
505
+ post[:solution_ID] = application_id if application_id
506
+ post.merge(parameters).collect { |key, value| "#{key}=#{CGI.escape(value.to_s)}" }.join('&')
507
+ end
508
+
509
+ def expdate(creditcard)
510
+ year = format(creditcard.year, :two_digits)
511
+ month = format(creditcard.month, :two_digits)
512
+
513
+ "#{month}#{year}"
514
+ end
515
+
516
+ def calc_tps(amount, post)
517
+ post[:NAME1] ||= ''
518
+ Digest::MD5.hexdigest(
519
+ [
520
+ @options[:password],
521
+ @options[:login],
522
+ post[:TRANS_TYPE],
523
+ amount,
524
+ post[:MASTER_ID],
525
+ post[:NAME1],
526
+ post[:PAYMENT_ACCOUNT]
527
+ ].join('')
528
+ )
529
+ end
530
+
531
+ def calc_rebill_tps(post)
532
+ Digest::MD5.hexdigest(
533
+ [
534
+ @options[:password],
535
+ @options[:login],
536
+ post[:TRANS_TYPE],
537
+ post[:REBILL_ID]
538
+ ].join('')
539
+ )
540
+ end
541
+
542
+ def handle_response(response)
543
+ return response.body if ignore_http_status || (200...300).cover?(response.code.to_i)
544
+
545
+ raise ResponseError.new(response)
546
+ end
547
+ end
548
+ end
549
+ end