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,160 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class FederatedCanadaGateway < Gateway
4
+ # Same URL for both test and live, testing is done by using the test username (demo) and password (password).
5
+ self.live_url = self.test_url = 'https://secure.federatedgateway.com/api/transact.php'
6
+
7
+ APPROVED, DECLINED, ERROR = 1, 2, 3
8
+
9
+ # The countries the gateway supports merchants from as 2 digit ISO country codes
10
+ self.supported_countries = ['CA']
11
+
12
+ self.default_currency = 'CAD'
13
+
14
+ # The card types supported by the payment gateway
15
+ self.supported_cardtypes = [:visa, :master, :american_express, :discover]
16
+
17
+ # The homepage URL of the gateway
18
+ self.homepage_url = 'http://www.federatedcanada.com/'
19
+
20
+ # The name of the gateway
21
+ self.display_name = 'Federated Canada'
22
+
23
+ def initialize(options = {})
24
+ requires!(options, :login, :password)
25
+ super
26
+ end
27
+
28
+ def purchase(money, creditcard, options = {})
29
+ post = {}
30
+ add_invoice(post, options)
31
+ add_creditcard(post, creditcard)
32
+ add_address(post, options)
33
+ add_customer_data(post, options)
34
+ commit('sale', money, post)
35
+ end
36
+
37
+ def authorize(money, creditcard, options = {})
38
+ post = {}
39
+ add_invoice(post, options)
40
+ add_creditcard(post, creditcard)
41
+ add_address(post, options)
42
+ add_customer_data(post, options)
43
+ commit('auth', money, post)
44
+ end
45
+
46
+ def capture(money, authorization, options = {})
47
+ options[:transactionid] = authorization
48
+ commit('capture', money, options)
49
+ end
50
+
51
+ def void(authorization, options = {})
52
+ options[:transactionid] = authorization
53
+ commit('void', nil, options)
54
+ end
55
+
56
+ def refund(money, authorization, options = {})
57
+ commit('refund', money, options.merge(:transactionid => authorization))
58
+ end
59
+
60
+ def credit(money, authorization, options = {})
61
+ ActiveMerchant.deprecated CREDIT_DEPRECATION_MESSAGE
62
+ refund(money, authorization, options)
63
+ end
64
+
65
+ private
66
+
67
+ def add_customer_data(post, options)
68
+ post[:firstname] = options[:first_name]
69
+ post[:lastname] = options[:last_name]
70
+
71
+ post[:email] = options[:email]
72
+ end
73
+
74
+ def add_address(post, options)
75
+ if address = (options[:billing_address] || options[:address])
76
+ post[:company] = address[:company]
77
+ post[:address1] = address[:address1]
78
+ post[:address2] = address[:address2]
79
+ post[:city] = address[:city]
80
+ post[:state] = address[:state]
81
+ post[:zip] = address[:zip]
82
+ post[:country] = address[:country]
83
+ post[:phone] = address[:phone]
84
+ end
85
+ if address = options[:shipping_address]
86
+ post[:shipping_firstname] = address[:first_name]
87
+ post[:shipping_lastname] = address[:last_name]
88
+ post[:shipping_company] = address[:company]
89
+ post[:shipping_address1] = address[:address1]
90
+ post[:shipping_address2] = address[:address2]
91
+ post[:shipping_city] = address[:city]
92
+ post[:shipping_state] = address[:state]
93
+ post[:shipping_zip] = address[:zip]
94
+ post[:shipping_country] = address[:country]
95
+ post[:shipping_email] = address[:email]
96
+ end
97
+ end
98
+
99
+ def add_invoice(post, options)
100
+ post[:orderid] = options[:order_id]
101
+ post[:orderdescription] = options[:description]
102
+ end
103
+
104
+ def add_creditcard(post, creditcard)
105
+ post[:ccnumber] = creditcard.number
106
+ post[:ccexp] = expdate(creditcard)
107
+ post[:cvv] = creditcard.verification_value
108
+ end
109
+
110
+ def parse(body)
111
+ body.split('&').inject({}) do |memo, x|
112
+ k, v = x.split('=')
113
+ memo[k] = v
114
+ memo
115
+ end
116
+ end
117
+
118
+ def commit(action, money, parameters)
119
+ parameters[:amount] = amount(money)
120
+ data = ssl_post(self.live_url, post_data(action, parameters))
121
+ response = parse(data)
122
+ message = message_from(response)
123
+
124
+ Response.new(success?(response), message, response,
125
+ :test => test?,
126
+ :authorization => response['transactionid'],
127
+ :avs_result => {:code => response['avsresponse']},
128
+ :cvv_result => response['cvvresponse']
129
+ )
130
+ end
131
+
132
+ def success?(response)
133
+ response['response'] == '1'
134
+ end
135
+
136
+ def test?
137
+ (@options[:login].eql?('demo')) && (@options[:password].eql?('password'))
138
+ end
139
+
140
+ def message_from(response)
141
+ case response['response'].to_i
142
+ when APPROVED
143
+ "Transaction Approved"
144
+ when DECLINED
145
+ "Transaction Declined"
146
+ else
147
+ "Error in transaction data or system error"
148
+ end
149
+ end
150
+
151
+ def post_data(action, parameters = {})
152
+ parameters[:type] = action
153
+ parameters[:username] = @options[:login]
154
+ parameters[:password] = @options[:password]
155
+ parameters.map{|k, v| "#{k}=#{CGI.escape(v.to_s)}"}.join('&')
156
+ end
157
+ end
158
+ end
159
+ end
160
+
@@ -0,0 +1,23 @@
1
+ require 'active_merchant/billing/gateways/cc5'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ class FinansbankGateway < CC5Gateway
6
+ self.live_url = 'https://www.fbwebpos.com/servlet/cc5ApiServer'
7
+ self.test_url = 'https://entegrasyon.asseco-see.com.tr/fim/api'
8
+
9
+ # The countries the gateway supports merchants from as 2 digit ISO country codes
10
+ self.supported_countries = ['US', 'TR']
11
+
12
+ # The card types supported by the payment gateway
13
+ self.supported_cardtypes = [:visa, :master]
14
+
15
+ # The homepage URL of the gateway
16
+ self.homepage_url = 'https://www.fbwebpos.com/'
17
+
18
+ # The name of the gateway
19
+ self.display_name = 'Finansbank WebPOS'
20
+ end
21
+ end
22
+ end
23
+
@@ -0,0 +1,143 @@
1
+ require 'nokogiri'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ class FirstGivingGateway < Gateway
6
+ self.test_url = 'http://usapisandbox.fgdev.net'
7
+ self.live_url = 'https://api.firstgiving.com'
8
+
9
+ self.supported_countries = ['US']
10
+ self.supported_cardtypes = [:visa, :master, :american_express, :discover]
11
+ self.homepage_url = 'http://www.firstgiving.com/'
12
+ self.default_currency = 'USD'
13
+ self.display_name = 'FirstGiving'
14
+
15
+ def initialize(options = {})
16
+ requires!(options, :application_key, :security_token, :charity_id)
17
+ super
18
+ end
19
+
20
+ def purchase(money, creditcard, options = {})
21
+ post = {}
22
+ add_invoice(post, options)
23
+ add_creditcard(post, creditcard)
24
+ add_address(post, options)
25
+ add_customer_data(post, options)
26
+ add_donation_data(post, money, options)
27
+ commit('/donation/creditcard', post)
28
+ end
29
+
30
+ def refund(money, identifier, options = {})
31
+ get = {}
32
+ get[:transactionId] = identifier
33
+ get[:tranType] = 'REFUNDREQUEST'
34
+ commit("/transaction/refundrequest?" + encode(get))
35
+ end
36
+
37
+ private
38
+
39
+ def add_donation_data(post, money, options)
40
+ post[:amount] = amount(money)
41
+ post[:charityId] = @options[:charity_id]
42
+ post[:description] = (options[:description] || "Purchase")
43
+ post[:currencyCode] = (options[:currency] || currency(money))
44
+ end
45
+
46
+ def add_customer_data(post, options)
47
+ post[:billToEmail] = (options[:email] || "activemerchant@example.com")
48
+ post[:remoteAddr] = (options[:ip] || "127.0.0.1")
49
+ end
50
+
51
+ def add_address(post, options)
52
+ if(billing_address = (options[:billing_address] || options[:address]))
53
+ post[:billToAddressLine1] = billing_address[:address1]
54
+ post[:billToCity] = billing_address[:city]
55
+ post[:billToState] = billing_address[:state]
56
+ post[:billToZip] = billing_address[:zip]
57
+ post[:billToCountry] = billing_address[:country]
58
+ end
59
+ end
60
+
61
+ def add_invoice(post, options)
62
+ post[:orderId] = options[:order_id]
63
+ end
64
+
65
+ def add_creditcard(post, creditcard)
66
+ post[:billToFirstName] = creditcard.first_name
67
+ post[:billToLastName] = creditcard.last_name
68
+ post[:ccNumber] = creditcard.number
69
+ post[:ccType] = creditcard_brand(creditcard.brand)
70
+ post[:ccExpDateMonth] = creditcard.month
71
+ post[:ccExpDateYear] = creditcard.year
72
+ post[:ccCardValidationNum] = creditcard.verification_value
73
+ end
74
+
75
+ def parse(body)
76
+ response = {}
77
+
78
+ xml = Nokogiri::XML(body)
79
+ element = xml.xpath("//firstGivingDonationApi/firstGivingResponse").first
80
+
81
+ element.attributes.each do |name, attribute|
82
+ response[name] = attribute.content
83
+ end
84
+ element.children.each do |child|
85
+ next if child.text?
86
+ response[child.name] = child.text
87
+ end
88
+
89
+ response
90
+ end
91
+
92
+ def commit(action, post=nil)
93
+ url = (test? ? self.test_url : self.live_url) + action
94
+
95
+ begin
96
+ if post
97
+ response = parse(ssl_post(url, post_data(post), headers))
98
+ else
99
+ response = parse(ssl_get(url, headers))
100
+ end
101
+ rescue ResponseError => e
102
+ response = parse(e.response.body)
103
+ end
104
+
105
+ Response.new(
106
+ (response["acknowledgement"] == "Success"),
107
+ (response["friendlyErrorMessage"] || response["verboseErrorMessage"] || response["acknowledgement"]),
108
+ response,
109
+ authorization: response["transactionId"],
110
+ test: test?,
111
+ )
112
+ end
113
+
114
+ def post_data(post)
115
+ post.collect { |key, value| "#{key}=#{CGI.escape(value.to_s)}" }.join("&")
116
+ end
117
+
118
+ def encode(hash)
119
+ hash.collect{|(k,v)| "#{CGI.escape(k.to_s)}=#{CGI.escape(v.to_s)}"}.join('&')
120
+ end
121
+
122
+ def creditcard_brand(brand)
123
+ case brand
124
+ when "visa" then "VI"
125
+ when "master" then "MC"
126
+ when "discover" then "DI"
127
+ when "american_express" then "AX"
128
+ else
129
+ raise "Unhandled credit card brand #{brand}"
130
+ end
131
+ end
132
+
133
+ def headers
134
+ {
135
+ "User-Agent" => "ActiveMerchantBindings/#{ActiveMerchant::VERSION}",
136
+ "JG_APPLICATIONKEY" => "#{@options[:application_key]}",
137
+ "JG_SECURITYTOKEN" => "#{@options[:security_token]}"
138
+ }
139
+ end
140
+ end
141
+ end
142
+ end
143
+
@@ -0,0 +1,160 @@
1
+ require 'nokogiri'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ class FirstPayGateway < Gateway
6
+ self.live_url = 'https://secure.1stpaygateway.net/secure/gateway/xmlgateway.aspx'
7
+
8
+ self.supported_countries = ['US']
9
+ self.default_currency = 'USD'
10
+ self.money_format = :dollars
11
+ self.supported_cardtypes = [:visa, :master, :american_express, :discover]
12
+
13
+ self.homepage_url = 'http://1stpaygateway.net/'
14
+ self.display_name = '1stPayGateway.Net'
15
+
16
+ def initialize(options={})
17
+ requires!(options, :transaction_center_id, :gateway_id)
18
+ super
19
+ end
20
+
21
+ def purchase(money, payment, options={})
22
+ post = {}
23
+ add_invoice(post, money, options)
24
+ add_payment(post, payment)
25
+ add_address(post, payment, options)
26
+ add_customer_data(post, options)
27
+
28
+ commit('sale', post)
29
+ end
30
+
31
+ def authorize(money, payment, options={})
32
+ post = {}
33
+ add_invoice(post, money, options)
34
+ add_payment(post, payment)
35
+ add_address(post, payment, options)
36
+ add_customer_data(post, options)
37
+
38
+ commit('auth', post)
39
+ end
40
+
41
+ def capture(money, authorization, options={})
42
+ post = {}
43
+ add_reference(post, 'settle', money, authorization)
44
+ commit('settle', post)
45
+ end
46
+
47
+ def refund(money, authorization, options={})
48
+ post = {}
49
+ add_reference(post, 'credit', money, authorization)
50
+ commit('credit', post)
51
+ end
52
+
53
+ def void(authorization, options={})
54
+ post = {}
55
+ add_reference(post, 'void', nil, authorization)
56
+ commit('void', post)
57
+ end
58
+
59
+ private
60
+
61
+ def add_authentication(post, options)
62
+ post[:transaction_center_id] = options[:transaction_center_id]
63
+ post[:gateway_id] = options[:gateway_id]
64
+ end
65
+
66
+ def add_customer_data(post, options)
67
+ post[:owner_email] = options[:email] if options[:email]
68
+ post[:remote_ip_address] = options[:ip] if options[:ip]
69
+ end
70
+
71
+ def add_address(post, creditcard, options)
72
+ address = options[:billing_address] || options[:address]
73
+ post[:owner_name] = address[:name]
74
+ post[:owner_street] = address[:address1]
75
+ post[:owner_street2] = address[:address2] if address[:address2]
76
+ post[:owner_city] = address[:city]
77
+ post[:owner_state] = address[:state]
78
+ post[:owner_zip] = address[:zip]
79
+ post[:owner_country] = address[:country]
80
+ post[:owner_phone] = address[:phone] if address[:phone]
81
+ end
82
+
83
+ def add_invoice(post, money, options)
84
+ post[:order_id] = options[:order_id]
85
+ post[:total] = amount(money)
86
+ end
87
+
88
+ def add_payment(post, payment)
89
+ post[:card_name] = payment.brand # Unclear if need to map to known names or open text field??
90
+ post[:card_number] = payment.number
91
+ post[:card_exp] = expdate(payment)
92
+ post[:cvv2] = payment.verification_value
93
+ end
94
+
95
+ def add_reference(post, action, money, authorization)
96
+ post[:"#{action}_amount1"] = amount(money) if money
97
+ post[:total_number_transactions] = 1
98
+ post[:reference_number1] = authorization
99
+ end
100
+
101
+ def parse(xml)
102
+ response = {}
103
+
104
+ doc = Nokogiri::XML(xml)
105
+ doc.root.xpath("//RESPONSE/FIELDS/FIELD").each do |field|
106
+ response[field['KEY']] = field.text
107
+ end unless doc.root.nil?
108
+
109
+ response
110
+ end
111
+
112
+ def commit(action, parameters)
113
+ response = parse(ssl_post(live_url, post_data(action, parameters)))
114
+
115
+ Response.new(
116
+ success_from(response),
117
+ message_from(response),
118
+ response,
119
+ authorization: authorization_from(response),
120
+ test: test?
121
+ )
122
+ end
123
+
124
+ def success_from(response)
125
+ (
126
+ (response['status'] == '1') ||
127
+ (response['status1'] == '1')
128
+ )
129
+ end
130
+
131
+ def message_from(response)
132
+ # Silly inconsistent gateway. Always make capitalized (but not all caps)
133
+ msg = (response['auth_response'] || response['response1'])
134
+ msg.downcase.capitalize if msg
135
+ end
136
+
137
+ def authorization_from(response)
138
+ response['reference_number'] || response['reference_number1']
139
+ end
140
+
141
+ def post_data(action, parameters = {})
142
+ parameters[:transaction_center_id] = @options[:transaction_center_id]
143
+ parameters[:gateway_id] = @options[:gateway_id]
144
+
145
+ parameters[:operation_type] = action
146
+
147
+ xml = Builder::XmlMarkup.new
148
+ xml.instruct!
149
+ xml.tag! 'TRANSACTION' do
150
+ xml.tag! 'FIELDS' do
151
+ parameters.each do |key, value|
152
+ xml.tag! 'FIELD', value, { 'KEY' => key }
153
+ end
154
+ end
155
+ end
156
+ xml.target!
157
+ end
158
+ end
159
+ end
160
+ end