braintree 2.4.0 → 2.5.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|