start_activemerchant 1.50.0

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 (218) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +1769 -0
  3. data/CONTRIBUTORS +540 -0
  4. data/MIT-LICENSE +20 -0
  5. data/README.md +226 -0
  6. data/lib/active_merchant.rb +67 -0
  7. data/lib/active_merchant/billing.rb +15 -0
  8. data/lib/active_merchant/billing/apple_pay_payment_token.rb +22 -0
  9. data/lib/active_merchant/billing/avs_result.rb +98 -0
  10. data/lib/active_merchant/billing/base.rb +72 -0
  11. data/lib/active_merchant/billing/check.rb +76 -0
  12. data/lib/active_merchant/billing/compatibility.rb +120 -0
  13. data/lib/active_merchant/billing/credit_card.rb +404 -0
  14. data/lib/active_merchant/billing/credit_card_formatting.rb +24 -0
  15. data/lib/active_merchant/billing/credit_card_methods.rb +195 -0
  16. data/lib/active_merchant/billing/cvv_result.rb +38 -0
  17. data/lib/active_merchant/billing/gateway.rb +291 -0
  18. data/lib/active_merchant/billing/gateways.rb +14 -0
  19. data/lib/active_merchant/billing/gateways/allied_wallet.rb +203 -0
  20. data/lib/active_merchant/billing/gateways/app55.rb +176 -0
  21. data/lib/active_merchant/billing/gateways/authorize_net.rb +510 -0
  22. data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +417 -0
  23. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +976 -0
  24. data/lib/active_merchant/billing/gateways/axcessms.rb +181 -0
  25. data/lib/active_merchant/billing/gateways/balanced.rb +256 -0
  26. data/lib/active_merchant/billing/gateways/bank_frick.rb +225 -0
  27. data/lib/active_merchant/billing/gateways/banwire.rb +105 -0
  28. data/lib/active_merchant/billing/gateways/barclays_epdq.rb +314 -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.rb +192 -0
  32. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +389 -0
  33. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +58 -0
  34. data/lib/active_merchant/billing/gateways/blue_pay.rb +506 -0
  35. data/lib/active_merchant/billing/gateways/bogus.rb +140 -0
  36. data/lib/active_merchant/billing/gateways/borgun.rb +211 -0
  37. data/lib/active_merchant/billing/gateways/bpoint.rb +277 -0
  38. data/lib/active_merchant/billing/gateways/braintree.rb +19 -0
  39. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +9 -0
  40. data/lib/active_merchant/billing/gateways/braintree_blue.rb +574 -0
  41. data/lib/active_merchant/billing/gateways/braintree_orange.rb +20 -0
  42. data/lib/active_merchant/billing/gateways/bridge_pay.rb +189 -0
  43. data/lib/active_merchant/billing/gateways/card_save.rb +23 -0
  44. data/lib/active_merchant/billing/gateways/card_stream.rb +238 -0
  45. data/lib/active_merchant/billing/gateways/cashnet.rb +202 -0
  46. data/lib/active_merchant/billing/gateways/cc5.rb +201 -0
  47. data/lib/active_merchant/billing/gateways/cecabank.rb +229 -0
  48. data/lib/active_merchant/billing/gateways/cenpos.rb +262 -0
  49. data/lib/active_merchant/billing/gateways/certo_direct.rb +278 -0
  50. data/lib/active_merchant/billing/gateways/checkout.rb +216 -0
  51. data/lib/active_merchant/billing/gateways/checkout_v2.rb +200 -0
  52. data/lib/active_merchant/billing/gateways/commercegate.rb +143 -0
  53. data/lib/active_merchant/billing/gateways/conekta.rb +210 -0
  54. data/lib/active_merchant/billing/gateways/cyber_source.rb +720 -0
  55. data/lib/active_merchant/billing/gateways/data_cash.rb +600 -0
  56. data/lib/active_merchant/billing/gateways/dibs.rb +206 -0
  57. data/lib/active_merchant/billing/gateways/efsnet.rb +219 -0
  58. data/lib/active_merchant/billing/gateways/elavon.rb +348 -0
  59. data/lib/active_merchant/billing/gateways/epay.rb +274 -0
  60. data/lib/active_merchant/billing/gateways/evo_ca.rb +308 -0
  61. data/lib/active_merchant/billing/gateways/eway.rb +214 -0
  62. data/lib/active_merchant/billing/gateways/eway_managed.rb +291 -0
  63. data/lib/active_merchant/billing/gateways/eway_rapid.rb +522 -0
  64. data/lib/active_merchant/billing/gateways/exact.rb +227 -0
  65. data/lib/active_merchant/billing/gateways/ezic.rb +206 -0
  66. data/lib/active_merchant/billing/gateways/fat_zebra.rb +213 -0
  67. data/lib/active_merchant/billing/gateways/federated_canada.rb +160 -0
  68. data/lib/active_merchant/billing/gateways/finansbank.rb +23 -0
  69. data/lib/active_merchant/billing/gateways/first_giving.rb +143 -0
  70. data/lib/active_merchant/billing/gateways/first_pay.rb +160 -0
  71. data/lib/active_merchant/billing/gateways/firstdata_e4.rb +413 -0
  72. data/lib/active_merchant/billing/gateways/flo2cash.rb +215 -0
  73. data/lib/active_merchant/billing/gateways/flo2cash_simple.rb +20 -0
  74. data/lib/active_merchant/billing/gateways/garanti.rb +261 -0
  75. data/lib/active_merchant/billing/gateways/global_transport.rb +179 -0
  76. data/lib/active_merchant/billing/gateways/hdfc.rb +207 -0
  77. data/lib/active_merchant/billing/gateways/hps.rb +287 -0
  78. data/lib/active_merchant/billing/gateways/iats_payments.rb +277 -0
  79. data/lib/active_merchant/billing/gateways/ideal/ideal_base.rb +246 -0
  80. data/lib/active_merchant/billing/gateways/ideal/ideal_rabobank.pem +13 -0
  81. data/lib/active_merchant/billing/gateways/ideal/ideal_response.rb +29 -0
  82. data/lib/active_merchant/billing/gateways/ideal_rabobank.rb +66 -0
  83. data/lib/active_merchant/billing/gateways/inspire.rb +219 -0
  84. data/lib/active_merchant/billing/gateways/instapay.rb +163 -0
  85. data/lib/active_merchant/billing/gateways/ipp.rb +175 -0
  86. data/lib/active_merchant/billing/gateways/iridium.rb +457 -0
  87. data/lib/active_merchant/billing/gateways/itransact.rb +448 -0
  88. data/lib/active_merchant/billing/gateways/jetpay.rb +275 -0
  89. data/lib/active_merchant/billing/gateways/linkpoint.rb +438 -0
  90. data/lib/active_merchant/billing/gateways/litle.rb +345 -0
  91. data/lib/active_merchant/billing/gateways/maxipago.rb +197 -0
  92. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +170 -0
  93. data/lib/active_merchant/billing/gateways/merchant_one.rb +114 -0
  94. data/lib/active_merchant/billing/gateways/merchant_partners.rb +245 -0
  95. data/lib/active_merchant/billing/gateways/merchant_ware.rb +319 -0
  96. data/lib/active_merchant/billing/gateways/merchant_ware_version_four.rb +268 -0
  97. data/lib/active_merchant/billing/gateways/merchant_warrior.rb +195 -0
  98. data/lib/active_merchant/billing/gateways/mercury.rb +326 -0
  99. data/lib/active_merchant/billing/gateways/metrics_global.rb +303 -0
  100. data/lib/active_merchant/billing/gateways/migs.rb +280 -0
  101. data/lib/active_merchant/billing/gateways/migs/migs_codes.rb +100 -0
  102. data/lib/active_merchant/billing/gateways/modern_payments.rb +37 -0
  103. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +219 -0
  104. data/lib/active_merchant/billing/gateways/monei.rb +307 -0
  105. data/lib/active_merchant/billing/gateways/moneris.rb +309 -0
  106. data/lib/active_merchant/billing/gateways/moneris_us.rb +298 -0
  107. data/lib/active_merchant/billing/gateways/money_movers.rb +152 -0
  108. data/lib/active_merchant/billing/gateways/nab_transact.rb +290 -0
  109. data/lib/active_merchant/billing/gateways/net_registry.rb +198 -0
  110. data/lib/active_merchant/billing/gateways/netaxept.rb +181 -0
  111. data/lib/active_merchant/billing/gateways/netbilling.rb +224 -0
  112. data/lib/active_merchant/billing/gateways/netpay.rb +223 -0
  113. data/lib/active_merchant/billing/gateways/network_merchants.rb +242 -0
  114. data/lib/active_merchant/billing/gateways/nmi.rb +256 -0
  115. data/lib/active_merchant/billing/gateways/ogone.rb +435 -0
  116. data/lib/active_merchant/billing/gateways/omise.rb +319 -0
  117. data/lib/active_merchant/billing/gateways/openpay.rb +194 -0
  118. data/lib/active_merchant/billing/gateways/optimal_payment.rb +314 -0
  119. data/lib/active_merchant/billing/gateways/orbital.rb +834 -0
  120. data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +47 -0
  121. data/lib/active_merchant/billing/gateways/pac_net_raven.rb +207 -0
  122. data/lib/active_merchant/billing/gateways/pago_facil.rb +122 -0
  123. data/lib/active_merchant/billing/gateways/pay_conex.rb +246 -0
  124. data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +277 -0
  125. data/lib/active_merchant/billing/gateways/pay_hub.rb +213 -0
  126. data/lib/active_merchant/billing/gateways/pay_junction.rb +390 -0
  127. data/lib/active_merchant/billing/gateways/pay_secure.rb +112 -0
  128. data/lib/active_merchant/billing/gateways/paybox_direct.rb +188 -0
  129. data/lib/active_merchant/billing/gateways/payex.rb +412 -0
  130. data/lib/active_merchant/billing/gateways/payflow.rb +308 -0
  131. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +220 -0
  132. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +39 -0
  133. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
  134. data/lib/active_merchant/billing/gateways/payflow_express.rb +224 -0
  135. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +15 -0
  136. data/lib/active_merchant/billing/gateways/payflow_uk.rb +21 -0
  137. data/lib/active_merchant/billing/gateways/payment_express.rb +353 -0
  138. data/lib/active_merchant/billing/gateways/paymill.rb +282 -0
  139. data/lib/active_merchant/billing/gateways/paypal.rb +129 -0
  140. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +679 -0
  141. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +65 -0
  142. data/lib/active_merchant/billing/gateways/paypal/paypal_recurring_api.rb +262 -0
  143. data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
  144. data/lib/active_merchant/billing/gateways/paypal_digital_goods.rb +44 -0
  145. data/lib/active_merchant/billing/gateways/paypal_express.rb +264 -0
  146. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +30 -0
  147. data/lib/active_merchant/billing/gateways/payscout.rb +162 -0
  148. data/lib/active_merchant/billing/gateways/paystation.rb +199 -0
  149. data/lib/active_merchant/billing/gateways/payu_in.rb +247 -0
  150. data/lib/active_merchant/billing/gateways/payway.rb +207 -0
  151. data/lib/active_merchant/billing/gateways/pin.rb +207 -0
  152. data/lib/active_merchant/billing/gateways/plugnpay.rb +283 -0
  153. data/lib/active_merchant/billing/gateways/psigate.rb +216 -0
  154. data/lib/active_merchant/billing/gateways/psl_card.rb +303 -0
  155. data/lib/active_merchant/billing/gateways/qbms.rb +292 -0
  156. data/lib/active_merchant/billing/gateways/quantum.rb +276 -0
  157. data/lib/active_merchant/billing/gateways/quickbooks.rb +280 -0
  158. data/lib/active_merchant/billing/gateways/quickpay.rb +26 -0
  159. data/lib/active_merchant/billing/gateways/quickpay/quickpay_common.rb +188 -0
  160. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb +240 -0
  161. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v4to7.rb +227 -0
  162. data/lib/active_merchant/billing/gateways/qvalent.rb +179 -0
  163. data/lib/active_merchant/billing/gateways/realex.rb +298 -0
  164. data/lib/active_merchant/billing/gateways/redsys.rb +406 -0
  165. data/lib/active_merchant/billing/gateways/s5.rb +226 -0
  166. data/lib/active_merchant/billing/gateways/sage.rb +173 -0
  167. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +89 -0
  168. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +115 -0
  169. data/lib/active_merchant/billing/gateways/sage/sage_vault.rb +149 -0
  170. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +97 -0
  171. data/lib/active_merchant/billing/gateways/sage_pay.rb +399 -0
  172. data/lib/active_merchant/billing/gateways/sallie_mae.rb +143 -0
  173. data/lib/active_merchant/billing/gateways/secure_net.rb +263 -0
  174. data/lib/active_merchant/billing/gateways/secure_pay.rb +201 -0
  175. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +281 -0
  176. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +105 -0
  177. data/lib/active_merchant/billing/gateways/skip_jack.rb +451 -0
  178. data/lib/active_merchant/billing/gateways/smart_ps.rb +283 -0
  179. data/lib/active_merchant/billing/gateways/so_easy_pay.rb +194 -0
  180. data/lib/active_merchant/billing/gateways/spreedly_core.rb +247 -0
  181. data/lib/active_merchant/billing/gateways/stripe.rb +489 -0
  182. data/lib/active_merchant/billing/gateways/swipe_checkout.rb +157 -0
  183. data/lib/active_merchant/billing/gateways/tns.rb +227 -0
  184. data/lib/active_merchant/billing/gateways/trans_first.rb +126 -0
  185. data/lib/active_merchant/billing/gateways/transax.rb +23 -0
  186. data/lib/active_merchant/billing/gateways/transnational.rb +10 -0
  187. data/lib/active_merchant/billing/gateways/trust_commerce.rb +416 -0
  188. data/lib/active_merchant/billing/gateways/usa_epay.rb +25 -0
  189. data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +1516 -0
  190. data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +259 -0
  191. data/lib/active_merchant/billing/gateways/vanco.rb +280 -0
  192. data/lib/active_merchant/billing/gateways/verifi.rb +225 -0
  193. data/lib/active_merchant/billing/gateways/viaklix.rb +183 -0
  194. data/lib/active_merchant/billing/gateways/webpay.rb +97 -0
  195. data/lib/active_merchant/billing/gateways/wepay.rb +205 -0
  196. data/lib/active_merchant/billing/gateways/wirecard.rb +420 -0
  197. data/lib/active_merchant/billing/gateways/worldpay.rb +331 -0
  198. data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +204 -0
  199. data/lib/active_merchant/billing/gateways/worldpay_us.rb +181 -0
  200. data/lib/active_merchant/billing/model.rb +30 -0
  201. data/lib/active_merchant/billing/network_tokenization_credit_card.rb +24 -0
  202. data/lib/active_merchant/billing/payment_token.rb +21 -0
  203. data/lib/active_merchant/billing/rails.rb +3 -0
  204. data/lib/active_merchant/billing/response.rb +92 -0
  205. data/lib/active_merchant/connection.rb +172 -0
  206. data/lib/active_merchant/country.rb +332 -0
  207. data/lib/active_merchant/empty.rb +20 -0
  208. data/lib/active_merchant/errors.rb +35 -0
  209. data/lib/active_merchant/network_connection_retries.rb +79 -0
  210. data/lib/active_merchant/post_data.rb +24 -0
  211. data/lib/active_merchant/posts_data.rb +84 -0
  212. data/lib/active_merchant/version.rb +3 -0
  213. data/lib/activemerchant.rb +1 -0
  214. data/lib/certs/cacert.pem +3866 -0
  215. data/lib/support/gateway_support.rb +71 -0
  216. data/lib/support/outbound_hosts.rb +28 -0
  217. data/lib/support/ssl_verify.rb +93 -0
  218. metadata +387 -0
@@ -0,0 +1,280 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class QuickbooksGateway < Gateway
4
+ self.test_url = 'https://sandbox.api.intuit.com'
5
+ self.live_url = 'https://api.intuit.com'
6
+
7
+ self.supported_countries = ['US']
8
+ self.default_currency = 'USD'
9
+ self.supported_cardtypes = [:visa, :master, :american_express, :discover, :diners]
10
+
11
+ self.homepage_url = 'http://payments.intuit.com'
12
+ self.display_name = 'QuickBooks Payments'
13
+ ENDPOINT = "/quickbooks/v4/payments/charges"
14
+ OAUTH_ENDPOINTS = {
15
+ site: 'https://oauth.intuit.com',
16
+ request_token_path: '/oauth/v1/get_request_token',
17
+ authorize_url: 'https://appcenter.intuit.com/Connect/Begin',
18
+ access_token_path: '/oauth/v1/get_access_token'
19
+ }
20
+
21
+ # https://developer.intuit.com/docs/0150_payments/0300_developer_guides/error_handling
22
+
23
+ STANDARD_ERROR_CODE_MAPPING = {
24
+ # Fraud Warnings
25
+ 'PMT-1000' => STANDARD_ERROR_CODE[:processing_error], # payment was accepted, but refund was unsuccessful
26
+ 'PMT-1001' => STANDARD_ERROR_CODE[:invalid_cvc], # payment processed, but cvc was invalid
27
+ 'PMT-1002' => STANDARD_ERROR_CODE[:incorrect_address], # payment processed, incorrect address info
28
+ 'PMT-1003' => STANDARD_ERROR_CODE[:processing_error], # payment processed, address info couldn't be validated
29
+
30
+ # Fraud Errors
31
+ 'PMT-2000' => STANDARD_ERROR_CODE[:incorrect_cvc], # Incorrect CVC
32
+ 'PMT-2001' => STANDARD_ERROR_CODE[:invalid_cvc], # CVC check unavaliable
33
+ 'PMT-2002' => STANDARD_ERROR_CODE[:incorrect_address], # Incorrect address
34
+ 'PMT-2003' => STANDARD_ERROR_CODE[:incorrect_address], # Address info unavailable
35
+
36
+ 'PMT-3000' => STANDARD_ERROR_CODE[:processing_error], # Merchant account could not be validated
37
+
38
+ # Invalid Request
39
+ 'PMT-4000' => STANDARD_ERROR_CODE[:processing_error], # Object is invalid
40
+ 'PMT-4001' => STANDARD_ERROR_CODE[:processing_error], # Object not found
41
+ 'PMT-4002' => STANDARD_ERROR_CODE[:processing_error], # Object is required
42
+
43
+ # Transaction Declined
44
+ 'PMT-5000' => STANDARD_ERROR_CODE[:card_declined], # Request was declined
45
+ 'PMT-5001' => STANDARD_ERROR_CODE[:card_declined], # Merchant does not support given payment method
46
+
47
+ # System Error
48
+ 'PMT-6000' => STANDARD_ERROR_CODE[:processing_error], # A temporary Issue prevented this request from being processed.
49
+ }
50
+
51
+ FRAUD_WARNING_CODES = ['PMT-1000','PMT-1001','PMT-1002','PMT-1003']
52
+
53
+ def initialize(options = {})
54
+ requires!(options, :consumer_key, :consumer_secret, :access_token, :token_secret, :realm)
55
+ @options = options
56
+ super
57
+ end
58
+
59
+ def purchase(money, payment, options = {})
60
+ post = {}
61
+ add_amount(post, money, options)
62
+ add_charge_data(post, payment, options)
63
+ post[:capture] = "true"
64
+
65
+ commit(ENDPOINT, post)
66
+ end
67
+
68
+ def authorize(money, payment, options = {})
69
+ post = {}
70
+ add_amount(post, money, options)
71
+ add_charge_data(post, payment, options)
72
+ post[:capture] = "false"
73
+
74
+ commit(ENDPOINT, post)
75
+ end
76
+
77
+ def capture(money, authorization, options = {})
78
+ post = {}
79
+ capture_uri = "#{ENDPOINT}/#{CGI.escape(authorization)}/capture"
80
+ post[:amount] = localized_amount(money, currency(money))
81
+
82
+ commit(capture_uri, post)
83
+ end
84
+
85
+ def refund(money, authorization, options = {})
86
+ post = {}
87
+ post[:amount] = localized_amount(money, currency(money))
88
+
89
+ commit(refund_uri(authorization), post)
90
+ end
91
+
92
+ def verify(credit_card, options = {})
93
+ authorize(1.00, credit_card, options)
94
+ end
95
+
96
+ def supports_scrubbing?
97
+ true
98
+ end
99
+
100
+ def scrub(transcript)
101
+ transcript.
102
+ gsub(%r((realm=\")\w+), '\1[FILTERED]').
103
+ gsub(%r((oauth_consumer_key=\")\w+), '\1[FILTERED]').
104
+ gsub(%r((oauth_nonce=\")\w+), '\1[FILTERED]').
105
+ gsub(%r((oauth_signature=\")[a-zA-Z%0-9]+), '\1[FILTERED]').
106
+ gsub(%r((oauth_token=\")\w+), '\1[FILTERED]').
107
+ gsub(%r((number\D+)\d{16}), '\1[FILTERED]').
108
+ gsub(%r((cvc\D+)\d{3}), '\1[FILTERED]')
109
+ end
110
+
111
+ private
112
+
113
+ def add_charge_data(post, payment, options = {})
114
+ add_payment(post, payment, options)
115
+ add_address(post, options)
116
+ end
117
+
118
+ def add_address(post, options)
119
+ return unless post[:card] && post[:card].kind_of?(Hash)
120
+
121
+ card_address = {}
122
+ if address = options[:billing_address] || options[:address]
123
+ card_address[:streetAddress] = address[:address1]
124
+ card_address[:city] = address[:city]
125
+ card_address[:region] = address[:state] || address[:region]
126
+ card_address[:country] = address[:country]
127
+ card_address[:postalCode] = address[:zip] if address[:zip]
128
+ end
129
+ post[:card][:address] = card_address
130
+ end
131
+
132
+ def add_amount(post, money, options = {})
133
+ currency = options[:currency] || currency(money)
134
+ post[:amount] = localized_amount(money, currency)
135
+ post[:currency] = currency.upcase
136
+ end
137
+
138
+ def add_payment(post, payment, options = {})
139
+ add_creditcard(post, payment, options)
140
+ end
141
+
142
+ def add_creditcard(post, creditcard, options = {})
143
+ card = {}
144
+ card[:number] = creditcard.number
145
+ card[:expMonth] = "%02d" % creditcard.month
146
+ card[:expYear] = creditcard.year
147
+ card[:cvc] = creditcard.verification_value if creditcard.verification_value?
148
+ card[:name] = creditcard.name if creditcard.name
149
+ card[:commercialCardCode] = options[:card_code] if options[:card_code]
150
+
151
+ post[:card] = card
152
+ end
153
+
154
+ def parse(body)
155
+ JSON.parse(body)
156
+ end
157
+
158
+ def commit(uri, body = {}, method = :post)
159
+ endpoint = gateway_url + uri
160
+ # The QuickBooks API returns HTTP 4xx on failed transactions, which causes a
161
+ # ResponseError raise, so we have to inspect the response and discern between
162
+ # a legitimate HTTP error and an actual gateway transactional error.
163
+ response = begin
164
+ case method
165
+ when :post
166
+ ssl_post(endpoint, post_data(body), headers(:post, endpoint))
167
+ when :get
168
+ ssl_request(:get, endpoint, nil, headers(:get, endpoint))
169
+ else
170
+ raise ArgumentError, "Invalid HTTP method: #{method}. Valid methods are :post and :get"
171
+ end
172
+ rescue ResponseError => e
173
+ extract_response_body_or_raise(e)
174
+ end
175
+
176
+ response_object(response)
177
+ end
178
+
179
+ def response_object(raw_response)
180
+ parsed_response = parse(raw_response)
181
+
182
+ Response.new(
183
+ success?(parsed_response),
184
+ message_from(parsed_response),
185
+ parsed_response,
186
+ authorization: authorization_from(parsed_response),
187
+ test: test?,
188
+ cvv_result: cvv_code_from(parsed_response),
189
+ error_code: errors_from(parsed_response),
190
+ fraud_review: fraud_review_status_from(parsed_response)
191
+ )
192
+ end
193
+
194
+ def gateway_url
195
+ test? ? test_url : live_url
196
+ end
197
+
198
+ def post_data(data = {})
199
+ data.to_json
200
+ end
201
+
202
+ def headers(method, uri)
203
+ raise ArgumentError, "Invalid HTTP method: #{method}. Valid methods are :post and :get" unless [:post, :get].include?(method)
204
+ request_uri = URI.parse(uri)
205
+
206
+ # Following the guidelines from http://nouncer.com/oauth/authentication.html
207
+ oauth_parameters = {
208
+ oauth_nonce: generate_unique_id,
209
+ oauth_timestamp: Time.now.to_i.to_s,
210
+ oauth_signature_method: 'HMAC-SHA1',
211
+ oauth_version: "1.0",
212
+ oauth_consumer_key: @options[:consumer_key],
213
+ oauth_token: @options[:access_token]
214
+ }
215
+
216
+ # prepare components for signature
217
+ oauth_signature_base_string = [method.to_s.upcase, request_uri.to_s, oauth_parameters.to_param].map{|v| CGI.escape(v) }.join('&')
218
+ oauth_signing_key = [@options[:consumer_secret], @options[:token_secret]].map{|v| CGI.escape(v)}.join('&')
219
+ hmac_signature = OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha1'), oauth_signing_key, oauth_signature_base_string)
220
+
221
+ # append signature to required OAuth parameters
222
+ oauth_parameters[:oauth_signature] = CGI.escape(Base64.encode64(hmac_signature).chomp.gsub(/\n/, ''))
223
+
224
+ # prepare Authorization header string
225
+ oauth_parameters = Hash[oauth_parameters.sort_by {|k, _| k}]
226
+ oauth_headers = ["OAuth realm=\"#{@options[:realm]}\""]
227
+ oauth_headers += oauth_parameters.map {|k, v| "#{k}=\"#{v}\""}
228
+
229
+ {
230
+ "Content-type" => "application/json",
231
+ "Request-Id" => generate_unique_id,
232
+ "Authorization" => oauth_headers.join(', ')
233
+ }
234
+ end
235
+
236
+ def cvv_code_from(response)
237
+ if response['errors'].present?
238
+ FRAUD_WARNING_CODES.include?(response['errors'].first['code']) ? 'I' : ''
239
+ else
240
+ success?(response) ? 'M' : ''
241
+ end
242
+ end
243
+
244
+ def success?(response)
245
+ return FRAUD_WARNING_CODES.concat(['0']).include?(response['errors'].first['code']) if response['errors']
246
+
247
+ !['DECLINED', 'CANCELLED'].include?(response['status'])
248
+ end
249
+
250
+ def message_from(response)
251
+ response['errors'].present? ? response["errors"].map {|error_hash| error_hash["message"] }.join(" ") : response['status']
252
+ end
253
+
254
+ def errors_from(response)
255
+ response['errors'].present? ? STANDARD_ERROR_CODE_MAPPING[response["errors"].first["code"]] : ""
256
+ end
257
+
258
+ def authorization_from(response)
259
+ response['id']
260
+ end
261
+
262
+ def fraud_review_status_from(response)
263
+ response['errors'] && FRAUD_WARNING_CODES.include?(response['errors'].first['code'])
264
+ end
265
+
266
+ def extract_response_body_or_raise(response_error)
267
+ begin
268
+ parse(response_error.response.body)
269
+ rescue JSON::ParserError
270
+ raise response_error
271
+ end
272
+ response_error.response.body
273
+ end
274
+
275
+ def refund_uri(authorization)
276
+ "#{ENDPOINT}/#{CGI.escape(authorization)}/refunds"
277
+ end
278
+ end
279
+ end
280
+ end
@@ -0,0 +1,26 @@
1
+ require 'rexml/document'
2
+ require 'digest/md5'
3
+
4
+ require 'active_merchant/billing/gateways/quickpay/quickpay_v10'
5
+ require 'active_merchant/billing/gateways/quickpay/quickpay_v4to7'
6
+
7
+ module ActiveMerchant #:nodoc:
8
+ module Billing #:nodoc:
9
+ class QuickpayGateway < Gateway
10
+ self.abstract_class = true
11
+
12
+ def self.new(options = {})
13
+ options.fetch(:login) rescue raise ArgumentError.new("Missing required parameter: login")
14
+
15
+ version = options[:login].to_i < 10000000 ? 10 : 7
16
+ if version <= 7
17
+ QuickpayV4to7Gateway.new(options)
18
+ else
19
+ QuickpayV10Gateway.new(options)
20
+ end
21
+ end
22
+
23
+ end
24
+ end
25
+ end
26
+
@@ -0,0 +1,188 @@
1
+
2
+ module QuickpayCommon
3
+
4
+ MD5_CHECK_FIELDS = {
5
+ 3 => {
6
+ :authorize => %w(protocol msgtype merchant ordernumber amount
7
+ currency autocapture cardnumber expirationdate
8
+ cvd cardtypelock testmode),
9
+
10
+ :capture => %w(protocol msgtype merchant amount finalize transaction),
11
+
12
+ :cancel => %w(protocol msgtype merchant transaction),
13
+
14
+ :refund => %w(protocol msgtype merchant amount transaction),
15
+
16
+ :subscribe => %w(protocol msgtype merchant ordernumber cardnumber
17
+ expirationdate cvd cardtypelock description testmode),
18
+
19
+ :recurring => %w(protocol msgtype merchant ordernumber amount
20
+ currency autocapture transaction),
21
+
22
+ :status => %w(protocol msgtype merchant transaction),
23
+
24
+ :chstatus => %w(protocol msgtype merchant)
25
+ },
26
+
27
+ 4 => {
28
+ :authorize => %w(protocol msgtype merchant ordernumber amount
29
+ currency autocapture cardnumber expirationdate cvd
30
+ cardtypelock testmode fraud_remote_addr
31
+ fraud_http_accept fraud_http_accept_language
32
+ fraud_http_accept_encoding fraud_http_accept_charset
33
+ fraud_http_referer fraud_http_user_agent apikey),
34
+
35
+ :capture => %w(protocol msgtype merchant amount finalize transaction apikey),
36
+
37
+ :cancel => %w(protocol msgtype merchant transaction apikey),
38
+
39
+ :refund => %w(protocol msgtype merchant amount transaction apikey),
40
+
41
+ :subscribe => %w(protocol msgtype merchant ordernumber cardnumber
42
+ expirationdate cvd cardtypelock description testmode
43
+ fraud_remote_addr fraud_http_accept fraud_http_accept_language
44
+ fraud_http_accept_encoding fraud_http_accept_charset
45
+ fraud_http_referer fraud_http_user_agent apikey),
46
+
47
+ :recurring => %w(protocol msgtype merchant ordernumber amount currency
48
+ autocapture transaction apikey),
49
+
50
+ :status => %w(protocol msgtype merchant transaction apikey),
51
+
52
+ :chstatus => %w(protocol msgtype merchant apikey)
53
+ },
54
+
55
+ 5 => {
56
+ :authorize => %w(protocol msgtype merchant ordernumber amount
57
+ currency autocapture cardnumber expirationdate cvd
58
+ cardtypelock testmode fraud_remote_addr
59
+ fraud_http_accept fraud_http_accept_language
60
+ fraud_http_accept_encoding fraud_http_accept_charset
61
+ fraud_http_referer fraud_http_user_agent apikey),
62
+
63
+ :capture => %w(protocol msgtype merchant amount finalize transaction apikey),
64
+
65
+ :cancel => %w(protocol msgtype merchant transaction apikey),
66
+
67
+ :refund => %w(protocol msgtype merchant amount transaction apikey),
68
+
69
+ :subscribe => %w(protocol msgtype merchant ordernumber cardnumber
70
+ expirationdate cvd cardtypelock description testmode
71
+ fraud_remote_addr fraud_http_accept fraud_http_accept_language
72
+ fraud_http_accept_encoding fraud_http_accept_charset
73
+ fraud_http_referer fraud_http_user_agent apikey),
74
+
75
+ :recurring => %w(protocol msgtype merchant ordernumber amount currency
76
+ autocapture transaction apikey),
77
+
78
+ :status => %w(protocol msgtype merchant transaction apikey),
79
+
80
+ :chstatus => %w(protocol msgtype merchant apikey)
81
+ },
82
+
83
+ 6 => {
84
+ :authorize => %w(protocol msgtype merchant ordernumber amount
85
+ currency autocapture cardnumber expirationdate cvd
86
+ cardtypelock testmode fraud_remote_addr
87
+ fraud_http_accept fraud_http_accept_language
88
+ fraud_http_accept_encoding fraud_http_accept_charset
89
+ fraud_http_referer fraud_http_user_agent apikey),
90
+
91
+ :capture => %w(protocol msgtype merchant amount finalize transaction
92
+ apikey),
93
+
94
+ :cancel => %w(protocol msgtype merchant transaction apikey),
95
+
96
+ :refund => %w(protocol msgtype merchant amount transaction apikey),
97
+
98
+ :subscribe => %w(protocol msgtype merchant ordernumber cardnumber
99
+ expirationdate cvd cardtypelock description testmode
100
+ fraud_remote_addr fraud_http_accept fraud_http_accept_language
101
+ fraud_http_accept_encoding fraud_http_accept_charset
102
+ fraud_http_referer fraud_http_user_agent apikey),
103
+
104
+ :recurring => %w(protocol msgtype merchant ordernumber amount currency
105
+ autocapture transaction apikey),
106
+
107
+ :status => %w(protocol msgtype merchant transaction apikey),
108
+
109
+ :chstatus => %w(protocol msgtype merchant apikey)
110
+ },
111
+
112
+ 7 => {
113
+ :authorize => %w(protocol msgtype merchant ordernumber amount
114
+ currency autocapture cardnumber expirationdate cvd
115
+ acquirers cardtypelock testmode fraud_remote_addr
116
+ fraud_http_accept fraud_http_accept_language
117
+ fraud_http_accept_encoding fraud_http_accept_charset
118
+ fraud_http_referer fraud_http_user_agent apikey),
119
+
120
+ :capture => %w(protocol msgtype merchant amount finalize transaction
121
+ apikey),
122
+
123
+ :cancel => %w(protocol msgtype merchant transaction apikey),
124
+
125
+ :refund => %w(protocol msgtype merchant amount transaction apikey),
126
+
127
+ :subscribe => %w(protocol msgtype merchant ordernumber amount currency
128
+ cardnumber expirationdate cvd acquirers cardtypelock
129
+ description testmode fraud_remote_addr fraud_http_accept
130
+ fraud_http_accept_language fraud_http_accept_encoding
131
+ fraud_http_accept_charset fraud_http_referer
132
+ fraud_http_user_agent apikey),
133
+
134
+ :recurring => %w(protocol msgtype merchant ordernumber amount currency
135
+ autocapture transaction apikey),
136
+
137
+ :status => %w(protocol msgtype merchant transaction apikey),
138
+
139
+ :chstatus => %w(protocol msgtype merchant apikey)
140
+ },
141
+
142
+ 10 => {
143
+ :authorize => %w(mobile_number acquirer autofee customer_id extras
144
+ zero_auth),
145
+ :capture => %w( extras ),
146
+ :cancel => %w( extras ),
147
+ :refund => %w( extras ),
148
+ :subscribe => %w( variables branding_id),
149
+ :authorize_subscription => %w( mobile_number acquirer customer_ip),
150
+ :recurring => %w(auto_capture autofee zero_auth)
151
+ }
152
+ }
153
+
154
+ RESPONSE_CODES = {
155
+ 200 => 'OK',
156
+ 201 => 'Created',
157
+ 202 => 'Accepted',
158
+ 400 => 'Bad Request',
159
+ 401 => 'UnAuthorized',
160
+ 402 => 'Payment Required',
161
+ 403 => 'Forbidden',
162
+ 404 => 'Not Found',
163
+ 405 => 'Method Not Allowed',
164
+ 406 => 'Not Acceptable',
165
+ 409 => 'Conflict',
166
+ 500 => 'Internal Server Error'
167
+ }
168
+
169
+ def self.included(base)
170
+ base.default_currency = 'DKK'
171
+ base.money_format = :cents
172
+
173
+ base.supported_cardtypes = [:dankort, :forbrugsforeningen, :visa, :master,
174
+ :american_express, :diners_club, :jcb, :maestro]
175
+ base.supported_countries = ['DE', 'DK', 'ES', 'FI', 'FR', 'FO', 'GB', 'IS', 'NO', 'SE']
176
+ base.homepage_url = 'http://quickpay.net/'
177
+ base.display_name = 'QuickPay'
178
+
179
+ end
180
+
181
+ def expdate(credit_card)
182
+ year = format(credit_card.year, :two_digits)
183
+ month = format(credit_card.month, :two_digits)
184
+
185
+ "#{year}#{month}"
186
+ end
187
+
188
+ end