bitfluent-activemerchant 1.5.1.1

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 (138) hide show
  1. data/CHANGELOG +520 -0
  2. data/CONTRIBUTORS +138 -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 +102 -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 +406 -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/garanti.rb +222 -0
  31. data/lib/active_merchant/billing/gateways/instapay.rb +164 -0
  32. data/lib/active_merchant/billing/gateways/jetpay.rb +270 -0
  33. data/lib/active_merchant/billing/gateways/linkpoint.rb +449 -0
  34. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +154 -0
  35. data/lib/active_merchant/billing/gateways/merchant_ware.rb +283 -0
  36. data/lib/active_merchant/billing/gateways/modern_payments.rb +36 -0
  37. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +220 -0
  38. data/lib/active_merchant/billing/gateways/moneris.rb +205 -0
  39. data/lib/active_merchant/billing/gateways/net_registry.rb +189 -0
  40. data/lib/active_merchant/billing/gateways/netbilling.rb +168 -0
  41. data/lib/active_merchant/billing/gateways/ogone.rb +279 -0
  42. data/lib/active_merchant/billing/gateways/pay_junction.rb +392 -0
  43. data/lib/active_merchant/billing/gateways/pay_secure.rb +120 -0
  44. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +207 -0
  45. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +39 -0
  46. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
  47. data/lib/active_merchant/billing/gateways/payflow.rb +236 -0
  48. data/lib/active_merchant/billing/gateways/payflow_express.rb +138 -0
  49. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +15 -0
  50. data/lib/active_merchant/billing/gateways/payflow_uk.rb +21 -0
  51. data/lib/active_merchant/billing/gateways/payment_express.rb +230 -0
  52. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +326 -0
  53. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +38 -0
  54. data/lib/active_merchant/billing/gateways/paypal.rb +121 -0
  55. data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
  56. data/lib/active_merchant/billing/gateways/paypal_express.rb +135 -0
  57. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +20 -0
  58. data/lib/active_merchant/billing/gateways/plugnpay.rb +292 -0
  59. data/lib/active_merchant/billing/gateways/psigate.rb +214 -0
  60. data/lib/active_merchant/billing/gateways/psl_card.rb +304 -0
  61. data/lib/active_merchant/billing/gateways/quickpay.rb +213 -0
  62. data/lib/active_merchant/billing/gateways/realex.rb +200 -0
  63. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +88 -0
  64. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +116 -0
  65. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +97 -0
  66. data/lib/active_merchant/billing/gateways/sage.rb +146 -0
  67. data/lib/active_merchant/billing/gateways/sage_pay.rb +309 -0
  68. data/lib/active_merchant/billing/gateways/sallie_mae.rb +144 -0
  69. data/lib/active_merchant/billing/gateways/secure_pay.rb +31 -0
  70. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +157 -0
  71. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +113 -0
  72. data/lib/active_merchant/billing/gateways/skip_jack.rb +453 -0
  73. data/lib/active_merchant/billing/gateways/smart_ps.rb +265 -0
  74. data/lib/active_merchant/billing/gateways/trans_first.rb +127 -0
  75. data/lib/active_merchant/billing/gateways/transax.rb +25 -0
  76. data/lib/active_merchant/billing/gateways/trust_commerce.rb +418 -0
  77. data/lib/active_merchant/billing/gateways/usa_epay.rb +194 -0
  78. data/lib/active_merchant/billing/gateways/verifi.rb +228 -0
  79. data/lib/active_merchant/billing/gateways/viaklix.rb +189 -0
  80. data/lib/active_merchant/billing/gateways/wirecard.rb +318 -0
  81. data/lib/active_merchant/billing/gateways.rb +18 -0
  82. data/lib/active_merchant/billing/integrations/action_view_helper.rb +79 -0
  83. data/lib/active_merchant/billing/integrations/bogus/helper.rb +17 -0
  84. data/lib/active_merchant/billing/integrations/bogus/notification.rb +11 -0
  85. data/lib/active_merchant/billing/integrations/bogus/return.rb +10 -0
  86. data/lib/active_merchant/billing/integrations/bogus.rb +23 -0
  87. data/lib/active_merchant/billing/integrations/chronopay/helper.rb +120 -0
  88. data/lib/active_merchant/billing/integrations/chronopay/notification.rb +158 -0
  89. data/lib/active_merchant/billing/integrations/chronopay/return.rb +10 -0
  90. data/lib/active_merchant/billing/integrations/chronopay.rb +23 -0
  91. data/lib/active_merchant/billing/integrations/gestpay/common.rb +42 -0
  92. data/lib/active_merchant/billing/integrations/gestpay/helper.rb +70 -0
  93. data/lib/active_merchant/billing/integrations/gestpay/notification.rb +85 -0
  94. data/lib/active_merchant/billing/integrations/gestpay/return.rb +10 -0
  95. data/lib/active_merchant/billing/integrations/gestpay.rb +25 -0
  96. data/lib/active_merchant/billing/integrations/helper.rb +93 -0
  97. data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +58 -0
  98. data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +59 -0
  99. data/lib/active_merchant/billing/integrations/hi_trust/return.rb +67 -0
  100. data/lib/active_merchant/billing/integrations/hi_trust.rb +27 -0
  101. data/lib/active_merchant/billing/integrations/ipay88/helper.rb +120 -0
  102. data/lib/active_merchant/billing/integrations/ipay88/return.rb +121 -0
  103. data/lib/active_merchant/billing/integrations/ipay88.rb +40 -0
  104. data/lib/active_merchant/billing/integrations/nochex/helper.rb +68 -0
  105. data/lib/active_merchant/billing/integrations/nochex/notification.rb +94 -0
  106. data/lib/active_merchant/billing/integrations/nochex/return.rb +10 -0
  107. data/lib/active_merchant/billing/integrations/nochex.rb +88 -0
  108. data/lib/active_merchant/billing/integrations/notification.rb +62 -0
  109. data/lib/active_merchant/billing/integrations/paypal/helper.rb +119 -0
  110. data/lib/active_merchant/billing/integrations/paypal/notification.rb +154 -0
  111. data/lib/active_merchant/billing/integrations/paypal/return.rb +10 -0
  112. data/lib/active_merchant/billing/integrations/paypal.rb +39 -0
  113. data/lib/active_merchant/billing/integrations/quickpay/helper.rb +72 -0
  114. data/lib/active_merchant/billing/integrations/quickpay/notification.rb +74 -0
  115. data/lib/active_merchant/billing/integrations/quickpay.rb +17 -0
  116. data/lib/active_merchant/billing/integrations/return.rb +35 -0
  117. data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +59 -0
  118. data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +114 -0
  119. data/lib/active_merchant/billing/integrations/two_checkout/return.rb +17 -0
  120. data/lib/active_merchant/billing/integrations/two_checkout.rb +23 -0
  121. data/lib/active_merchant/billing/integrations.rb +29 -0
  122. data/lib/active_merchant/billing/response.rb +32 -0
  123. data/lib/active_merchant/billing.rb +9 -0
  124. data/lib/active_merchant/common/connection.rb +172 -0
  125. data/lib/active_merchant/common/country.rb +319 -0
  126. data/lib/active_merchant/common/error.rb +26 -0
  127. data/lib/active_merchant/common/post_data.rb +24 -0
  128. data/lib/active_merchant/common/posts_data.rb +47 -0
  129. data/lib/active_merchant/common/requires_parameters.rb +16 -0
  130. data/lib/active_merchant/common/utils.rb +18 -0
  131. data/lib/active_merchant/common/validateable.rb +76 -0
  132. data/lib/active_merchant/common.rb +14 -0
  133. data/lib/active_merchant.rb +38 -0
  134. data/lib/activemerchant.rb +1 -0
  135. data/lib/certs/cacert.pem +7815 -0
  136. data/lib/support/gateway_support.rb +58 -0
  137. data/lib/support/outbound_hosts.rb +25 -0
  138. metadata +235 -0
@@ -0,0 +1,114 @@
1
+ require 'net/http'
2
+ require 'base64'
3
+ require 'digest/md5'
4
+
5
+ module ActiveMerchant #:nodoc:
6
+ module Billing #:nodoc:
7
+ module Integrations #:nodoc:
8
+ module TwoCheckout
9
+ class Notification < ActiveMerchant::Billing::Integrations::Notification
10
+ # order_number 2Checkout.com order number
11
+ # card_holder_name Card holder's name
12
+ # street_address Card holder's address
13
+ # city Card holder's city
14
+ # state Card holder's state
15
+ # zip Card holder's zip
16
+ # country Card holder's country
17
+ # email Card holder's email
18
+ # phone Card holder's phone
19
+ # credit_card_processed Y if successful, K if waiting for approval
20
+ # total Total purchase amount
21
+ # ship_name Shipping information
22
+ # ship_street_address Shipping information
23
+ # ship_city Shipping information
24
+ # ship_state Shipping information
25
+ # ship_zip Shipping information
26
+ # ship_country Shipping information
27
+ # product_id 2Checkout product ID for purchased items will append a number if more than one item.
28
+ # ex. product_id,product_id1,product_id2
29
+ # quantity quantity of corresponding product will append a number if more than one item.
30
+ # ex. quantity,quantity1,quantity2
31
+ # merchant_product_id your product ID for purchased items will append a number if more than one item.
32
+ # ex. merchant_product_id,merchant_product_id1,merchant_product_id2
33
+ # product_description your description for purchased items will append a number if more than one item.
34
+ # ex. product_description,product_description1,product_description2
35
+
36
+ def currency
37
+ 'USD'
38
+ end
39
+
40
+ def complete?
41
+ status == 'Completed'
42
+ end
43
+
44
+ def item_id
45
+ params['cart_order_id']
46
+ end
47
+
48
+ def transaction_id
49
+ params['order_number']
50
+ end
51
+
52
+ def received_at
53
+ params['']
54
+ end
55
+
56
+ def payer_email
57
+ params['email']
58
+ end
59
+
60
+ def receiver_email
61
+ params['']
62
+ end
63
+
64
+ # The MD5 Hash
65
+ def security_key
66
+ params['key']
67
+ end
68
+
69
+ # the money amount we received in X.2 decimal.
70
+ def gross
71
+ params['total']
72
+ end
73
+
74
+ # Was this a test transaction? # Use the hash
75
+ def test?
76
+ params['demo'] == 'Y'
77
+ end
78
+
79
+ def status
80
+ case params['credit_card_processed']
81
+ when 'Y'
82
+ 'Completed'
83
+ when 'K'
84
+ 'Pending'
85
+ else
86
+ 'Failed'
87
+ end
88
+ end
89
+
90
+ def verify(secret)
91
+ return false if security_key.blank?
92
+
93
+ Digest::MD5.hexdigest("#{secret}#{params['sid']}#{transaction_id}#{gross}").upcase == security_key.upcase
94
+ end
95
+
96
+ def acknowledge
97
+ true
98
+ end
99
+
100
+ private
101
+
102
+ def parse(post)
103
+ @raw = post.to_s
104
+ for line in @raw.split('&')
105
+ key, value = *line.scan( %r{^(\w+)\=(.*)$} ).flatten
106
+ params[key] = CGI.unescape(value || '')
107
+ end
108
+ end
109
+
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,17 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ module TwoCheckout
5
+ class Return < ActiveMerchant::Billing::Integrations::Return
6
+ def success?
7
+ params['credit_card_processed'] == 'Y'
8
+ end
9
+
10
+ def message
11
+
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,23 @@
1
+
2
+ module ActiveMerchant #:nodoc:
3
+ module Billing #:nodoc:
4
+ module Integrations #:nodoc:
5
+ module TwoCheckout
6
+ autoload 'Helper', File.dirname(__FILE__) + '/two_checkout/helper'
7
+ autoload 'Return', File.dirname(__FILE__) + '/two_checkout/return'
8
+ autoload 'Notification', File.dirname(__FILE__) + '/two_checkout/notification'
9
+
10
+ mattr_accessor :service_url
11
+ self.service_url = 'https://www.2checkout.com/2co/buyer/purchase'
12
+
13
+ def self.notification(post)
14
+ Notification.new(post)
15
+ end
16
+
17
+ def self.return(query_string)
18
+ Return.new(query_string)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,29 @@
1
+
2
+ # make the bogus gateway be classified correctly by the inflector
3
+ if defined?(ActiveSupport::Inflector)
4
+ ActiveSupport::Inflector.inflections do |inflect|
5
+ inflect.uncountable 'bogus'
6
+ end
7
+ else
8
+ Inflector.inflections do |inflect|
9
+ inflect.uncountable 'bogus'
10
+ end
11
+ end
12
+
13
+ module ActiveMerchant
14
+ module Billing
15
+ module Integrations
16
+
17
+ Dir[File.dirname(__FILE__) + '/integrations/*.rb'].each do |f|
18
+
19
+ # Get camelized class name
20
+ filename = File.basename(f, '.rb')
21
+ # Camelize the string to get the class name
22
+ gateway_class = filename.camelize.to_sym
23
+
24
+ # Register for autoloading
25
+ autoload gateway_class, f
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,32 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+
4
+ class Error < ActiveMerchantError #:nodoc:
5
+ end
6
+
7
+ class Response
8
+ attr_reader :params, :message, :test, :authorization, :avs_result, :cvv_result
9
+
10
+ def success?
11
+ @success
12
+ end
13
+
14
+ def test?
15
+ @test
16
+ end
17
+
18
+ def fraud_review?
19
+ @fraud_review
20
+ end
21
+
22
+ def initialize(success, message, params = {}, options = {})
23
+ @success, @message, @params = success, message, params.stringify_keys
24
+ @test = options[:test] || false
25
+ @authorization = options[:authorization]
26
+ @fraud_review = options[:fraud_review]
27
+ @avs_result = AVSResult.new(options[:avs_result]).to_hash
28
+ @cvv_result = CVVResult.new(options[:cvv_result]).to_hash
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,9 @@
1
+ require 'active_merchant/billing/avs_result'
2
+ require 'active_merchant/billing/cvv_result'
3
+ require 'active_merchant/billing/credit_card_methods'
4
+ require 'active_merchant/billing/credit_card_formatting'
5
+ require 'active_merchant/billing/credit_card'
6
+ require 'active_merchant/billing/base'
7
+ require 'active_merchant/billing/check'
8
+ require 'active_merchant/billing/response'
9
+ require 'active_merchant/billing/gateways'
@@ -0,0 +1,172 @@
1
+ require 'uri'
2
+ require 'net/http'
3
+ require 'net/https'
4
+ require 'benchmark'
5
+
6
+ module ActiveMerchant
7
+ class ConnectionError < ActiveMerchantError # :nodoc:
8
+ end
9
+
10
+ class RetriableConnectionError < ConnectionError # :nodoc:
11
+ end
12
+
13
+ class ResponseError < ActiveMerchantError # :nodoc:
14
+ attr_reader :response
15
+
16
+ def initialize(response, message = nil)
17
+ @response = response
18
+ @message = message
19
+ end
20
+
21
+ def to_s
22
+ "Failed with #{response.code} #{response.message if response.respond_to?(:message)}"
23
+ end
24
+ end
25
+
26
+ class Connection
27
+ MAX_RETRIES = 3
28
+ OPEN_TIMEOUT = 60
29
+ READ_TIMEOUT = 60
30
+ VERIFY_PEER = true
31
+ RETRY_SAFE = false
32
+ RUBY_184_POST_HEADERS = { "Content-Type" => "application/x-www-form-urlencoded" }
33
+
34
+ attr_accessor :endpoint
35
+ attr_accessor :open_timeout
36
+ attr_accessor :read_timeout
37
+ attr_accessor :verify_peer
38
+ attr_accessor :retry_safe
39
+ attr_accessor :pem
40
+ attr_accessor :pem_password
41
+ attr_accessor :wiredump_device
42
+ attr_accessor :logger
43
+ attr_accessor :tag
44
+
45
+ def initialize(endpoint)
46
+ @endpoint = endpoint.is_a?(URI) ? endpoint : URI.parse(endpoint)
47
+ @open_timeout = OPEN_TIMEOUT
48
+ @read_timeout = READ_TIMEOUT
49
+ @retry_safe = RETRY_SAFE
50
+ @verify_peer = VERIFY_PEER
51
+ end
52
+
53
+ def request(method, body, headers = {})
54
+ retry_exceptions do
55
+ begin
56
+ info "#{method.to_s.upcase} #{endpoint}", tag
57
+
58
+ result = nil
59
+
60
+ realtime = Benchmark.realtime do
61
+ result = case method
62
+ when :get
63
+ raise ArgumentError, "GET requests do not support a request body" if body
64
+ http.get(endpoint.request_uri, headers)
65
+ when :post
66
+ debug body
67
+ http.post(endpoint.request_uri, body, RUBY_184_POST_HEADERS.merge(headers))
68
+ else
69
+ raise ArgumentError, "Unsupported request method #{method.to_s.upcase}"
70
+ end
71
+ end
72
+
73
+ info "--> %d %s (%d %.4fs)" % [result.code, result.message, result.body ? result.body.length : 0, realtime], tag
74
+ response = handle_response(result)
75
+ debug response
76
+ response
77
+ rescue EOFError => e
78
+ raise ConnectionError, "The remote server dropped the connection"
79
+ rescue Errno::ECONNRESET => e
80
+ raise ConnectionError, "The remote server reset the connection"
81
+ rescue Errno::ECONNREFUSED => e
82
+ raise RetriableConnectionError, "The remote server refused the connection"
83
+ rescue OpenSSL::X509::CertificateError => e
84
+ raise ClientCertificateError, "The remote server did not accept the provided SSL certificate"
85
+ rescue Timeout::Error, Errno::ETIMEDOUT => e
86
+ raise ConnectionError, "The connection to the remote server timed out"
87
+ end
88
+ end
89
+ end
90
+
91
+ private
92
+ def http
93
+ http = Net::HTTP.new(endpoint.host, endpoint.port)
94
+ configure_debugging(http)
95
+ configure_timeouts(http)
96
+ configure_ssl(http)
97
+ configure_cert(http)
98
+ http
99
+ end
100
+
101
+ def configure_debugging(http)
102
+ http.set_debug_output(wiredump_device)
103
+ end
104
+
105
+ def configure_timeouts(http)
106
+ http.open_timeout = open_timeout
107
+ http.read_timeout = read_timeout
108
+ end
109
+
110
+ def configure_ssl(http)
111
+ return unless endpoint.scheme == "https"
112
+
113
+ http.use_ssl = true
114
+
115
+ if verify_peer
116
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
117
+ http.ca_file = File.dirname(__FILE__) + '/../../certs/cacert.pem'
118
+ else
119
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
120
+ end
121
+ end
122
+
123
+ def configure_cert(http)
124
+ return if pem.blank?
125
+
126
+ http.cert = OpenSSL::X509::Certificate.new(pem)
127
+
128
+ if pem_password
129
+ http.key = OpenSSL::PKey::RSA.new(pem, pem_password)
130
+ else
131
+ http.key = OpenSSL::PKey::RSA.new(pem)
132
+ end
133
+ end
134
+
135
+ def retry_exceptions
136
+ retries = MAX_RETRIES
137
+ begin
138
+ yield
139
+ rescue RetriableConnectionError => e
140
+ retries -= 1
141
+ retry unless retries.zero?
142
+ raise ConnectionError, e.message
143
+ rescue ConnectionError
144
+ retries -= 1
145
+ retry if retry_safe && !retries.zero?
146
+ raise
147
+ end
148
+ end
149
+
150
+ def handle_response(response)
151
+ case response.code.to_i
152
+ when 200...300
153
+ response.body
154
+ else
155
+ raise ResponseError.new(response)
156
+ end
157
+ end
158
+
159
+ def debug(message, tag = nil)
160
+ log(:debug, message, tag)
161
+ end
162
+
163
+ def info(message, tag = nil)
164
+ log(:info, message, tag)
165
+ end
166
+
167
+ def log(level, message, tag)
168
+ message = "[#{tag}] #{message}" if tag
169
+ logger.send(level, message) if logger
170
+ end
171
+ end
172
+ end