braintree 1.0.1 → 1.1.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.
- 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
data/lib/braintree.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
require 'bigdecimal'
|
1
2
|
require "cgi"
|
2
3
|
require "digest/sha1"
|
3
4
|
require "logger"
|
4
5
|
require "net/http"
|
5
6
|
require "net/https"
|
7
|
+
require "openssl"
|
6
8
|
require "stringio"
|
7
9
|
require "time"
|
8
10
|
require "zlib"
|
@@ -13,54 +15,42 @@ unless ::LibXML::XML.respond_to?(:default_keep_blanks=)
|
|
13
15
|
raise LoadError, "The version of libxml that you're using is not compatible with the Braintree gem."
|
14
16
|
end
|
15
17
|
|
16
|
-
module Braintree
|
17
|
-
# Super class for all Braintree exceptions.
|
18
|
-
class BraintreeError < ::StandardError; end
|
19
|
-
|
20
|
-
# Raised when authentication fails. This may be caused by an incorrect <tt>Braintree::Configuration</tt>
|
21
|
-
class AuthenticationError < BraintreeError; end
|
22
|
-
|
23
|
-
# Raised when the API key being used is not authorized to perform the attempted action according
|
24
|
-
# to the roles assigned to the user who owns the API key.
|
25
|
-
class AuthorizationError < BraintreeError; end
|
26
|
-
|
27
|
-
# Raised when the Braintree gem is not completely configured. See <tt>Braintree::Configuration</tt>.
|
28
|
-
class ConfigurationError < BraintreeError
|
29
|
-
def initialize(setting, message) # :nodoc:
|
30
|
-
super "Braintree::Configuration.#{setting} #{message}"
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
# Raised when the gateway is down for maintenance.
|
35
|
-
class DownForMaintenanceError < BraintreeError; end
|
36
|
-
|
37
|
-
# Raised from methods that confirm transparent request requests
|
38
|
-
# when the given query string cannot be verified. This may indicate
|
39
|
-
# an attempted hack on the merchant's transparent redirect
|
40
|
-
# confirmation URL.
|
41
|
-
class ForgedQueryString < BraintreeError; end
|
42
|
-
|
43
|
-
# Raised when a record could not be found.
|
44
|
-
class NotFoundError < BraintreeError; end
|
45
|
-
|
46
|
-
# Raised when an unexpected server error occurs.
|
47
|
-
class ServerError < BraintreeError; end
|
48
|
-
|
49
|
-
# Raised when the SSL certificate fails verification.
|
50
|
-
class SSLCertificateError < BraintreeError; end
|
51
|
-
|
52
|
-
# Raised when an error occurs that the client library is not built to handle.
|
53
|
-
# This shouldn't happen.
|
54
|
-
class UnexpectedError < BraintreeError; end
|
55
|
-
|
56
|
-
# Raised from bang methods when validations fail.
|
57
|
-
class ValidationsFailed < BraintreeError; end
|
18
|
+
module Braintree
|
58
19
|
end
|
59
20
|
|
21
|
+
require "braintree/exceptions"
|
60
22
|
require "braintree/base_module"
|
61
23
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
24
|
+
require "braintree/address.rb"
|
25
|
+
require "braintree/configuration.rb"
|
26
|
+
require "braintree/credit_card.rb"
|
27
|
+
require "braintree/credit_card_verification.rb"
|
28
|
+
require "braintree/customer.rb"
|
29
|
+
require "braintree/digest.rb"
|
30
|
+
require "braintree/error_codes.rb"
|
31
|
+
require "braintree/error_result.rb"
|
32
|
+
require "braintree/errors.rb"
|
33
|
+
require "braintree/http.rb"
|
34
|
+
require "braintree/paged_collection.rb"
|
35
|
+
require "braintree/ssl_expiration_check.rb"
|
36
|
+
require "braintree/subscription"
|
37
|
+
require "braintree/successful_result.rb"
|
38
|
+
require "braintree/test/credit_card_numbers.rb"
|
39
|
+
require "braintree/test/transaction_amounts.rb"
|
40
|
+
require "braintree/transaction.rb"
|
41
|
+
require "braintree/transaction/address_details.rb"
|
42
|
+
require "braintree/transaction/credit_card_details.rb"
|
43
|
+
require "braintree/transaction/customer_details.rb"
|
44
|
+
require "braintree/transaction/status_details.rb"
|
45
|
+
require "braintree/transparent_redirect.rb"
|
46
|
+
require "braintree/util.rb"
|
47
|
+
require "braintree/validation_error.rb"
|
48
|
+
require "braintree/validation_error_collection.rb"
|
49
|
+
require "braintree/version.rb"
|
50
|
+
require "braintree/xml.rb"
|
51
|
+
require "braintree/xml/generator.rb"
|
52
|
+
require "braintree/xml/libxml.rb"
|
53
|
+
require "braintree/xml/parser.rb"
|
54
|
+
|
66
55
|
Braintree::SSLExpirationCheck.check_dates
|
56
|
+
|
data/lib/braintree/address.rb
CHANGED
@@ -4,10 +4,10 @@ module Braintree
|
|
4
4
|
# as the shipping address when creating a Transaction.
|
5
5
|
class Address
|
6
6
|
include BaseModule # :nodoc:
|
7
|
-
|
7
|
+
|
8
8
|
attr_reader :company, :country_name, :created_at, :customer_id, :extended_address, :first_name, :id,
|
9
9
|
:last_name, :locality, :postal_code, :region, :street_address, :updated_at
|
10
|
-
|
10
|
+
|
11
11
|
def self.create(attributes)
|
12
12
|
Util.verify_keys(_create_signature, attributes)
|
13
13
|
unless attributes[:customer_id]
|
@@ -25,17 +25,17 @@ module Braintree
|
|
25
25
|
raise UnexpectedError, "expected :address or :api_error_response"
|
26
26
|
end
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
def self.create!(attributes)
|
30
30
|
return_object_or_raise(:address) { create(attributes) }
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
def self.delete(customer_or_customer_id, address_id)
|
34
34
|
customer_id = _determine_customer_id(customer_or_customer_id)
|
35
35
|
Http.delete("/customers/#{customer_id}/addresses/#{address_id}")
|
36
36
|
SuccessfulResult.new
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
# Finds the address with the given +address_id+ that is associated to the given +customer_or_customer_id+.
|
40
40
|
# If the address cannot be found, a NotFoundError will be raised.
|
41
41
|
def self.find(customer_or_customer_id, address_id)
|
@@ -45,7 +45,7 @@ module Braintree
|
|
45
45
|
rescue NotFoundError
|
46
46
|
raise NotFoundError, "address for customer #{customer_id.inspect} with id #{address_id.inspect} not found"
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
def self.update(customer_or_customer_id, address_id, attributes)
|
50
50
|
Util.verify_keys(_update_signature, attributes)
|
51
51
|
customer_id = _determine_customer_id(customer_or_customer_id)
|
@@ -58,20 +58,20 @@ module Braintree
|
|
58
58
|
raise UnexpectedError, "expected :address or :api_error_response"
|
59
59
|
end
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
def self.update!(customer_or_customer_id, address_id, attributes)
|
63
63
|
return_object_or_raise(:address) { update(customer_or_customer_id, address_id, attributes) }
|
64
64
|
end
|
65
|
-
|
65
|
+
|
66
66
|
def initialize(attributes) # :nodoc:
|
67
67
|
set_instance_variables_from_hash(attributes)
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
def ==(other) # :nodoc:
|
71
71
|
return false unless other.is_a?(Address)
|
72
72
|
id == other.id && customer_id == other.customer_id
|
73
73
|
end
|
74
|
-
|
74
|
+
|
75
75
|
# Deletes the address.
|
76
76
|
def delete
|
77
77
|
Address.delete(customer_id, self.id)
|
@@ -89,7 +89,7 @@ module Braintree
|
|
89
89
|
raise UnexpectedError, "expected :address or :api_error_response"
|
90
90
|
end
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
def update!(attributes)
|
94
94
|
return_object_or_raise(:address) { update(attributes) }
|
95
95
|
end
|
@@ -97,12 +97,12 @@ module Braintree
|
|
97
97
|
class << self
|
98
98
|
protected :new
|
99
99
|
end
|
100
|
-
|
100
|
+
|
101
101
|
def self._create_signature # :nodoc:
|
102
102
|
[:company, :country_name, :customer_id, :extended_address, :first_name,
|
103
103
|
:last_name, :locality, :postal_code, :region, :street_address]
|
104
104
|
end
|
105
|
-
|
105
|
+
|
106
106
|
def self._determine_customer_id(customer_or_customer_id) # :nodoc:
|
107
107
|
customer_id = customer_or_customer_id.is_a?(Customer) ? customer_or_customer_id.id : customer_or_customer_id
|
108
108
|
unless customer_id =~ /\A[\w_-]+\z/
|
@@ -114,7 +114,7 @@ module Braintree
|
|
114
114
|
def self._new(*args) # :nodoc:
|
115
115
|
self.new *args
|
116
116
|
end
|
117
|
-
|
117
|
+
|
118
118
|
def self._update_signature # :nodoc:
|
119
119
|
_create_signature
|
120
120
|
end
|
@@ -6,7 +6,7 @@ module Braintree
|
|
6
6
|
if result.success?
|
7
7
|
result.send object_to_return
|
8
8
|
else
|
9
|
-
raise ValidationsFailed
|
9
|
+
raise ValidationsFailed.new(result)
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
@@ -15,12 +15,12 @@ module Braintree
|
|
15
15
|
instance_variable_set "@#{key}", value
|
16
16
|
end
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
def singleton_class
|
20
20
|
class << self; self; end
|
21
21
|
end
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
def self.included(klass)
|
25
25
|
klass.extend Methods
|
26
26
|
end
|
@@ -14,7 +14,7 @@ module Braintree
|
|
14
14
|
attr_accessor :logger
|
15
15
|
attr_writer :merchant_id, :public_key, :private_key
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
def self.expectant_reader(*attributes) # :nodoc:
|
19
19
|
attributes.each do |attribute|
|
20
20
|
(class << self; self; end).send(:define_method, attribute) do
|
@@ -25,11 +25,11 @@ module Braintree
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
expectant_reader :environment, :merchant_id, :public_key, :private_key
|
28
|
-
|
28
|
+
|
29
29
|
def self.base_merchant_url # :nodoc:
|
30
30
|
"#{protocol}://#{server}:#{port}#{base_merchant_path}"
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
def self.base_merchant_path # :nodoc:
|
34
34
|
"/merchants/#{Braintree::Configuration.merchant_id}"
|
35
35
|
end
|
@@ -42,19 +42,19 @@ module Braintree
|
|
42
42
|
File.expand_path(File.join(File.dirname(__FILE__), "..", "ssl", "securetrust_ca.crt"))
|
43
43
|
end
|
44
44
|
end
|
45
|
-
|
46
|
-
# Sets the Braintree environment to use. Valid values are <tt>:sandbox</tt> and <tt>:production</tt>
|
45
|
+
|
46
|
+
# Sets the Braintree environment to use. Valid values are <tt>:sandbox</tt> and <tt>:production</tt>
|
47
47
|
def self.environment=(env)
|
48
48
|
unless [:development, :qa, :sandbox, :production].include?(env)
|
49
49
|
raise ArgumentError, "#{env.inspect} is not a valid environment"
|
50
50
|
end
|
51
51
|
@environment = env
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
def self.logger # :nodoc:
|
55
55
|
@logger ||= _default_logger
|
56
56
|
end
|
57
|
-
|
57
|
+
|
58
58
|
def self.port # :nodoc:
|
59
59
|
case environment
|
60
60
|
when :development
|
@@ -63,11 +63,11 @@ module Braintree
|
|
63
63
|
443
|
64
64
|
end
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
def self.protocol # :nodoc:
|
68
68
|
ssl? ? "https" : "http"
|
69
69
|
end
|
70
|
-
|
70
|
+
|
71
71
|
def self.server # :nodoc:
|
72
72
|
case environment
|
73
73
|
when :development
|
@@ -75,25 +75,25 @@ module Braintree
|
|
75
75
|
when :production
|
76
76
|
"www.braintreegateway.com"
|
77
77
|
when :qa
|
78
|
-
"qa.braintreegateway.com"
|
78
|
+
"qa-master.braintreegateway.com"
|
79
79
|
when :sandbox
|
80
80
|
"sandbox.braintreegateway.com"
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
84
|
def self.ssl? # :nodoc:
|
85
85
|
case environment
|
86
86
|
when :development
|
87
87
|
false
|
88
88
|
when :production, :qa, :sandbox
|
89
89
|
true
|
90
|
-
end
|
90
|
+
end
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
def self._default_logger # :nodoc:
|
94
94
|
logger = Logger.new(STDOUT)
|
95
95
|
logger.level = Logger::INFO
|
96
96
|
logger
|
97
|
-
end
|
97
|
+
end
|
98
98
|
end
|
99
99
|
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module Braintree
|
2
2
|
class CreditCard
|
3
3
|
include BaseModule # :nodoc:
|
4
|
-
|
4
|
+
|
5
5
|
attr_reader :billing_address, :bin, :card_type, :cardholder_name, :created_at, :customer_id, :expiration_month,
|
6
6
|
:expiration_year, :last_4, :token, :updated_at
|
7
|
-
|
7
|
+
|
8
8
|
def self.create(attributes)
|
9
9
|
if attributes.has_key?(:expiration_date) && (attributes.has_key?(:expiration_month) || attributes.has_key?(:expiration_year))
|
10
10
|
raise ArgumentError.new("create with both expiration_month and expiration_year or only expiration_date")
|
@@ -12,31 +12,31 @@ module Braintree
|
|
12
12
|
Util.verify_keys(_create_signature, attributes)
|
13
13
|
_do_create("/payment_methods", :credit_card => attributes)
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
def self.create!(attributes)
|
17
17
|
return_object_or_raise(:credit_card) { create(attributes) }
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
# The transparent redirect URL to use to create a credit card.
|
21
21
|
def self.create_credit_card_url
|
22
22
|
"#{Braintree::Configuration.base_merchant_url}/payment_methods/all/create_via_transparent_redirect_request"
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
def self.create_from_transparent_redirect(query_string)
|
26
26
|
params = TransparentRedirect.parse_and_validate_query_string query_string
|
27
27
|
_do_create("/payment_methods/all/confirm_transparent_redirect_request", :id => params[:id])
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
def self.credit(token, transaction_attributes)
|
31
31
|
Transaction.credit(transaction_attributes.merge(
|
32
32
|
:payment_method_token => token
|
33
33
|
))
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
def self.credit!(token, transaction_attributes)
|
37
37
|
return_object_or_raise(:transaction) { credit(token, transaction_attributes) }
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
# Returns a PagedCollection of expired credit cards.
|
41
41
|
def self.expired(options = {})
|
42
42
|
page_number = options[:page] || 1
|
@@ -47,7 +47,7 @@ module Braintree
|
|
47
47
|
end
|
48
48
|
PagedCollection.new(attributes) { |page_number| CreditCard.expired(:page => page_number) }
|
49
49
|
end
|
50
|
-
|
50
|
+
|
51
51
|
# Returns a PagedCollection of credit cards expiring between +start_date+ and +end_date+ inclusive.
|
52
52
|
# Only the month and year of the start and end dates are used.
|
53
53
|
def self.expiring_between(start_date, end_date, options = {})
|
@@ -59,7 +59,7 @@ module Braintree
|
|
59
59
|
end
|
60
60
|
PagedCollection.new(attributes) { |page_number| CreditCard.expiring_between(start_date, end_date, :page => page_number) }
|
61
61
|
end
|
62
|
-
|
62
|
+
|
63
63
|
# Finds the credit card with the given +token+. Raises a NotFoundError if it cannot be found.
|
64
64
|
def self.find(token)
|
65
65
|
response = Http.get "/payment_methods/#{token}"
|
@@ -67,17 +67,26 @@ module Braintree
|
|
67
67
|
rescue NotFoundError
|
68
68
|
raise NotFoundError, "payment method with token #{token.inspect} not found"
|
69
69
|
end
|
70
|
-
|
70
|
+
|
71
71
|
def self.sale(token, transaction_attributes)
|
72
72
|
Transaction.sale(transaction_attributes.merge(
|
73
73
|
:payment_method_token => token
|
74
74
|
))
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
77
|
def self.sale!(token, transaction_attributes)
|
78
78
|
return_object_or_raise(:transaction) { sale(token, transaction_attributes) }
|
79
79
|
end
|
80
80
|
|
81
|
+
def self.update(token, attributes)
|
82
|
+
Util.verify_keys(_update_signature, attributes)
|
83
|
+
_do_update(:put, "/payment_methods/#{token}", :credit_card => attributes)
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.update!(token, attributes)
|
87
|
+
return_object_or_raise(:credit_card) { update(token, attributes) }
|
88
|
+
end
|
89
|
+
|
81
90
|
def self.update_from_transparent_redirect(query_string)
|
82
91
|
params = TransparentRedirect.parse_and_validate_query_string query_string
|
83
92
|
_do_update(:post, "/payment_methods/all/confirm_transparent_redirect_request", :id => params[:id])
|
@@ -87,7 +96,7 @@ module Braintree
|
|
87
96
|
def self.update_credit_card_url
|
88
97
|
"#{Braintree::Configuration.base_merchant_url}/payment_methods/all/update_via_transparent_redirect_request"
|
89
98
|
end
|
90
|
-
|
99
|
+
|
91
100
|
def initialize(attributes) # :nodoc:
|
92
101
|
_init attributes
|
93
102
|
end
|
@@ -98,33 +107,33 @@ module Braintree
|
|
98
107
|
:payment_method_token => self.token
|
99
108
|
))
|
100
109
|
end
|
101
|
-
|
110
|
+
|
102
111
|
def credit!(transaction_attributes)
|
103
112
|
return_object_or_raise(:transaction) { credit(transaction_attributes) }
|
104
113
|
end
|
105
|
-
|
114
|
+
|
106
115
|
def delete
|
107
116
|
Http.delete("/payment_methods/#{token}")
|
108
117
|
end
|
109
|
-
|
118
|
+
|
110
119
|
# Returns true if this credit card is the customer's default.
|
111
120
|
def default?
|
112
121
|
@default
|
113
122
|
end
|
114
|
-
|
123
|
+
|
115
124
|
# Expiration date formatted as MM/YYYY
|
116
125
|
def expiration_date
|
117
126
|
"#{expiration_month}/#{expiration_year}"
|
118
127
|
end
|
119
|
-
|
120
|
-
# Returns true if the credit card is expired.
|
128
|
+
|
129
|
+
# Returns true if the credit card is expired.
|
121
130
|
def expired?
|
122
131
|
if expiration_year.to_i == Time.now.year
|
123
132
|
return expiration_month.to_i < Time.now.month
|
124
133
|
end
|
125
|
-
expiration_year.to_i < Time.now.year
|
134
|
+
expiration_year.to_i < Time.now.year
|
126
135
|
end
|
127
|
-
|
136
|
+
|
128
137
|
def inspect # :nodoc:
|
129
138
|
first = [:token]
|
130
139
|
order = first + (self.class._attributes - first)
|
@@ -133,20 +142,20 @@ module Braintree
|
|
133
142
|
end
|
134
143
|
"#<#{self.class} #{nice_attributes.join(', ')}>"
|
135
144
|
end
|
136
|
-
|
145
|
+
|
137
146
|
def masked_number
|
138
147
|
"#{bin}******#{last_4}"
|
139
148
|
end
|
140
|
-
|
141
|
-
# Creates a sale transaction for this credit card.
|
149
|
+
|
150
|
+
# Creates a sale transaction for this credit card.
|
142
151
|
def sale(transaction_attributes)
|
143
152
|
CreditCard.sale(self.token, transaction_attributes)
|
144
153
|
end
|
145
|
-
|
154
|
+
|
146
155
|
def sale!(transaction_attributes)
|
147
156
|
return_object_or_raise(:transaction) { sale(transaction_attributes) }
|
148
157
|
end
|
149
|
-
|
158
|
+
|
150
159
|
def update(attributes)
|
151
160
|
Util.verify_keys(self.class._update_signature, attributes)
|
152
161
|
response = Http.put "/payment_methods/#{token}", :credit_card => attributes
|
@@ -157,9 +166,9 @@ module Braintree
|
|
157
166
|
ErrorResult.new(response[:api_error_response])
|
158
167
|
else
|
159
168
|
raise UnexpectedError, "expected :credit_card or :api_error_response"
|
160
|
-
end
|
169
|
+
end
|
161
170
|
end
|
162
|
-
|
171
|
+
|
163
172
|
def update!(attributes)
|
164
173
|
return_object_or_raise(:credit_card) { update(attributes) }
|
165
174
|
end
|
@@ -191,7 +200,7 @@ module Braintree
|
|
191
200
|
|
192
201
|
def self._new(*args) # :nodoc:
|
193
202
|
self.new *args
|
194
|
-
end
|
203
|
+
end
|
195
204
|
|
196
205
|
def self._do_create(url, params) # :nodoc:
|
197
206
|
response = Http.post url, params
|
@@ -228,4 +237,4 @@ module Braintree
|
|
228
237
|
@billing_address = attributes[:billing_address] ? Address._new(attributes[:billing_address]) : nil
|
229
238
|
end
|
230
239
|
end
|
231
|
-
end
|
240
|
+
end
|