johnreitano-activemerchant 1.5.2

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 (131) hide show
  1. data/CHANGELOG +508 -0
  2. data/CONTRIBUTORS +134 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.rdoc +136 -0
  5. data/gem-public_cert.pem +20 -0
  6. data/lib/active_merchant/billing/avs_result.rb +98 -0
  7. data/lib/active_merchant/billing/base.rb +57 -0
  8. data/lib/active_merchant/billing/check.rb +68 -0
  9. data/lib/active_merchant/billing/credit_card.rb +159 -0
  10. data/lib/active_merchant/billing/credit_card_formatting.rb +21 -0
  11. data/lib/active_merchant/billing/credit_card_methods.rb +125 -0
  12. data/lib/active_merchant/billing/cvv_result.rb +38 -0
  13. data/lib/active_merchant/billing/expiry_date.rb +34 -0
  14. data/lib/active_merchant/billing/gateway.rb +163 -0
  15. data/lib/active_merchant/billing/gateways/authorize_net.rb +654 -0
  16. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +736 -0
  17. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +244 -0
  18. data/lib/active_merchant/billing/gateways/beanstream.rb +102 -0
  19. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +54 -0
  20. data/lib/active_merchant/billing/gateways/bogus.rb +98 -0
  21. data/lib/active_merchant/billing/gateways/braintree.rb +17 -0
  22. data/lib/active_merchant/billing/gateways/card_stream.rb +230 -0
  23. data/lib/active_merchant/billing/gateways/cyber_source.rb +594 -0
  24. data/lib/active_merchant/billing/gateways/data_cash.rb +593 -0
  25. data/lib/active_merchant/billing/gateways/efsnet.rb +229 -0
  26. data/lib/active_merchant/billing/gateways/elavon.rb +134 -0
  27. data/lib/active_merchant/billing/gateways/eway.rb +277 -0
  28. data/lib/active_merchant/billing/gateways/exact.rb +222 -0
  29. data/lib/active_merchant/billing/gateways/first_pay.rb +172 -0
  30. data/lib/active_merchant/billing/gateways/instapay.rb +164 -0
  31. data/lib/active_merchant/billing/gateways/jetpay.rb +270 -0
  32. data/lib/active_merchant/billing/gateways/linkpoint.rb +449 -0
  33. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +154 -0
  34. data/lib/active_merchant/billing/gateways/merchant_ware.rb +283 -0
  35. data/lib/active_merchant/billing/gateways/modern_payments.rb +36 -0
  36. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +220 -0
  37. data/lib/active_merchant/billing/gateways/moneris.rb +205 -0
  38. data/lib/active_merchant/billing/gateways/net_registry.rb +189 -0
  39. data/lib/active_merchant/billing/gateways/netbilling.rb +168 -0
  40. data/lib/active_merchant/billing/gateways/ogone.rb +279 -0
  41. data/lib/active_merchant/billing/gateways/pay_junction.rb +392 -0
  42. data/lib/active_merchant/billing/gateways/pay_secure.rb +120 -0
  43. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +207 -0
  44. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +39 -0
  45. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
  46. data/lib/active_merchant/billing/gateways/payflow.rb +236 -0
  47. data/lib/active_merchant/billing/gateways/payflow_express.rb +138 -0
  48. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +15 -0
  49. data/lib/active_merchant/billing/gateways/payflow_uk.rb +21 -0
  50. data/lib/active_merchant/billing/gateways/payment_express.rb +230 -0
  51. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +326 -0
  52. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +38 -0
  53. data/lib/active_merchant/billing/gateways/paypal.rb +121 -0
  54. data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
  55. data/lib/active_merchant/billing/gateways/paypal_express.rb +130 -0
  56. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +20 -0
  57. data/lib/active_merchant/billing/gateways/plugnpay.rb +292 -0
  58. data/lib/active_merchant/billing/gateways/psigate.rb +214 -0
  59. data/lib/active_merchant/billing/gateways/psl_card.rb +304 -0
  60. data/lib/active_merchant/billing/gateways/quickpay.rb +213 -0
  61. data/lib/active_merchant/billing/gateways/realex.rb +200 -0
  62. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +88 -0
  63. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +116 -0
  64. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +97 -0
  65. data/lib/active_merchant/billing/gateways/sage.rb +146 -0
  66. data/lib/active_merchant/billing/gateways/sage_pay.rb +309 -0
  67. data/lib/active_merchant/billing/gateways/sallie_mae.rb +144 -0
  68. data/lib/active_merchant/billing/gateways/secure_pay.rb +31 -0
  69. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +157 -0
  70. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +113 -0
  71. data/lib/active_merchant/billing/gateways/skip_jack.rb +453 -0
  72. data/lib/active_merchant/billing/gateways/smart_ps.rb +265 -0
  73. data/lib/active_merchant/billing/gateways/trans_first.rb +127 -0
  74. data/lib/active_merchant/billing/gateways/transax.rb +25 -0
  75. data/lib/active_merchant/billing/gateways/trust_commerce.rb +418 -0
  76. data/lib/active_merchant/billing/gateways/usa_epay.rb +194 -0
  77. data/lib/active_merchant/billing/gateways/verifi.rb +228 -0
  78. data/lib/active_merchant/billing/gateways/viaklix.rb +189 -0
  79. data/lib/active_merchant/billing/gateways/wirecard.rb +318 -0
  80. data/lib/active_merchant/billing/gateways.rb +18 -0
  81. data/lib/active_merchant/billing/integrations/action_view_helper.rb +79 -0
  82. data/lib/active_merchant/billing/integrations/bogus/helper.rb +17 -0
  83. data/lib/active_merchant/billing/integrations/bogus/notification.rb +11 -0
  84. data/lib/active_merchant/billing/integrations/bogus/return.rb +10 -0
  85. data/lib/active_merchant/billing/integrations/bogus.rb +23 -0
  86. data/lib/active_merchant/billing/integrations/chronopay/helper.rb +120 -0
  87. data/lib/active_merchant/billing/integrations/chronopay/notification.rb +158 -0
  88. data/lib/active_merchant/billing/integrations/chronopay/return.rb +10 -0
  89. data/lib/active_merchant/billing/integrations/chronopay.rb +23 -0
  90. data/lib/active_merchant/billing/integrations/gestpay/common.rb +42 -0
  91. data/lib/active_merchant/billing/integrations/gestpay/helper.rb +70 -0
  92. data/lib/active_merchant/billing/integrations/gestpay/notification.rb +85 -0
  93. data/lib/active_merchant/billing/integrations/gestpay/return.rb +10 -0
  94. data/lib/active_merchant/billing/integrations/gestpay.rb +25 -0
  95. data/lib/active_merchant/billing/integrations/helper.rb +93 -0
  96. data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +58 -0
  97. data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +59 -0
  98. data/lib/active_merchant/billing/integrations/hi_trust/return.rb +67 -0
  99. data/lib/active_merchant/billing/integrations/hi_trust.rb +27 -0
  100. data/lib/active_merchant/billing/integrations/nochex/helper.rb +68 -0
  101. data/lib/active_merchant/billing/integrations/nochex/notification.rb +94 -0
  102. data/lib/active_merchant/billing/integrations/nochex/return.rb +10 -0
  103. data/lib/active_merchant/billing/integrations/nochex.rb +88 -0
  104. data/lib/active_merchant/billing/integrations/notification.rb +62 -0
  105. data/lib/active_merchant/billing/integrations/paypal/helper.rb +119 -0
  106. data/lib/active_merchant/billing/integrations/paypal/notification.rb +154 -0
  107. data/lib/active_merchant/billing/integrations/paypal/return.rb +10 -0
  108. data/lib/active_merchant/billing/integrations/paypal.rb +39 -0
  109. data/lib/active_merchant/billing/integrations/quickpay/helper.rb +72 -0
  110. data/lib/active_merchant/billing/integrations/quickpay/notification.rb +74 -0
  111. data/lib/active_merchant/billing/integrations/quickpay.rb +17 -0
  112. data/lib/active_merchant/billing/integrations/return.rb +35 -0
  113. data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +59 -0
  114. data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +114 -0
  115. data/lib/active_merchant/billing/integrations/two_checkout/return.rb +17 -0
  116. data/lib/active_merchant/billing/integrations/two_checkout.rb +23 -0
  117. data/lib/active_merchant/billing/integrations.rb +29 -0
  118. data/lib/active_merchant/billing/response.rb +32 -0
  119. data/lib/active_merchant/billing.rb +9 -0
  120. data/lib/active_merchant/lib/connection.rb +170 -0
  121. data/lib/active_merchant/lib/country.rb +319 -0
  122. data/lib/active_merchant/lib/error.rb +4 -0
  123. data/lib/active_merchant/lib/post_data.rb +22 -0
  124. data/lib/active_merchant/lib/posts_data.rb +47 -0
  125. data/lib/active_merchant/lib/requires_parameters.rb +16 -0
  126. data/lib/active_merchant/lib/utils.rb +18 -0
  127. data/lib/active_merchant/lib/validateable.rb +76 -0
  128. data/lib/active_merchant.rb +46 -0
  129. data/lib/certs/cacert.pem +7815 -0
  130. data/lib/support/gateway_support.rb +58 -0
  131. metadata +218 -0
@@ -0,0 +1,270 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ class JetpayGateway < Gateway
4
+ TEST_URL = 'https://test1.jetpay.com/jetpay'
5
+ LIVE_URL = 'https://gateway17.jetpay.com/jetpay'
6
+
7
+ # The countries the gateway supports merchants from as 2 digit ISO country codes
8
+ self.supported_countries = ['US']
9
+
10
+ # The card types supported by the payment gateway
11
+ self.supported_cardtypes = [:visa, :master, :american_express, :discover]
12
+
13
+ # The homepage URL of the gateway
14
+ self.homepage_url = 'http://www.jetpay.com/'
15
+
16
+ # The name of the gateway
17
+ self.display_name = 'JetPay'
18
+
19
+ # all transactions are in cents
20
+ self.money_format = :cents
21
+
22
+ ACTION_CODE_MESSAGES = {
23
+ "001" => "Refer to card issuer.",
24
+ "002" => "Refer to card issuer, special condition.",
25
+ "003" => "Pick up card.",
26
+ "200" => "Deny - Pick up card.",
27
+ "005" => "Do not honor.",
28
+ "100" => "Deny.",
29
+ "006" => "Error.",
30
+ "181" => "Format error.",
31
+ "007" => "Pickup card, special condition.",
32
+ "104" => "Deny - New card issued.",
33
+ "110" => "Invalid amount.",
34
+ "014" => "Invalid account number (no such number).",
35
+ "111" => "Invalid account.",
36
+ "015" => "No such issuer.",
37
+ "103" => "Deny - Invalid manual Entry 4DBC.",
38
+ "182" => "Please wait.",
39
+ "109" => "Invalid merchant.",
40
+ "041" => "Pick up card (lost card).",
41
+ "043" => "Pick up card (stolen card).",
42
+ "051" => "Insufficient funds.",
43
+ "052" => "No checking account.",
44
+ "105" => "Deny - Account Cancelled.",
45
+ "054" => "Expired Card.",
46
+ "101" => "Expired Card.",
47
+ "183" => "Invalid currency code.",
48
+ "057" => "Transaction not permitted to cardholder.",
49
+ "115" => "Service not permitted.",
50
+ "062" => "Restricted card.",
51
+ "189" => "Deny - Cancelled or Closed Merchant/SE.",
52
+ "188" => "Deny - Expiration date required.",
53
+ "125" => "Invalid effective date.",
54
+ "122" => "Invalid card (CID) security code.",
55
+ "400" => "Reversal accepted.",
56
+ "992" => "DECLINE/TIMEOUT.",
57
+ "107" => "Please Call Issuer.",
58
+ "025" => "Transaction Not Found.",
59
+ "981" => "AVS Error.",
60
+ "913" => "Invalid Card Type.",
61
+ "996" => "Terminal ID Not Found."
62
+ }
63
+
64
+ def initialize(options = {})
65
+ requires!(options, :login)
66
+ @options = options
67
+ super
68
+ end
69
+
70
+ def purchase(money, credit_card, options = {})
71
+ commit(money, build_sale_request(money, credit_card, options))
72
+ end
73
+
74
+ def authorize(money, credit_card, options = {})
75
+ commit(money, build_authonly_request(money, credit_card, options))
76
+ end
77
+
78
+ def capture(money, reference, options = {})
79
+ commit(money, build_capture_request('CAPT', reference.split(";").first))
80
+ end
81
+
82
+ def void(reference, options = {})
83
+ transaction_id, approval, amount = reference.split(";")
84
+ commit(amount.to_i, build_void_request(amount.to_i, transaction_id, approval))
85
+ end
86
+
87
+ def credit(money, transaction_id_or_card, options = {})
88
+
89
+ if transaction_id_or_card.is_a?(String)
90
+ transaction_id = transaction_id_or_card.split(";").first
91
+ credit_card = options[:credit_card]
92
+ else
93
+ transaction_id = nil
94
+ credit_card = transaction_id_or_card
95
+ end
96
+
97
+ commit(money, build_credit_request('CREDIT', money, transaction_id, credit_card))
98
+ end
99
+
100
+ private
101
+
102
+ def build_xml_request(transaction_type, transaction_id = nil, &block)
103
+ xml = Builder::XmlMarkup.new
104
+ xml.tag! 'JetPay' do
105
+ # The basic values needed for any request
106
+ xml.tag! 'TerminalID', @options[:login]
107
+ xml.tag! 'TransactionType', transaction_type
108
+ xml.tag! 'TransactionID', transaction_id.nil? ? generate_unique_id.slice(0, 18) : transaction_id
109
+
110
+ if block_given?
111
+ yield xml
112
+ else
113
+ xml.target!
114
+ end
115
+ end
116
+ end
117
+
118
+ def build_sale_request(money, credit_card, options)
119
+ build_xml_request('SALE') do |xml|
120
+ add_credit_card(xml, credit_card)
121
+ add_addresses(xml, options)
122
+ add_customer_data(xml, options)
123
+ add_invoice_data(xml, options)
124
+ xml.tag! 'TotalAmount', amount(money)
125
+
126
+ xml.target!
127
+ end
128
+ end
129
+
130
+ def build_authonly_request(money, credit_card, options)
131
+ build_xml_request('AUTHONLY') do |xml|
132
+ add_credit_card(xml, credit_card)
133
+ add_addresses(xml, options)
134
+ add_customer_data(xml, options)
135
+ add_invoice_data(xml, options)
136
+ xml.tag! 'TotalAmount', amount(money)
137
+
138
+ xml.target!
139
+ end
140
+ end
141
+
142
+ def build_capture_request(transaction_type, transaction_id)
143
+ build_xml_request(transaction_type, transaction_id)
144
+ end
145
+
146
+ def build_void_request(money, transaction_id, approval)
147
+ build_xml_request('VOID', transaction_id) do |xml|
148
+ xml.tag! 'Approval', approval
149
+ xml.tag! 'TotalAmount', amount(money)
150
+
151
+ xml.target!
152
+ end
153
+ end
154
+
155
+ # `transaction_id` may be nil for unlinked credit transactions.
156
+ def build_credit_request(transaction_type, money, transaction_id, card)
157
+ build_xml_request(transaction_type, transaction_id) do |xml|
158
+ add_credit_card(xml, card) if card
159
+ xml.tag! 'TotalAmount', amount(money)
160
+
161
+ xml.target!
162
+ end
163
+ end
164
+
165
+ def commit(money, request)
166
+ response = parse(ssl_post(test? ? TEST_URL : LIVE_URL, request))
167
+
168
+ success = success?(response)
169
+ Response.new(success,
170
+ success ? 'APPROVED' : message_from(response),
171
+ response,
172
+ :test => test?,
173
+ :authorization => authorization_from(response, money),
174
+ :avs_result => { :code => response[:avs] },
175
+ :cvv_result => response[:cvv2]
176
+ )
177
+ end
178
+
179
+ def parse(body)
180
+ xml = REXML::Document.new(body)
181
+
182
+ response = {}
183
+ xml.root.elements.to_a.each do |node|
184
+ parse_element(response, node)
185
+ end
186
+ response
187
+ end
188
+
189
+ def parse_element(response, node)
190
+ if node.has_elements?
191
+ node.elements.each{|element| parse_element(response, element) }
192
+ else
193
+ response[node.name.underscore.to_sym] = node.text
194
+ end
195
+ end
196
+
197
+ def format_exp(value)
198
+ format(value, :two_digits)
199
+ end
200
+
201
+ def success?(response)
202
+ response[:action_code] == "000"
203
+ end
204
+
205
+ def message_from(response)
206
+ ACTION_CODE_MESSAGES[response[:action_code]]
207
+ end
208
+
209
+ def authorization_from(response, money)
210
+ original_amount = amount(money) if money
211
+ [ response[:transaction_id], response[:approval], original_amount ].join(";")
212
+ end
213
+
214
+ def add_credit_card(xml, credit_card)
215
+ xml.tag! 'CardNum', credit_card.number
216
+ xml.tag! 'CardExpMonth', format_exp(credit_card.month)
217
+ xml.tag! 'CardExpYear', format_exp(credit_card.year)
218
+
219
+ if credit_card.first_name || credit_card.last_name
220
+ xml.tag! 'CardName', [credit_card.first_name,credit_card.last_name].compact.join(' ')
221
+ end
222
+
223
+ unless credit_card.verification_value.nil? || (credit_card.verification_value.length == 0)
224
+ xml.tag! 'CVV2', credit_card.verification_value
225
+ end
226
+ end
227
+
228
+ def add_addresses(xml, options)
229
+ if billing_address = options[:billing_address] || options[:address]
230
+ xml.tag! 'BillingAddress', [billing_address[:address1], billing_address[:address2]].compact.join(" ")
231
+ xml.tag! 'BillingCity', billing_address[:city]
232
+ xml.tag! 'BillingStateProv', billing_address[:state]
233
+ xml.tag! 'BillingPostalCode', billing_address[:zip]
234
+ xml.tag! 'BillingCountry', lookup_country_code(billing_address[:country])
235
+ xml.tag! 'BillingPhone', billing_address[:phone]
236
+ end
237
+
238
+ if shipping_address = options[:shipping_address]
239
+ xml.tag! 'ShippingInfo' do
240
+ xml.tag! 'ShippingName', shipping_address[:name]
241
+
242
+ xml.tag! 'ShippingAddr' do
243
+ xml.tag! 'Address', [shipping_address[:address1], shipping_address[:address2]].compact.join(" ")
244
+ xml.tag! 'City', shipping_address[:city]
245
+ xml.tag! 'StateProv', shipping_address[:state]
246
+ xml.tag! 'PostalCode', shipping_address[:zip]
247
+ xml.tag! 'Country', lookup_country_code(shipping_address[:country])
248
+ end
249
+ end
250
+ end
251
+ end
252
+
253
+ def add_customer_data(xml, options)
254
+ xml.tag! 'Email', options[:email] if options[:email]
255
+ xml.tag! 'UserIPAddress', options[:ip] if options[:ip]
256
+ end
257
+
258
+ def add_invoice_data(xml, options)
259
+ xml.tag! 'OrderNumber', options[:order_id] if options[:order_id]
260
+ xml.tag! 'TaxAmount', amount(options[:tax]) if options[:tax]
261
+ end
262
+
263
+ def lookup_country_code(code)
264
+ country = Country.find(code) rescue nil
265
+ country && country.code(:alpha3)
266
+ end
267
+ end
268
+ end
269
+ end
270
+