braintree 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/braintree.rb +36 -46
- data/lib/braintree/address.rb +14 -14
- data/lib/braintree/base_module.rb +3 -3
- data/lib/braintree/configuration.rb +16 -16
- data/lib/braintree/credit_card.rb +39 -30
- data/lib/braintree/credit_card_verification.rb +4 -3
- data/lib/braintree/customer.rb +22 -22
- data/lib/braintree/digest.rb +2 -8
- data/lib/braintree/error_codes.rb +16 -3
- data/lib/braintree/error_result.rb +5 -5
- data/lib/braintree/exceptions.rb +58 -0
- data/lib/braintree/http.rb +7 -7
- data/lib/braintree/paged_collection.rb +14 -14
- data/lib/braintree/ssl_expiration_check.rb +5 -1
- data/lib/braintree/subscription.rb +110 -0
- data/lib/braintree/successful_result.rb +3 -3
- data/lib/braintree/test/credit_card_numbers.rb +1 -1
- data/lib/braintree/test/transaction_amounts.rb +18 -0
- data/lib/braintree/transaction.rb +52 -25
- data/lib/braintree/transaction/address_details.rb +2 -2
- data/lib/braintree/transaction/credit_card_details.rb +12 -4
- data/lib/braintree/transaction/customer_details.rb +9 -1
- data/lib/braintree/transaction/status_details.rb +1 -1
- data/lib/braintree/transparent_redirect.rb +15 -15
- data/lib/braintree/util.rb +7 -7
- data/lib/braintree/validation_error.rb +1 -1
- data/lib/braintree/validation_error_collection.rb +6 -6
- data/lib/braintree/version.rb +3 -3
- data/lib/braintree/xml/generator.rb +2 -2
- data/lib/braintree/xml/libxml.rb +1 -1
- data/lib/braintree/xml/parser.rb +1 -1
- data/spec/integration/braintree/address_spec.rb +12 -12
- data/spec/integration/braintree/credit_card_spec.rb +189 -37
- data/spec/integration/braintree/customer_spec.rb +35 -35
- data/spec/integration/braintree/http_spec.rb +3 -3
- data/spec/integration/braintree/subscription_spec.rb +362 -0
- data/spec/integration/braintree/transaction_spec.rb +130 -58
- data/spec/integration/spec_helper.rb +1 -1
- data/spec/spec_helper.rb +4 -4
- data/spec/unit/braintree/address_spec.rb +6 -6
- data/spec/unit/braintree/base_module_spec.rb +18 -0
- data/spec/unit/braintree/configuration_spec.rb +10 -10
- data/spec/unit/braintree/credit_card_spec.rb +15 -15
- data/spec/unit/braintree/credit_card_verification_spec.rb +4 -2
- data/spec/unit/braintree/customer_spec.rb +8 -8
- data/spec/unit/braintree/digest_spec.rb +4 -0
- data/spec/unit/braintree/http_spec.rb +2 -2
- data/spec/unit/braintree/paged_collection_spec.rb +12 -12
- data/spec/unit/braintree/ssl_expiration_check_spec.rb +18 -9
- data/spec/unit/braintree/transaction/credit_card_details_spec.rb +15 -0
- data/spec/unit/braintree/transaction/customer_details_spec.rb +19 -0
- data/spec/unit/braintree/transaction_spec.rb +14 -14
- data/spec/unit/braintree/transparent_redirect_spec.rb +11 -11
- data/spec/unit/braintree/util_spec.rb +8 -8
- data/spec/unit/braintree/validation_error_collection_spec.rb +6 -6
- data/spec/unit/braintree/validation_error_spec.rb +2 -2
- data/spec/unit/braintree/xml/libxml_spec.rb +5 -5
- data/spec/unit/braintree/xml_spec.rb +16 -16
- data/spec/unit/braintree_spec.rb +11 -0
- metadata +8 -2
@@ -2,8 +2,8 @@ module Braintree
|
|
2
2
|
class CreditCardVerification
|
3
3
|
include BaseModule
|
4
4
|
|
5
|
-
attr_reader :avs_error_response_code, :avs_postal_code_response_code,
|
6
|
-
:
|
5
|
+
attr_reader :avs_error_response_code, :avs_postal_code_response_code, :avs_street_address_response_code,
|
6
|
+
:cvv_response_code, :processor_response_code, :processor_response_text, :status
|
7
7
|
|
8
8
|
def initialize(attributes) # :nodoc:
|
9
9
|
set_instance_variables_from_hash(attributes)
|
@@ -11,7 +11,8 @@ module Braintree
|
|
11
11
|
|
12
12
|
def inspect # :nodoc:
|
13
13
|
attr_order = [
|
14
|
-
:status, :
|
14
|
+
:status, :processor_response_code, :processor_response_text,
|
15
|
+
:cvv_response_code, :avs_error_response_code,
|
15
16
|
:avs_postal_code_response_code, :avs_street_address_response_code
|
16
17
|
]
|
17
18
|
formatted_attrs = attr_order.map do |attr|
|
data/lib/braintree/customer.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
module Braintree
|
2
2
|
class Customer
|
3
3
|
include BaseModule
|
4
|
-
|
4
|
+
|
5
5
|
attr_reader :addresses, :company, :created_at, :credit_cards, :email, :fax, :first_name, :id, :last_name,
|
6
6
|
:phone, :updated_at, :website, :custom_fields
|
7
|
-
|
7
|
+
|
8
8
|
# Returns a PagedCollection of all customers stored in the vault. Due to race conditions, this method
|
9
9
|
# may not reliably return all customers stored in the vault.
|
10
10
|
#
|
@@ -25,7 +25,7 @@ module Braintree
|
|
25
25
|
end
|
26
26
|
PagedCollection.new(attributes) { |page_number| Customer.all(:page => page_number) }
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
# Creates a customer using the given +attributes+. If <tt>:id</tt> is not passed,
|
30
30
|
# the gateway will generate it.
|
31
31
|
#
|
@@ -47,7 +47,7 @@ module Braintree
|
|
47
47
|
Util.verify_keys(_create_signature, attributes)
|
48
48
|
_do_create "/customers", :customer => attributes
|
49
49
|
end
|
50
|
-
|
50
|
+
|
51
51
|
def self.create!(attributes = {})
|
52
52
|
return_object_or_raise(:customer) { create(attributes) }
|
53
53
|
end
|
@@ -60,15 +60,15 @@ module Braintree
|
|
60
60
|
params = TransparentRedirect.parse_and_validate_query_string query_string
|
61
61
|
_do_create("/customers/all/confirm_transparent_redirect_request", :id => params[:id])
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
def self.create_customer_transparent_redirect_url
|
65
65
|
"#{Braintree::Configuration.base_merchant_url}/customers"
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
def self.credit(customer_id, transaction_attributes)
|
69
69
|
Transaction.credit(transaction_attributes.merge(:customer_id => customer_id))
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
def self.credit!(customer_id, transaction_attributes)
|
73
73
|
return_object_or_raise(:transaction){ credit(customer_id, transaction_attributes) }
|
74
74
|
end
|
@@ -77,18 +77,18 @@ module Braintree
|
|
77
77
|
Http.delete("/customers/#{customer_id}")
|
78
78
|
SuccessfulResult.new
|
79
79
|
end
|
80
|
-
|
80
|
+
|
81
81
|
def self.find(customer_id)
|
82
82
|
response = Http.get("/customers/#{customer_id}")
|
83
83
|
new(response[:customer])
|
84
84
|
rescue NotFoundError
|
85
85
|
raise NotFoundError, "customer with id #{customer_id.inspect} not found"
|
86
86
|
end
|
87
|
-
|
87
|
+
|
88
88
|
def self.sale(customer_id, transaction_attributes)
|
89
89
|
Transaction.sale(transaction_attributes.merge(:customer_id => customer_id))
|
90
90
|
end
|
91
|
-
|
91
|
+
|
92
92
|
def self.sale!(customer_id, transaction_attributes)
|
93
93
|
return_object_or_raise(:transaction){ sale(customer_id, transaction_attributes) }
|
94
94
|
end
|
@@ -103,12 +103,12 @@ module Braintree
|
|
103
103
|
end
|
104
104
|
PagedCollection.new(attributes) { |page_number| Customer.transactions(customer_id, :page => page_number) }
|
105
105
|
end
|
106
|
-
|
106
|
+
|
107
107
|
def self.update(customer_id, attributes)
|
108
108
|
Util.verify_keys(_update_signature, attributes)
|
109
109
|
_do_update(:put, "/customers/#{customer_id}", :customer => attributes)
|
110
110
|
end
|
111
|
-
|
111
|
+
|
112
112
|
def self.update!(customer_id, attributes)
|
113
113
|
return_object_or_raise(:customer) { update(customer_id, attributes) }
|
114
114
|
end
|
@@ -121,25 +121,25 @@ module Braintree
|
|
121
121
|
params = TransparentRedirect.parse_and_validate_query_string(query_string)
|
122
122
|
_do_update(:post, "/customers/all/confirm_transparent_redirect_request", :id => params[:id])
|
123
123
|
end
|
124
|
-
|
124
|
+
|
125
125
|
def initialize(attributes) # :nodoc:
|
126
126
|
set_instance_variables_from_hash(attributes)
|
127
127
|
@credit_cards = (@credit_cards || []).map { |pm| CreditCard._new pm }
|
128
128
|
@addresses = (@addresses || []).map { |addr| Address._new addr }
|
129
129
|
end
|
130
|
-
|
130
|
+
|
131
131
|
def credit(transaction_attributes)
|
132
132
|
Customer.credit(id, transaction_attributes)
|
133
133
|
end
|
134
|
-
|
134
|
+
|
135
135
|
def credit!(transaction_attributes)
|
136
136
|
return_object_or_raise(:transaction) { credit(transaction_attributes) }
|
137
137
|
end
|
138
|
-
|
138
|
+
|
139
139
|
def delete
|
140
140
|
Customer.delete(id)
|
141
141
|
end
|
142
|
-
|
142
|
+
|
143
143
|
def inspect # :nodoc:
|
144
144
|
first = [:id]
|
145
145
|
last = [:addresses, :credit_cards]
|
@@ -149,11 +149,11 @@ module Braintree
|
|
149
149
|
end
|
150
150
|
"#<#{self.class} #{nice_attributes.join(', ')}>"
|
151
151
|
end
|
152
|
-
|
152
|
+
|
153
153
|
def sale(transaction_attributes)
|
154
154
|
Customer.sale(id, transaction_attributes)
|
155
155
|
end
|
156
|
-
|
156
|
+
|
157
157
|
def sale!(transaction_attributes)
|
158
158
|
return_object_or_raise(:transaction) { sale(transaction_attributes) }
|
159
159
|
end
|
@@ -172,9 +172,9 @@ module Braintree
|
|
172
172
|
ErrorResult.new(response[:api_error_response])
|
173
173
|
else
|
174
174
|
raise "expected :customer or :errors"
|
175
|
-
end
|
175
|
+
end
|
176
176
|
end
|
177
|
-
|
177
|
+
|
178
178
|
def update!(attributes)
|
179
179
|
return_object_or_raise(:customer) { update(attributes) }
|
180
180
|
end
|
@@ -228,7 +228,7 @@ module Braintree
|
|
228
228
|
|
229
229
|
def self._new(*args) # :nodoc:
|
230
230
|
self.new *args
|
231
|
-
end
|
231
|
+
end
|
232
232
|
|
233
233
|
def self._update_signature # :nodoc:
|
234
234
|
[ :company, :email, :fax, :first_name, :id, :last_name, :phone, :website, {:custom_fields => :_any_key_} ]
|
data/lib/braintree/digest.rb
CHANGED
@@ -6,14 +6,8 @@ module Braintree
|
|
6
6
|
|
7
7
|
def self._hmac_sha1(key, message)
|
8
8
|
key_digest = ::Digest::SHA1.digest(key)
|
9
|
-
|
10
|
-
|
11
|
-
0.upto(19) do |i|
|
12
|
-
inner_padding[i] ^= key_digest[i]
|
13
|
-
outer_padding[i] ^= key_digest[i]
|
14
|
-
end
|
15
|
-
inner_hash = ::Digest::SHA1.digest(inner_padding + message.to_s)
|
16
|
-
::Digest::SHA1.hexdigest(outer_padding + inner_hash)
|
9
|
+
sha1 = OpenSSL::Digest::Digest.new("sha1")
|
10
|
+
OpenSSL::HMAC.hexdigest(sha1, key_digest, message.to_s)
|
17
11
|
end
|
18
12
|
end
|
19
13
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Braintree
|
2
2
|
# The ErrorCodes module provides constants for validation errors.
|
3
3
|
# The constants should be used to check for a specific validation error in a ValidationErrorCollection.
|
4
|
-
# The error messages returned from the server may change, but the codes will remain the same.
|
4
|
+
# The error messages returned from the server may change, but the codes will remain the same.
|
5
5
|
module ErrorCodes
|
6
6
|
module Address
|
7
7
|
CannotBeBlank = "81801"
|
@@ -35,7 +35,7 @@ module Braintree
|
|
35
35
|
ExpirationYearIsInvalid = "81713"
|
36
36
|
NumberIsRequired = "81714"
|
37
37
|
NumberIsInvalid = "81715"
|
38
|
-
|
38
|
+
NumberHasInvalidLength = "81716"
|
39
39
|
NumberMustBeTestNumber = "81717"
|
40
40
|
TokenInvalid = "91718"
|
41
41
|
TokenIsInUse = "91719"
|
@@ -62,7 +62,19 @@ module Braintree
|
|
62
62
|
WebsiteIsTooLong = "81615"
|
63
63
|
WebsiteIsInvalid = "81616"
|
64
64
|
end
|
65
|
-
|
65
|
+
|
66
|
+
module Subscription
|
67
|
+
CannotEditCanceledSubscription = "81901"
|
68
|
+
IdIsInUse = "81902"
|
69
|
+
PriceCannotBeBlank = "81903"
|
70
|
+
PriceFormatIsInvalid = "81904"
|
71
|
+
StatusIsCanceled = "81905"
|
72
|
+
TokenFormatIsInvalid = "81906"
|
73
|
+
TrialDurationFormatIsInvalid = "81907"
|
74
|
+
TrialDurationIsRequired = "81908"
|
75
|
+
TrialDurationUnitIsInvalid = "81909"
|
76
|
+
end
|
77
|
+
|
66
78
|
module Transaction
|
67
79
|
AmountCannotBeNegative = "81501"
|
68
80
|
AmountIsRequired = "81502"
|
@@ -73,6 +85,7 @@ module Braintree
|
|
73
85
|
CannotSubmitForSettlement = "91507"
|
74
86
|
CreditCardIsRequired = "91508"
|
75
87
|
CustomerDefaultPaymentMethodCardTypeIsNotAccepted = "81509"
|
88
|
+
CustomFieldIsInvalid = "91526"
|
76
89
|
CustomerIdIsInvalid = "91510"
|
77
90
|
CustomerDoesNotHaveCreditCard = "91511"
|
78
91
|
HasAlreadyBeenRefunded = "91512"
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module Braintree
|
1
|
+
module Braintree
|
2
2
|
# An ErrorResult will be returned from non-bang methods when
|
3
3
|
# validations fail. It will provide access to the params passed
|
4
4
|
# to the server. The params are primarily useful for re-populaing
|
@@ -16,9 +16,9 @@ module Braintree
|
|
16
16
|
# end
|
17
17
|
# end
|
18
18
|
class ErrorResult
|
19
|
-
|
20
|
-
attr_reader :credit_card_verification, :errors, :params
|
21
|
-
|
19
|
+
|
20
|
+
attr_reader :credit_card_verification, :errors, :params
|
21
|
+
|
22
22
|
def initialize(data) # :nodoc:
|
23
23
|
@params = data[:params]
|
24
24
|
if data[:verification]
|
@@ -30,7 +30,7 @@ module Braintree
|
|
30
30
|
def inspect # :nodoc:
|
31
31
|
"#<#{self.class} params:{...} errors:<#{@errors._inner_inspect}>>"
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
# Always returns false.
|
35
35
|
def success?
|
36
36
|
false
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Braintree # :nodoc:
|
2
|
+
# Super class for all Braintree exceptions.
|
3
|
+
class BraintreeError < ::StandardError; end
|
4
|
+
|
5
|
+
# Raised when authentication fails. This may be caused by an incorrect <tt>Braintree::Configuration</tt>
|
6
|
+
class AuthenticationError < BraintreeError; end
|
7
|
+
|
8
|
+
# Raised when the API key being used is not authorized to perform the attempted action according
|
9
|
+
# to the roles assigned to the user who owns the API key.
|
10
|
+
class AuthorizationError < BraintreeError; end
|
11
|
+
|
12
|
+
# Raised when the Braintree gem is not completely configured. See <tt>Braintree::Configuration</tt>.
|
13
|
+
class ConfigurationError < BraintreeError
|
14
|
+
def initialize(setting, message) # :nodoc:
|
15
|
+
super "Braintree::Configuration.#{setting} #{message}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Raised when the gateway is down for maintenance.
|
20
|
+
class DownForMaintenanceError < BraintreeError; end
|
21
|
+
|
22
|
+
# Raised from methods that confirm transparent request requests
|
23
|
+
# when the given query string cannot be verified. This may indicate
|
24
|
+
# an attempted hack on the merchant's transparent redirect
|
25
|
+
# confirmation URL.
|
26
|
+
class ForgedQueryString < BraintreeError; end
|
27
|
+
|
28
|
+
# Raised when a record could not be found.
|
29
|
+
class NotFoundError < BraintreeError; end
|
30
|
+
|
31
|
+
# Raised when an unexpected server error occurs.
|
32
|
+
class ServerError < BraintreeError; end
|
33
|
+
|
34
|
+
# Raised when the SSL certificate fails verification.
|
35
|
+
class SSLCertificateError < BraintreeError; end
|
36
|
+
|
37
|
+
# Raised when an error occurs that the client library is not built to handle.
|
38
|
+
# This shouldn't happen.
|
39
|
+
class UnexpectedError < BraintreeError; end
|
40
|
+
|
41
|
+
# Raised from bang methods when validations fail.
|
42
|
+
class ValidationsFailed < BraintreeError
|
43
|
+
attr_reader :error_result
|
44
|
+
|
45
|
+
def initialize(error_result)
|
46
|
+
@error_result = error_result
|
47
|
+
end
|
48
|
+
|
49
|
+
def inspect
|
50
|
+
"#<#{self.class} error_result: #{@error_result.inspect}>"
|
51
|
+
end
|
52
|
+
|
53
|
+
def to_s
|
54
|
+
inspect
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
data/lib/braintree/http.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Braintree
|
2
2
|
module Http # :nodoc:
|
3
|
-
|
3
|
+
|
4
4
|
def self.delete(path)
|
5
5
|
response = _http_do Net::HTTP::Delete, path
|
6
6
|
if response.code.to_i == 200
|
@@ -9,7 +9,7 @@ module Braintree
|
|
9
9
|
Util.raise_exception_for_status_code(response.code)
|
10
10
|
end
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
def self.get(path)
|
14
14
|
response = _http_do Net::HTTP::Get, path
|
15
15
|
if response.code.to_i == 200
|
@@ -18,7 +18,7 @@ module Braintree
|
|
18
18
|
Util.raise_exception_for_status_code(response.code)
|
19
19
|
end
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
def self.post(path, params = nil)
|
23
23
|
response = _http_do Net::HTTP::Post, path, _build_xml(params)
|
24
24
|
if response.code.to_i == 200 || response.code.to_i == 201 || response.code.to_i == 422
|
@@ -27,7 +27,7 @@ module Braintree
|
|
27
27
|
Util.raise_exception_for_status_code(response.code)
|
28
28
|
end
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def self.put(path, params = nil)
|
32
32
|
response = _http_do Net::HTTP::Put, path, _build_xml(params)
|
33
33
|
if response.code.to_i == 200 || response.code.to_i == 201 || response.code.to_i == 422
|
@@ -41,7 +41,7 @@ module Braintree
|
|
41
41
|
return nil if params.nil?
|
42
42
|
Braintree::Xml.hash_to_xml params
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
def self._http_do(http_verb, path, body = nil)
|
46
46
|
connection = Net::HTTP.new(Configuration.server, Configuration.port)
|
47
47
|
if Configuration.ssl?
|
@@ -80,11 +80,11 @@ module Braintree
|
|
80
80
|
raise UnexpectedError, "expected a gzip'd response"
|
81
81
|
end
|
82
82
|
end
|
83
|
-
|
83
|
+
|
84
84
|
def self._current_time
|
85
85
|
Time.now.utc.strftime("%d/%b/%Y %H:%M:%S %Z")
|
86
86
|
end
|
87
|
-
|
87
|
+
|
88
88
|
def self._format_and_sanitize_body_for_log(input_xml)
|
89
89
|
formatted_xml = input_xml.gsub(/^/, "[Braintree] ")
|
90
90
|
formatted_xml = formatted_xml.gsub(/<number>(.{6}).+?(.{4})<\/number>/, '<number>\1******\2</number>')
|
@@ -2,9 +2,9 @@ module Braintree
|
|
2
2
|
class PagedCollection
|
3
3
|
include BaseModule
|
4
4
|
include Enumerable
|
5
|
-
|
5
|
+
|
6
6
|
attr_reader :current_page_number, :items, :next_page_number, :page_size, :previous_page_number, :total_items
|
7
|
-
|
7
|
+
|
8
8
|
def initialize(attributes, &block) # :nodoc:
|
9
9
|
set_instance_variables_from_hash attributes
|
10
10
|
@paging_block = block
|
@@ -14,11 +14,11 @@ module Braintree
|
|
14
14
|
def [](index)
|
15
15
|
@items[index]
|
16
16
|
end
|
17
|
-
|
18
|
-
# Yields each item on the current page.
|
17
|
+
|
18
|
+
# Yields each item on the current page.
|
19
19
|
def each(&block)
|
20
20
|
@items.each(&block)
|
21
|
-
end
|
21
|
+
end
|
22
22
|
|
23
23
|
# Returns the first item from the current page.
|
24
24
|
def first
|
@@ -29,27 +29,27 @@ module Braintree
|
|
29
29
|
def last_page?
|
30
30
|
current_page_number == total_pages
|
31
31
|
end
|
32
|
-
|
33
|
-
# Retrieves the next page of records.
|
32
|
+
|
33
|
+
# Retrieves the next page of records.
|
34
34
|
def next_page
|
35
35
|
if last_page?
|
36
36
|
return nil
|
37
37
|
end
|
38
38
|
@paging_block.call(next_page_number)
|
39
39
|
end
|
40
|
-
|
41
|
-
# The next page number. Returns +nil+ if on the last page.
|
40
|
+
|
41
|
+
# The next page number. Returns +nil+ if on the last page.
|
42
42
|
def next_page_number
|
43
43
|
last_page? ? nil : current_page_number + 1
|
44
44
|
end
|
45
|
-
|
46
|
-
# Returns the total number of pages.
|
45
|
+
|
46
|
+
# Returns the total number of pages.
|
47
47
|
def total_pages
|
48
|
-
total = total_items / page_size
|
48
|
+
total = total_items / page_size
|
49
49
|
if total_items % page_size != 0
|
50
50
|
total += 1
|
51
|
-
end
|
51
|
+
end
|
52
52
|
total
|
53
|
-
end
|
53
|
+
end
|
54
54
|
end
|
55
55
|
end
|
@@ -7,7 +7,8 @@ module Braintree
|
|
7
7
|
def self.check_dates # :nodoc:
|
8
8
|
{
|
9
9
|
"QA" => qa_expiration_date,
|
10
|
-
"Sandbox" => sandbox_expiration_date
|
10
|
+
"Sandbox" => sandbox_expiration_date,
|
11
|
+
"Production" => production_expiration_date
|
11
12
|
}.each do |host, expiration_date|
|
12
13
|
if Date.today + (3 * 30) > expiration_date
|
13
14
|
Configuration.logger.warn "[Braintree] The SSL Certificate for the #{host} environment will expire on #{expiration_date}. Please check for an updated client library."
|
@@ -16,6 +17,9 @@ module Braintree
|
|
16
17
|
@ssl_expiration_dates_checked = true
|
17
18
|
end
|
18
19
|
|
20
|
+
def self.production_expiration_date # :nodoc:
|
21
|
+
Date.new(2012, 1, 8)
|
22
|
+
end
|
19
23
|
|
20
24
|
def self.sandbox_expiration_date # :nodoc:
|
21
25
|
Date.new(2010, 12, 1)
|