braintree 2.4.0 → 2.5.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.
- data/README.rdoc +4 -0
- data/lib/braintree.rb +43 -32
- data/lib/braintree/add_on.rb +4 -0
- data/lib/braintree/address.rb +18 -72
- data/lib/braintree/address_gateway.rb +76 -0
- data/lib/braintree/advanced_search.rb +31 -13
- data/lib/braintree/base_module.rb +6 -0
- data/lib/braintree/configuration.rb +57 -39
- data/lib/braintree/credit_card.rb +75 -129
- data/lib/braintree/credit_card_gateway.rb +133 -0
- data/lib/braintree/credit_card_verification.rb +8 -0
- data/lib/braintree/customer.rb +70 -123
- data/lib/braintree/customer_gateway.rb +121 -0
- data/lib/braintree/digest.rb +2 -2
- data/lib/braintree/discount.rb +4 -0
- data/lib/braintree/error_codes.rb +50 -5
- data/lib/braintree/error_result.rb +4 -18
- data/lib/braintree/errors.rb +1 -2
- data/lib/braintree/exceptions.rb +11 -16
- data/lib/braintree/gateway.rb +39 -0
- data/lib/braintree/http.rb +30 -26
- data/lib/braintree/modification.rb +23 -0
- data/lib/braintree/resource_collection.rb +1 -1
- data/lib/braintree/subscription.rb +29 -129
- data/lib/braintree/subscription_gateway.rb +122 -0
- data/lib/braintree/subscription_search.rb +6 -7
- data/lib/braintree/successful_result.rb +1 -12
- data/lib/braintree/test/credit_card_numbers.rb +4 -2
- data/lib/braintree/test/transaction_amounts.rb +3 -0
- data/lib/braintree/transaction.rb +83 -243
- data/lib/braintree/transaction/credit_card_details.rb +4 -4
- data/lib/braintree/transaction_gateway.rb +124 -0
- data/lib/braintree/transaction_search.rb +5 -3
- data/lib/braintree/transparent_redirect.rb +19 -112
- data/lib/braintree/transparent_redirect_gateway.rb +105 -0
- data/lib/braintree/util.rb +4 -0
- data/lib/braintree/validation_error.rb +1 -0
- data/lib/braintree/validation_error_collection.rb +5 -23
- data/lib/braintree/version.rb +2 -2
- data/lib/braintree/xml/parser.rb +1 -1
- data/lib/braintree/xml/rexml.rb +2 -2
- data/spec/integration/braintree/advanced_search_spec.rb +532 -0
- data/spec/integration/braintree/credit_card_spec.rb +5 -8
- data/spec/integration/braintree/http_spec.rb +53 -39
- data/spec/integration/braintree/subscription_spec.rb +678 -213
- data/spec/integration/braintree/transaction_search_spec.rb +318 -43
- data/spec/integration/braintree/transaction_spec.rb +134 -3
- data/spec/integration/braintree/transparent_redirect_spec.rb +1 -1
- data/spec/spec_helper.rb +55 -4
- data/spec/unit/braintree/address_spec.rb +8 -8
- data/spec/unit/braintree/base_module_spec.rb +1 -1
- data/spec/unit/braintree/configuration_spec.rb +34 -29
- data/spec/unit/braintree/credit_card_spec.rb +14 -12
- data/spec/unit/braintree/credit_card_verification_spec.rb +16 -0
- data/spec/unit/braintree/customer_spec.rb +10 -8
- data/spec/unit/braintree/digest_spec.rb +8 -17
- data/spec/unit/braintree/error_result_spec.rb +12 -2
- data/spec/unit/braintree/http_spec.rb +2 -2
- data/spec/unit/braintree/subscription_search_spec.rb +77 -0
- data/spec/unit/braintree/subscription_spec.rb +16 -8
- data/spec/unit/braintree/transaction_spec.rb +17 -12
- data/spec/unit/braintree/transparent_redirect_spec.rb +12 -12
- data/spec/unit/braintree/util_spec.rb +24 -0
- data/spec/unit/braintree/xml/parser_spec.rb +1 -1
- data/spec/unit/braintree_spec.rb +1 -1
- metadata +16 -5
@@ -1,29 +1,15 @@
|
|
1
1
|
module Braintree
|
2
|
-
#
|
3
|
-
# validations fail. It will provide access to the params passed
|
4
|
-
# to the server. The params are primarily useful for re-populaing
|
5
|
-
# web forms when using transparent redirect. ErrorResult also
|
6
|
-
# provides access to the validation errors.
|
7
|
-
#
|
8
|
-
# result = Braintree::Customer.create(:email => "invalid.email.address")
|
9
|
-
# if result.success?
|
10
|
-
# # have a SuccessfulResult
|
11
|
-
# else
|
12
|
-
# # have an ErrorResult
|
13
|
-
# puts "Validations failed when attempting to create customer."
|
14
|
-
# result.errors.for(:customer).each do |error|
|
15
|
-
# puts error.message
|
16
|
-
# end
|
17
|
-
# end
|
2
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/general/result_objects
|
18
3
|
class ErrorResult
|
19
4
|
|
20
5
|
attr_reader :credit_card_verification, :transaction, :errors, :params, :message
|
21
6
|
|
22
|
-
def initialize(data) # :nodoc:
|
7
|
+
def initialize(gateway, data) # :nodoc:
|
8
|
+
@gateway = gateway
|
23
9
|
@params = data[:params]
|
24
10
|
@credit_card_verification = CreditCardVerification._new(data[:verification]) if data[:verification]
|
25
11
|
@message = data[:message]
|
26
|
-
@transaction = Transaction._new(data[:transaction]) if data[:transaction]
|
12
|
+
@transaction = Transaction._new(gateway, data[:transaction]) if data[:transaction]
|
27
13
|
@errors = Errors.new(data[:errors])
|
28
14
|
end
|
29
15
|
|
data/lib/braintree/errors.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Braintree
|
2
|
-
#
|
2
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/general/validation_errors
|
3
3
|
class Errors
|
4
4
|
include Enumerable
|
5
5
|
|
@@ -11,7 +11,6 @@ module Braintree
|
|
11
11
|
@errors.deep_errors.each(&block)
|
12
12
|
end
|
13
13
|
|
14
|
-
# Accesses validation errors for the given +scope+.
|
15
14
|
def for(scope)
|
16
15
|
@errors.for(scope)
|
17
16
|
end
|
data/lib/braintree/exceptions.rb
CHANGED
@@ -2,46 +2,41 @@ module Braintree # :nodoc:
|
|
2
2
|
# Super class for all Braintree exceptions.
|
3
3
|
class BraintreeError < ::StandardError; end
|
4
4
|
|
5
|
-
#
|
5
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/general/exceptions
|
6
6
|
class AuthenticationError < BraintreeError; end
|
7
7
|
|
8
|
-
#
|
9
|
-
# to the roles assigned to the user who owns the API key.
|
8
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/general/exceptions
|
10
9
|
class AuthorizationError < BraintreeError; end
|
11
10
|
|
12
|
-
#
|
11
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/general/exceptions
|
13
12
|
class ConfigurationError < BraintreeError
|
14
13
|
def initialize(setting, message) # :nodoc:
|
15
14
|
super "Braintree::Configuration.#{setting} #{message}"
|
16
15
|
end
|
17
16
|
end
|
18
17
|
|
19
|
-
#
|
18
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/general/exceptions
|
20
19
|
class DownForMaintenanceError < BraintreeError; end
|
21
20
|
|
22
|
-
#
|
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.
|
21
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/general/exceptions
|
26
22
|
class ForgedQueryString < BraintreeError; end
|
27
23
|
|
28
|
-
#
|
24
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/general/exceptions
|
29
25
|
class NotFoundError < BraintreeError; end
|
30
26
|
|
31
|
-
#
|
27
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/general/exceptions
|
32
28
|
class ServerError < BraintreeError; end
|
33
29
|
|
34
|
-
#
|
30
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/general/exceptions
|
35
31
|
class SSLCertificateError < BraintreeError; end
|
36
32
|
|
37
|
-
#
|
38
|
-
# This shouldn't happen.
|
33
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/general/exceptions
|
39
34
|
class UnexpectedError < BraintreeError; end
|
40
35
|
|
41
|
-
#
|
36
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/general/exceptions
|
42
37
|
class UpgradeRequiredError < BraintreeError; end
|
43
38
|
|
44
|
-
#
|
39
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/general/exceptions
|
45
40
|
class ValidationsFailed < BraintreeError
|
46
41
|
attr_reader :error_result
|
47
42
|
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Braintree
|
2
|
+
class Gateway # :nodoc:
|
3
|
+
attr_reader :config
|
4
|
+
|
5
|
+
def initialize(config)
|
6
|
+
if config.is_a?(Hash)
|
7
|
+
@config = Configuration.new config
|
8
|
+
elsif config.is_a?(Braintree::Configuration)
|
9
|
+
@config = config
|
10
|
+
else
|
11
|
+
raise ArgumentError, "config is an invalid type"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def address
|
16
|
+
AddressGateway.new(self)
|
17
|
+
end
|
18
|
+
|
19
|
+
def credit_card
|
20
|
+
CreditCardGateway.new(self)
|
21
|
+
end
|
22
|
+
|
23
|
+
def customer
|
24
|
+
CustomerGateway.new(self)
|
25
|
+
end
|
26
|
+
|
27
|
+
def subscription
|
28
|
+
SubscriptionGateway.new(self)
|
29
|
+
end
|
30
|
+
|
31
|
+
def transparent_redirect
|
32
|
+
TransparentRedirectGateway.new(self)
|
33
|
+
end
|
34
|
+
|
35
|
+
def transaction
|
36
|
+
TransactionGateway.new(self)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/braintree/http.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
module Braintree
|
2
|
-
|
2
|
+
class Http # :nodoc:
|
3
3
|
|
4
|
-
def
|
4
|
+
def initialize(config)
|
5
|
+
@config = config
|
6
|
+
end
|
7
|
+
|
8
|
+
def delete(path)
|
5
9
|
response = _http_do Net::HTTP::Delete, path
|
6
10
|
if response.code.to_i == 200
|
7
11
|
true
|
@@ -10,7 +14,7 @@ module Braintree
|
|
10
14
|
end
|
11
15
|
end
|
12
16
|
|
13
|
-
def
|
17
|
+
def get(path)
|
14
18
|
response = _http_do Net::HTTP::Get, path
|
15
19
|
if response.code.to_i == 200
|
16
20
|
Xml.hash_from_xml(_body(response))
|
@@ -19,7 +23,7 @@ module Braintree
|
|
19
23
|
end
|
20
24
|
end
|
21
25
|
|
22
|
-
def
|
26
|
+
def post(path, params = nil)
|
23
27
|
response = _http_do Net::HTTP::Post, path, _build_xml(params)
|
24
28
|
if response.code.to_i == 200 || response.code.to_i == 201 || response.code.to_i == 422
|
25
29
|
Xml.hash_from_xml(_body(response))
|
@@ -28,7 +32,7 @@ module Braintree
|
|
28
32
|
end
|
29
33
|
end
|
30
34
|
|
31
|
-
def
|
35
|
+
def put(path, params = nil)
|
32
36
|
response = _http_do Net::HTTP::Put, path, _build_xml(params)
|
33
37
|
if response.code.to_i == 200 || response.code.to_i == 201 || response.code.to_i == 422
|
34
38
|
Xml.hash_from_xml(_body(response))
|
@@ -37,65 +41,65 @@ module Braintree
|
|
37
41
|
end
|
38
42
|
end
|
39
43
|
|
40
|
-
def
|
44
|
+
def _build_xml(params)
|
41
45
|
return nil if params.nil?
|
42
46
|
Braintree::Xml.hash_to_xml params
|
43
47
|
end
|
44
48
|
|
45
|
-
def
|
46
|
-
connection = Net::HTTP.new(
|
47
|
-
if
|
49
|
+
def _http_do(http_verb, path, body = nil)
|
50
|
+
connection = Net::HTTP.new(@config.server, @config.port)
|
51
|
+
if @config.ssl?
|
48
52
|
connection.use_ssl = true
|
49
53
|
connection.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
50
|
-
connection.ca_file =
|
54
|
+
connection.ca_file = @config.ca_file
|
51
55
|
connection.verify_callback = proc { |preverify_ok, ssl_context| _verify_ssl_certificate(preverify_ok, ssl_context) }
|
52
56
|
end
|
53
57
|
connection.start do |http|
|
54
|
-
request = http_verb.new("#{
|
58
|
+
request = http_verb.new("#{@config.base_merchant_path}#{path}")
|
55
59
|
request["Accept"] = "application/xml"
|
56
|
-
request["User-Agent"] =
|
60
|
+
request["User-Agent"] = @config.user_agent
|
57
61
|
request["Accept-Encoding"] = "gzip"
|
58
|
-
request["X-ApiVersion"] =
|
59
|
-
request.basic_auth
|
60
|
-
|
62
|
+
request["X-ApiVersion"] = @config.api_version
|
63
|
+
request.basic_auth @config.public_key, @config.private_key
|
64
|
+
@config.logger.debug "[Braintree] [#{_current_time}] #{request.method} #{path}"
|
61
65
|
if body
|
62
66
|
request["Content-Type"] = "application/xml"
|
63
67
|
request.body = body
|
64
|
-
|
68
|
+
@config.logger.debug _format_and_sanitize_body_for_log(body)
|
65
69
|
end
|
66
70
|
response = http.request(request)
|
67
|
-
|
68
|
-
|
69
|
-
if
|
70
|
-
|
71
|
+
@config.logger.info "[Braintree] [#{_current_time}] #{request.method} #{path} #{response.code}"
|
72
|
+
@config.logger.debug "[Braintree] [#{_current_time}] #{response.code} #{response.message}"
|
73
|
+
if @config.logger.level == Logger::DEBUG
|
74
|
+
@config.logger.debug _format_and_sanitize_body_for_log(_body(response))
|
71
75
|
end
|
72
76
|
response
|
73
77
|
end
|
74
78
|
end
|
75
79
|
|
76
|
-
def
|
80
|
+
def _body(response)
|
77
81
|
if response.header["Content-Encoding"] == "gzip"
|
78
82
|
Zlib::GzipReader.new(StringIO.new(response.body)).read
|
79
83
|
else
|
80
|
-
raise UnexpectedError, "expected a
|
84
|
+
raise UnexpectedError, "expected a gzipped response"
|
81
85
|
end
|
82
86
|
end
|
83
87
|
|
84
|
-
def
|
88
|
+
def _current_time
|
85
89
|
Time.now.utc.strftime("%d/%b/%Y %H:%M:%S %Z")
|
86
90
|
end
|
87
91
|
|
88
|
-
def
|
92
|
+
def _format_and_sanitize_body_for_log(input_xml)
|
89
93
|
formatted_xml = input_xml.gsub(/^/, "[Braintree] ")
|
90
94
|
formatted_xml = formatted_xml.gsub(/<number>(.{6}).+?(.{4})<\/number>/, '<number>\1******\2</number>')
|
91
95
|
formatted_xml = formatted_xml.gsub(/<cvv>.+?<\/cvv>/, '<cvv>***</cvv>')
|
92
96
|
formatted_xml
|
93
97
|
end
|
94
98
|
|
95
|
-
def
|
99
|
+
def _verify_ssl_certificate(preverify_ok, ssl_context)
|
96
100
|
if preverify_ok != true || ssl_context.error != 0
|
97
101
|
err_msg = "SSL Verification failed -- Preverify: #{preverify_ok}, Error: #{ssl_context.error_string} (#{ssl_context.error})"
|
98
|
-
|
102
|
+
@config.logger.error err_msg
|
99
103
|
raise SSLCertificateError.new(err_msg)
|
100
104
|
end
|
101
105
|
true
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Braintree
|
2
|
+
class Modification # :nodoc:
|
3
|
+
include BaseModule
|
4
|
+
|
5
|
+
attr_reader :amount, :id, :number_of_billing_cycles, :quantity
|
6
|
+
|
7
|
+
class << self
|
8
|
+
protected :new
|
9
|
+
def _new(*args) # :nodoc:
|
10
|
+
self.new *args
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(attributes) # :nodoc:
|
15
|
+
set_instance_variables_from_hash(attributes)
|
16
|
+
@amount = Util.to_big_decimal(amount)
|
17
|
+
end
|
18
|
+
|
19
|
+
def never_expires?
|
20
|
+
@never_expires
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,36 +1,16 @@
|
|
1
1
|
module Braintree
|
2
|
-
#
|
3
|
-
#
|
4
|
-
# At minimum, a plan_id and payment_method_token are required. Any other values not
|
5
|
-
# provided will be defaulted to the plan's values:
|
6
|
-
#
|
7
|
-
# Braintree::Subscription.create(
|
8
|
-
# :payment_method_token => "my_token",
|
9
|
-
# :plan_id => "my_plan"
|
10
|
-
# )
|
11
|
-
#
|
12
|
-
# Full example:
|
13
|
-
#
|
14
|
-
# Braintree::Subscription.create(
|
15
|
-
# :id => "my_id",
|
16
|
-
# :payment_method_token => "my_token",
|
17
|
-
# :plan_id => "my_plan",
|
18
|
-
# :price => "1.00",
|
19
|
-
# :trial_period => true,
|
20
|
-
# :trial_duration => "2",
|
21
|
-
# :trial_duration_unit => Subscription::TrialDurationUnit::Day
|
22
|
-
# )
|
23
|
-
#
|
24
|
-
# == More Information
|
25
|
-
#
|
26
|
-
# For more detailed documentation on Subscriptions, see http://www.braintreepaymentsolutions.com/gateway/subscription-api
|
2
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/subscriptions/overview
|
27
3
|
class Subscription
|
28
4
|
include BaseModule
|
29
5
|
|
30
6
|
module Status
|
31
7
|
Active = 'Active'
|
32
8
|
Canceled = 'Canceled'
|
9
|
+
Expired = 'Expired'
|
33
10
|
PastDue = 'Past Due'
|
11
|
+
Pending = 'Pending'
|
12
|
+
|
13
|
+
All = constants.map { |c| const_get(c) }
|
34
14
|
end
|
35
15
|
|
36
16
|
module TrialDurationUnit
|
@@ -38,111 +18,57 @@ module Braintree
|
|
38
18
|
Month = "month"
|
39
19
|
end
|
40
20
|
|
41
|
-
attr_reader :price, :plan_id, :id, :status, :payment_method_token, :merchant_account_id
|
21
|
+
attr_reader :days_past_due, :price, :plan_id, :id, :status, :payment_method_token, :merchant_account_id
|
42
22
|
attr_reader :first_billing_date, :next_billing_date, :billing_period_start_date, :billing_period_end_date
|
43
23
|
attr_reader :trial_period, :trial_duration, :trial_duration_unit
|
44
24
|
attr_reader :failure_count
|
45
25
|
attr_reader :transactions
|
26
|
+
attr_reader :next_bill_amount
|
27
|
+
attr_reader :number_of_billing_cycles, :billing_day_of_month
|
28
|
+
attr_reader :add_ons, :discounts
|
46
29
|
|
30
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/subscriptions/cancel
|
47
31
|
def self.cancel(subscription_id)
|
48
|
-
|
49
|
-
if response[:subscription]
|
50
|
-
SuccessfulResult.new(:subscription => _new(response[:subscription]))
|
51
|
-
elsif response[:api_error_response]
|
52
|
-
ErrorResult.new(response[:api_error_response])
|
53
|
-
else
|
54
|
-
raise UnexpectedError, "expected :subscription or :api_error_response"
|
55
|
-
end
|
56
|
-
rescue NotFoundError
|
57
|
-
raise NotFoundError, "subscription with id #{subscription_id.inspect} not found"
|
32
|
+
Configuration.gateway.subscription.cancel(subscription_id)
|
58
33
|
end
|
59
34
|
|
35
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/subscriptions/create
|
60
36
|
def self.create(attributes)
|
61
|
-
|
62
|
-
_do_create "/subscriptions", :subscription => attributes
|
37
|
+
Configuration.gateway.subscription.create(attributes)
|
63
38
|
end
|
64
39
|
|
65
|
-
#
|
66
|
-
# if the subscription cannot be found.
|
40
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/subscriptions/search
|
67
41
|
def self.find(id)
|
68
|
-
|
69
|
-
_new(response[:subscription])
|
70
|
-
rescue NotFoundError
|
71
|
-
raise NotFoundError, "subscription with id #{id.inspect} not found"
|
42
|
+
Configuration.gateway.subscription.find(id)
|
72
43
|
end
|
73
44
|
|
74
45
|
def self.retry_charge(subscription_id, amount=nil)
|
75
|
-
|
76
|
-
:amount => amount,
|
77
|
-
:subscription_id => subscription_id,
|
78
|
-
:type => Transaction::Type::Sale
|
79
|
-
}
|
80
|
-
|
81
|
-
Transaction.send(:_do_create, "/transactions", :transaction => attributes)
|
46
|
+
Configuration.gateway.transaction.retry_subscription_charge(subscription_id, amount)
|
82
47
|
end
|
83
48
|
|
84
|
-
#
|
85
|
-
# multiple value fields. Searchable text fields are:
|
86
|
-
# - plan_id
|
87
|
-
# - days_past_due
|
88
|
-
#
|
89
|
-
# Searchable multiple value fields are:
|
90
|
-
# - status
|
91
|
-
#
|
92
|
-
# For text fields, you can search using the following operators: is, is_not, starts_with, ends_with
|
93
|
-
# and contains. For mutiple value fields, you can search using the in operator. An example:
|
94
|
-
#
|
95
|
-
# Subscription.search do |s|
|
96
|
-
# s.plan_id.starts_with "abc"
|
97
|
-
# s.days_past_due.is "30"
|
98
|
-
# s.status.in [Subscription::Status::PastDue]
|
99
|
-
# end
|
49
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/subscriptions/search
|
100
50
|
def self.search(&block)
|
101
|
-
search
|
102
|
-
block.call(search) if block
|
103
|
-
|
104
|
-
response = Http.post "/subscriptions/advanced_search_ids", {:search => search.to_hash}
|
105
|
-
ResourceCollection.new(response) { |ids| _fetch_subscriptions(search, ids) }
|
106
|
-
end
|
107
|
-
|
108
|
-
def self._fetch_subscriptions(search, ids)
|
109
|
-
search.ids.in ids
|
110
|
-
response = Http.post "/subscriptions/advanced_search", {:search => search.to_hash}
|
111
|
-
attributes = response[:subscriptions]
|
112
|
-
Util.extract_attribute_as_array(attributes, :subscription).map { |attrs| _new(attrs) }
|
51
|
+
Configuration.gateway.subscription.search(&block)
|
113
52
|
end
|
114
53
|
|
54
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/subscriptions/update
|
115
55
|
def self.update(subscription_id, attributes)
|
116
|
-
|
117
|
-
response = Http.put "/subscriptions/#{subscription_id}", :subscription => attributes
|
118
|
-
if response[:subscription]
|
119
|
-
SuccessfulResult.new(:subscription => _new(response[:subscription]))
|
120
|
-
elsif response[:api_error_response]
|
121
|
-
ErrorResult.new(response[:api_error_response])
|
122
|
-
else
|
123
|
-
raise UnexpectedError, "expected :subscription or :api_error_response"
|
124
|
-
end
|
56
|
+
Configuration.gateway.subscription.update(subscription_id, attributes)
|
125
57
|
end
|
126
58
|
|
127
|
-
def
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
:trial_duration,
|
135
|
-
:trial_duration_unit,
|
136
|
-
:trial_period
|
137
|
-
]
|
59
|
+
def initialize(gateway, attributes) # :nodoc:
|
60
|
+
@gateway = gateway
|
61
|
+
set_instance_variables_from_hash(attributes)
|
62
|
+
@price = Util.to_big_decimal(price)
|
63
|
+
transactions.map! { |attrs| Transaction._new(gateway, attrs) }
|
64
|
+
add_ons.map! { |attrs| AddOn._new(attrs) }
|
65
|
+
discounts.map! { |attrs| Discount._new(attrs) }
|
138
66
|
end
|
139
67
|
|
140
|
-
def
|
141
|
-
|
142
|
-
transactions.map! {|attrs| Transaction._new(attrs) }
|
68
|
+
def never_expires?
|
69
|
+
@never_expires
|
143
70
|
end
|
144
71
|
|
145
|
-
|
146
72
|
# True if <tt>other</tt> has the same id.
|
147
73
|
def ==(other)
|
148
74
|
return false unless other.is_a?(Subscription)
|
@@ -155,31 +81,5 @@ module Braintree
|
|
155
81
|
self.new *args
|
156
82
|
end
|
157
83
|
end
|
158
|
-
|
159
|
-
def self._do_create(url, params) # :nodoc:
|
160
|
-
response = Http.post url, params
|
161
|
-
if response[:subscription]
|
162
|
-
SuccessfulResult.new(:subscription => new(response[:subscription]))
|
163
|
-
elsif response[:api_error_response]
|
164
|
-
ErrorResult.new(response[:api_error_response])
|
165
|
-
else
|
166
|
-
raise UnexpectedError, "expected :subscription or :api_error_response"
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
def _init(attributes) # :nodoc:
|
171
|
-
set_instance_variables_from_hash(attributes)
|
172
|
-
@price = Util.to_big_decimal(price)
|
173
|
-
end
|
174
|
-
|
175
|
-
def self._update_signature # :nodoc:
|
176
|
-
[
|
177
|
-
:id,
|
178
|
-
:merchant_account_id,
|
179
|
-
:payment_method_token,
|
180
|
-
:plan_id,
|
181
|
-
:price
|
182
|
-
]
|
183
|
-
end
|
184
84
|
end
|
185
85
|
end
|