braintree 2.45.0 → 2.46.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/braintree.rb +5 -0
- data/lib/braintree/add_on_gateway.rb +2 -1
- data/lib/braintree/address_gateway.rb +5 -4
- data/lib/braintree/client_token_gateway.rb +2 -1
- data/lib/braintree/configuration.rb +59 -7
- data/lib/braintree/credentials_parser.rb +40 -0
- data/lib/braintree/credit_card_gateway.rb +12 -11
- data/lib/braintree/credit_card_verification_gateway.rb +4 -3
- data/lib/braintree/customer_gateway.rb +12 -11
- data/lib/braintree/discount_gateway.rb +2 -1
- data/lib/braintree/error_codes.rb +9 -0
- data/lib/braintree/europe_bank_account_gateway.rb +2 -1
- data/lib/braintree/exceptions.rb +1 -5
- data/lib/braintree/gateway.rb +8 -0
- data/lib/braintree/http.rb +8 -2
- data/lib/braintree/merchant.rb +19 -0
- data/lib/braintree/merchant_account_gateway.rb +6 -5
- data/lib/braintree/merchant_gateway.rb +27 -0
- data/lib/braintree/oauth_credentials.rb +19 -0
- data/lib/braintree/oauth_gateway.rb +68 -0
- data/lib/braintree/payment_method_gateway.rb +7 -6
- data/lib/braintree/payment_method_nonce_gateway.rb +3 -2
- data/lib/braintree/paypal_account_gateway.rb +5 -4
- data/lib/braintree/plan_gateway.rb +2 -1
- data/lib/braintree/settlement_batch_summary_gateway.rb +2 -1
- data/lib/braintree/subscription_gateway.rb +8 -7
- data/lib/braintree/successful_result.rb +1 -1
- data/lib/braintree/testing_gateway.rb +5 -4
- data/lib/braintree/transaction.rb +1 -0
- data/lib/braintree/transaction_gateway.rb +12 -11
- data/lib/braintree/transaction_search.rb +3 -0
- data/lib/braintree/transparent_redirect_gateway.rb +1 -0
- data/lib/braintree/version.rb +1 -1
- data/lib/braintree/webhook_notification_gateway.rb +1 -0
- data/lib/braintree/webhook_testing_gateway.rb +1 -0
- data/spec/httpsd.pid +1 -1
- data/spec/integration/braintree/add_on_spec.rb +12 -0
- data/spec/integration/braintree/customer_spec.rb +31 -0
- data/spec/integration/braintree/http_spec.rb +10 -6
- data/spec/integration/braintree/merchant_account_spec.rb +0 -7
- data/spec/integration/braintree/merchant_spec.rb +55 -0
- data/spec/integration/braintree/oauth_spec.rb +191 -0
- data/spec/integration/braintree/plan_spec.rb +2 -1
- data/spec/integration/braintree/transaction_search_spec.rb +63 -0
- data/spec/integration/braintree/transaction_spec.rb +73 -4
- data/spec/integration/spec_helper.rb +1 -1
- data/spec/oauth_test_helper.rb +17 -0
- data/spec/spec_helper.rb +8 -4
- data/spec/unit/braintree/configuration_spec.rb +23 -0
- data/spec/unit/braintree/credentials_parser_spec.rb +81 -0
- metadata +161 -148
- checksums.yaml +0 -15
data/lib/braintree.rb
CHANGED
@@ -32,6 +32,7 @@ require "braintree/client_token"
|
|
32
32
|
require "braintree/client_token_gateway"
|
33
33
|
require "braintree/coinbase_account"
|
34
34
|
require "braintree/configuration"
|
35
|
+
require "braintree/credentials_parser"
|
35
36
|
require "braintree/credit_card"
|
36
37
|
require "braintree/credit_card_gateway"
|
37
38
|
require "braintree/credit_card_verification"
|
@@ -51,12 +52,16 @@ require "braintree/error_result"
|
|
51
52
|
require "braintree/errors"
|
52
53
|
require "braintree/gateway"
|
53
54
|
require "braintree/http"
|
55
|
+
require "braintree/merchant"
|
56
|
+
require "braintree/merchant_gateway"
|
54
57
|
require "braintree/merchant_account"
|
55
58
|
require "braintree/merchant_account_gateway"
|
56
59
|
require "braintree/merchant_account/individual_details"
|
57
60
|
require "braintree/merchant_account/business_details"
|
58
61
|
require "braintree/merchant_account/funding_details"
|
59
62
|
require "braintree/merchant_account/address_details"
|
63
|
+
require "braintree/oauth_gateway"
|
64
|
+
require "braintree/oauth_credentials"
|
60
65
|
require "braintree/payment_instrument_type"
|
61
66
|
require "braintree/payment_method"
|
62
67
|
require "braintree/payment_method_gateway"
|
@@ -3,10 +3,11 @@ module Braintree
|
|
3
3
|
def initialize(gateway)
|
4
4
|
@gateway = gateway
|
5
5
|
@config = gateway.config
|
6
|
+
@config.assert_has_access_token_or_keys
|
6
7
|
end
|
7
8
|
|
8
9
|
def all
|
9
|
-
response = @config.http.get
|
10
|
+
response = @config.http.get("#{@config.base_merchant_path}/add_ons")
|
10
11
|
attributes_collection = response[:add_ons]
|
11
12
|
attributes_collection.map do |attributes|
|
12
13
|
AddOn._new(attributes)
|
@@ -3,6 +3,7 @@ module Braintree
|
|
3
3
|
def initialize(gateway)
|
4
4
|
@gateway = gateway
|
5
5
|
@config = gateway.config
|
6
|
+
@config.assert_has_access_token_or_keys
|
6
7
|
end
|
7
8
|
|
8
9
|
def create(attributes)
|
@@ -13,7 +14,7 @@ module Braintree
|
|
13
14
|
unless attributes[:customer_id] =~ /\A[0-9A-Za-z_-]+\z/
|
14
15
|
raise ArgumentError, ":customer_id contains invalid characters"
|
15
16
|
end
|
16
|
-
response = @config.http.post
|
17
|
+
response = @config.http.post("#{@config.base_merchant_path}/customers/#{attributes.delete(:customer_id)}/addresses", :address => attributes)
|
17
18
|
if response[:address]
|
18
19
|
SuccessfulResult.new(:address => Address._new(@gateway, response[:address]))
|
19
20
|
elsif response[:api_error_response]
|
@@ -25,14 +26,14 @@ module Braintree
|
|
25
26
|
|
26
27
|
def delete(customer_or_customer_id, address_id)
|
27
28
|
customer_id = _determine_customer_id(customer_or_customer_id)
|
28
|
-
@config.http.delete("/customers/#{customer_id}/addresses/#{address_id}")
|
29
|
+
@config.http.delete("#{@config.base_merchant_path}/customers/#{customer_id}/addresses/#{address_id}")
|
29
30
|
SuccessfulResult.new
|
30
31
|
end
|
31
32
|
|
32
33
|
def find(customer_or_customer_id, address_id)
|
33
34
|
customer_id = _determine_customer_id(customer_or_customer_id)
|
34
35
|
raise ArgumentError if address_id.nil? || address_id.to_s.strip == ""
|
35
|
-
response = @config.http.get("/customers/#{customer_id}/addresses/#{address_id}")
|
36
|
+
response = @config.http.get("#{@config.base_merchant_path}/customers/#{customer_id}/addresses/#{address_id}")
|
36
37
|
Address._new(@gateway, response[:address])
|
37
38
|
rescue NotFoundError
|
38
39
|
raise NotFoundError, "address for customer #{customer_id.inspect} with id #{address_id.inspect} not found"
|
@@ -41,7 +42,7 @@ module Braintree
|
|
41
42
|
def update(customer_or_customer_id, address_id, attributes)
|
42
43
|
Util.verify_keys(AddressGateway._update_signature, attributes)
|
43
44
|
customer_id = _determine_customer_id(customer_or_customer_id)
|
44
|
-
response = @config.http.put
|
45
|
+
response = @config.http.put("#{@config.base_merchant_path}/customers/#{customer_id}/addresses/#{address_id}", :address => attributes)
|
45
46
|
if response[:address]
|
46
47
|
SuccessfulResult.new(:address => Address._new(@gateway, response[:address]))
|
47
48
|
elsif response[:api_error_response]
|
@@ -3,6 +3,7 @@ module Braintree
|
|
3
3
|
def initialize(gateway)
|
4
4
|
@gateway = gateway
|
5
5
|
@config = gateway.config
|
6
|
+
@config.assert_has_access_token_or_keys
|
6
7
|
end
|
7
8
|
|
8
9
|
def generate(options={})
|
@@ -11,7 +12,7 @@ module Braintree
|
|
11
12
|
Util.verify_keys(ClientTokenGateway._generate_signature, options)
|
12
13
|
params = {:client_token => options}
|
13
14
|
end
|
14
|
-
result = @config.http.post("/client_token", params)
|
15
|
+
result = @config.http.post("#{@config.base_merchant_path}/client_token", params)
|
15
16
|
|
16
17
|
if result[:client_token]
|
17
18
|
result[:client_token][:value]
|
@@ -7,6 +7,9 @@ module Braintree
|
|
7
7
|
:merchant_id,
|
8
8
|
:public_key,
|
9
9
|
:private_key,
|
10
|
+
:client_id,
|
11
|
+
:client_secret,
|
12
|
+
:access_token,
|
10
13
|
]
|
11
14
|
|
12
15
|
WRITABLE_ATTRIBUTES = [
|
@@ -30,7 +33,7 @@ module Braintree
|
|
30
33
|
attributes.each do |attribute|
|
31
34
|
(class << self; self; end).send(:define_method, attribute) do
|
32
35
|
attribute_value = instance_variable_get("@#{attribute}")
|
33
|
-
raise ConfigurationError.new(attribute.to_s
|
36
|
+
raise ConfigurationError.new("Braintree::Configuration.#{attribute.to_s} needs to be set") unless attribute_value
|
34
37
|
attribute_value
|
35
38
|
end
|
36
39
|
end
|
@@ -88,7 +91,36 @@ module Braintree
|
|
88
91
|
instance_variable_set "@#{attr}", options[attr]
|
89
92
|
end
|
90
93
|
|
91
|
-
|
94
|
+
_check_for_mixed_credentials(options)
|
95
|
+
|
96
|
+
parser = Braintree::CredentialsParser.new
|
97
|
+
if options[:client_id] || options[:client_secret]
|
98
|
+
parser.parse_client_credentials(options[:client_id], options[:client_secret])
|
99
|
+
@client_id = parser.client_id
|
100
|
+
@client_secret = parser.client_secret
|
101
|
+
@environment = parser.environment
|
102
|
+
elsif options[:access_token]
|
103
|
+
parser.parse_access_token(options[:access_token])
|
104
|
+
@access_token = parser.access_token
|
105
|
+
@environment = parser.environment
|
106
|
+
@merchant_id = parser.merchant_id
|
107
|
+
else
|
108
|
+
@merchant_id = options[:merchant_id] || options[:partner_id]
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def _check_for_mixed_credentials(options)
|
113
|
+
if (options[:client_id] || options[:client_secret]) && (options[:public_key] || options[:private_key])
|
114
|
+
raise ConfigurationError.new("Braintree::Gateway cannot be initialized with mixed credential types: client_id and client_secret mixed with public_key and private_key.")
|
115
|
+
end
|
116
|
+
|
117
|
+
if (options[:client_id] || options[:client_secret]) && (options[:access_token])
|
118
|
+
raise ConfigurationError.new("Braintree::Gateway cannot be initialized with mixed credential types: client_id and client_secret mixed with access_token.")
|
119
|
+
end
|
120
|
+
|
121
|
+
if (options[:public_key] || options[:private_key]) && (options[:access_token])
|
122
|
+
raise ConfigurationError.new("Braintree::Gateway cannot be initialized with mixed credential types: public_key and private_key mixed with access_token.")
|
123
|
+
end
|
92
124
|
end
|
93
125
|
|
94
126
|
def api_version # :nodoc:
|
@@ -99,8 +131,12 @@ module Braintree
|
|
99
131
|
"/merchants/#{merchant_id}"
|
100
132
|
end
|
101
133
|
|
134
|
+
def base_url
|
135
|
+
"#{protocol}://#{server}:#{port}"
|
136
|
+
end
|
137
|
+
|
102
138
|
def base_merchant_url # :nodoc:
|
103
|
-
"#{
|
139
|
+
"#{base_url}#{base_merchant_path}"
|
104
140
|
end
|
105
141
|
|
106
142
|
def ca_file # :nodoc:
|
@@ -121,7 +157,7 @@ module Braintree
|
|
121
157
|
|
122
158
|
def port # :nodoc:
|
123
159
|
case @environment
|
124
|
-
when :development
|
160
|
+
when :development, :integration
|
125
161
|
ENV['GATEWAY_PORT'] || 3000
|
126
162
|
when :production, :qa, :sandbox
|
127
163
|
443
|
@@ -142,7 +178,7 @@ module Braintree
|
|
142
178
|
|
143
179
|
def server # :nodoc:
|
144
180
|
case @environment
|
145
|
-
when :development
|
181
|
+
when :development, :integration
|
146
182
|
"localhost"
|
147
183
|
when :production
|
148
184
|
"#{endpoint}.braintreegateway.com"
|
@@ -155,7 +191,7 @@ module Braintree
|
|
155
191
|
|
156
192
|
def auth_url
|
157
193
|
case @environment
|
158
|
-
when :development
|
194
|
+
when :development, :integration
|
159
195
|
"http://auth.venmo.dev:9292"
|
160
196
|
when :production
|
161
197
|
"https://auth.venmo.com"
|
@@ -168,7 +204,7 @@ module Braintree
|
|
168
204
|
|
169
205
|
def ssl? # :nodoc:
|
170
206
|
case @environment
|
171
|
-
when :development
|
207
|
+
when :development, :integration
|
172
208
|
false
|
173
209
|
when :production, :qa, :sandbox
|
174
210
|
true
|
@@ -190,6 +226,22 @@ module Braintree
|
|
190
226
|
super.gsub(/@private_key=\".*\"/, '@private_key="[FILTERED]"')
|
191
227
|
end
|
192
228
|
|
229
|
+
def client_credentials?
|
230
|
+
!client_id.nil?
|
231
|
+
end
|
232
|
+
|
233
|
+
def assert_has_client_credentials
|
234
|
+
if client_id.nil? || client_secret.nil?
|
235
|
+
raise ConfigurationError.new("Braintree::Gateway client_id and client_secret are required.")
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
def assert_has_access_token_or_keys
|
240
|
+
if (public_key.nil? || private_key.nil?) && access_token.nil?
|
241
|
+
raise ConfigurationError.new("Braintree::Gateway public_key and private_key are required.")
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
193
245
|
def signature_service
|
194
246
|
@signature_service ||= SignatureService.new(@private_key)
|
195
247
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Braintree
|
2
|
+
class CredentialsParser
|
3
|
+
attr_reader :client_id, :client_secret, :access_token, :environment, :merchant_id
|
4
|
+
|
5
|
+
def parse_client_credentials(client_id, client_secret)
|
6
|
+
raise ConfigurationError.new("Missing client_id when constructing Braintree::Gateway") if client_id.nil?
|
7
|
+
raise ConfigurationError.new("Value passed for client_id is not a client_id") unless client_id.start_with?("client_id")
|
8
|
+
|
9
|
+
raise ConfigurationError.new("Missing client_secret when constructing Braintree::Gateway") if client_secret.nil?
|
10
|
+
raise ConfigurationError.new("Value passed for client_secret is not a client_secret") unless client_secret.start_with?("client_secret")
|
11
|
+
client_id_environment = parse_environment(client_id)
|
12
|
+
client_secret_environment = parse_environment(client_secret)
|
13
|
+
|
14
|
+
if client_id_environment != client_secret_environment
|
15
|
+
raise ConfigurationError.new("Mismatched credential environments: client_id environment is #{client_id_environment} and client_secret environment is #{client_secret_environment}")
|
16
|
+
end
|
17
|
+
|
18
|
+
@client_id = client_id
|
19
|
+
@client_secret = client_secret
|
20
|
+
@environment = client_id_environment
|
21
|
+
end
|
22
|
+
|
23
|
+
def parse_access_token(access_token)
|
24
|
+
raise ConfigurationError.new("Missing access_token when constructing Braintree::Gateway") if access_token.nil?
|
25
|
+
raise ConfigurationError.new("Value passed for access_token is not a valid access_token") unless access_token.start_with?("access_token")
|
26
|
+
|
27
|
+
@access_token = access_token
|
28
|
+
@environment = parse_environment(access_token)
|
29
|
+
@merchant_id = parse_merchant_id(access_token)
|
30
|
+
end
|
31
|
+
|
32
|
+
def parse_environment(credential)
|
33
|
+
credential.split("$")[1].to_sym
|
34
|
+
end
|
35
|
+
|
36
|
+
def parse_merchant_id(access_token)
|
37
|
+
access_token.split("$")[2]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -3,6 +3,7 @@ module Braintree
|
|
3
3
|
def initialize(gateway)
|
4
4
|
@gateway = gateway
|
5
5
|
@config = gateway.config
|
6
|
+
@config.assert_has_access_token_or_keys
|
6
7
|
end
|
7
8
|
|
8
9
|
def create(attributes)
|
@@ -25,24 +26,24 @@ module Braintree
|
|
25
26
|
end
|
26
27
|
|
27
28
|
def delete(token)
|
28
|
-
@config.http.delete("/payment_methods/credit_card/#{token}")
|
29
|
+
@config.http.delete("#{@config.base_merchant_path}/payment_methods/credit_card/#{token}")
|
29
30
|
end
|
30
31
|
|
31
32
|
def expired(options = {})
|
32
|
-
response = @config.http.post("/payment_methods/all/expired_ids")
|
33
|
+
response = @config.http.post("#{@config.base_merchant_path}/payment_methods/all/expired_ids")
|
33
34
|
ResourceCollection.new(response) { |ids| _fetch_expired(ids) }
|
34
35
|
end
|
35
36
|
|
36
37
|
def expiring_between(start_date, end_date, options = {})
|
37
38
|
formatted_start_date = start_date.strftime('%m%Y')
|
38
39
|
formatted_end_date = end_date.strftime('%m%Y')
|
39
|
-
response = @config.http.post("/payment_methods/all/expiring_ids?start=#{formatted_start_date}&end=#{formatted_end_date}")
|
40
|
+
response = @config.http.post("#{@config.base_merchant_path}/payment_methods/all/expiring_ids?start=#{formatted_start_date}&end=#{formatted_end_date}")
|
40
41
|
ResourceCollection.new(response) { |ids| _fetch_expiring_between(formatted_start_date, formatted_end_date, ids) }
|
41
42
|
end
|
42
43
|
|
43
44
|
def find(token)
|
44
45
|
raise ArgumentError if token.nil? || token.to_s.strip == ""
|
45
|
-
response = @config.http.get
|
46
|
+
response = @config.http.get("#{@config.base_merchant_path}/payment_methods/credit_card/#{token}")
|
46
47
|
CreditCard._new(@gateway, response[:credit_card])
|
47
48
|
rescue NotFoundError
|
48
49
|
raise NotFoundError, "payment method with token #{token.inspect} not found"
|
@@ -50,7 +51,7 @@ module Braintree
|
|
50
51
|
|
51
52
|
def from_nonce(nonce)
|
52
53
|
raise ArgumentError if nonce.nil? || nonce.to_s.strip == ""
|
53
|
-
response = @config.http.get
|
54
|
+
response = @config.http.get("#{@config.base_merchant_path}/payment_methods/from_nonce/#{nonce}")
|
54
55
|
CreditCard._new(@gateway, response[:credit_card])
|
55
56
|
rescue NotFoundError
|
56
57
|
raise NotFoundError, "nonce #{nonce.inspect} locked, consumed, or not found"
|
@@ -106,8 +107,8 @@ module Braintree
|
|
106
107
|
return signature
|
107
108
|
end
|
108
109
|
|
109
|
-
def _do_create(
|
110
|
-
response = @config.http.post
|
110
|
+
def _do_create(path, params=nil) # :nodoc:
|
111
|
+
response = @config.http.post("#{@config.base_merchant_path}#{path}", params)
|
111
112
|
if response[:credit_card]
|
112
113
|
SuccessfulResult.new(:credit_card => CreditCard._new(@gateway, response[:credit_card]))
|
113
114
|
elsif response[:api_error_response]
|
@@ -117,8 +118,8 @@ module Braintree
|
|
117
118
|
end
|
118
119
|
end
|
119
120
|
|
120
|
-
def _do_update(http_verb,
|
121
|
-
response = @config.http.send
|
121
|
+
def _do_update(http_verb, path, params) # :nodoc:
|
122
|
+
response = @config.http.send(http_verb, "#{@config.base_merchant_path}#{path}", params)
|
122
123
|
if response[:credit_card]
|
123
124
|
SuccessfulResult.new(:credit_card => CreditCard._new(@gateway, response[:credit_card]))
|
124
125
|
elsif response[:api_error_response]
|
@@ -129,14 +130,14 @@ module Braintree
|
|
129
130
|
end
|
130
131
|
|
131
132
|
def _fetch_expired(ids) # :nodoc:
|
132
|
-
response = @config.http.post("/payment_methods/all/expired", :search => {:ids => ids})
|
133
|
+
response = @config.http.post("#{@config.base_merchant_path}/payment_methods/all/expired", :search => {:ids => ids})
|
133
134
|
attributes = response[:payment_methods]
|
134
135
|
Util.extract_attribute_as_array(attributes, :credit_card).map { |attrs| CreditCard._new(@gateway, attrs) }
|
135
136
|
end
|
136
137
|
|
137
138
|
def _fetch_expiring_between(formatted_start_date, formatted_end_date, ids) # :nodoc:
|
138
139
|
response = @config.http.post(
|
139
|
-
"/payment_methods/all/expiring?start=#{formatted_start_date}&end=#{formatted_end_date}",
|
140
|
+
"#{@config.base_merchant_path}/payment_methods/all/expiring?start=#{formatted_start_date}&end=#{formatted_end_date}",
|
140
141
|
:search => {:ids => ids}
|
141
142
|
)
|
142
143
|
attributes = response[:payment_methods]
|
@@ -3,11 +3,12 @@ module Braintree
|
|
3
3
|
def initialize(gateway)
|
4
4
|
@gateway = gateway
|
5
5
|
@config = gateway.config
|
6
|
+
@config.assert_has_access_token_or_keys
|
6
7
|
end
|
7
8
|
|
8
9
|
def find(id)
|
9
10
|
raise ArgumentError if id.nil? || id.strip.to_s == ""
|
10
|
-
response = @config.http.get
|
11
|
+
response = @config.http.get("#{@config.base_merchant_path}/verifications/#{id}")
|
11
12
|
CreditCardVerification._new(response[:verification])
|
12
13
|
rescue NotFoundError
|
13
14
|
raise NotFoundError, "verification with id #{id.inspect} not found"
|
@@ -17,13 +18,13 @@ module Braintree
|
|
17
18
|
search = CreditCardVerificationSearch.new
|
18
19
|
block.call(search) if block
|
19
20
|
|
20
|
-
response = @config.http.post
|
21
|
+
response = @config.http.post("#{@config.base_merchant_path}/verifications/advanced_search_ids", {:search => search.to_hash})
|
21
22
|
ResourceCollection.new(response) { |ids| _fetch_verifications(search, ids) }
|
22
23
|
end
|
23
24
|
|
24
25
|
def _fetch_verifications(search, ids)
|
25
26
|
search.ids.in ids
|
26
|
-
response = @config.http.post
|
27
|
+
response = @config.http.post("#{@config.base_merchant_path}/verifications/advanced_search", {:search => search.to_hash})
|
27
28
|
attributes = response[:credit_card_verifications]
|
28
29
|
Util.extract_attribute_as_array(attributes, :verification).map { |attrs| CreditCardVerification._new(attrs) }
|
29
30
|
end
|
@@ -3,10 +3,11 @@ module Braintree
|
|
3
3
|
def initialize(gateway)
|
4
4
|
@gateway = gateway
|
5
5
|
@config = gateway.config
|
6
|
+
@config.assert_has_access_token_or_keys
|
6
7
|
end
|
7
8
|
|
8
9
|
def all
|
9
|
-
response = @config.http.post
|
10
|
+
response = @config.http.post("#{@config.base_merchant_path}/customers/advanced_search_ids")
|
10
11
|
ResourceCollection.new(response) { |ids| _fetch_customers(CustomerSearch.new, ids) }
|
11
12
|
end
|
12
13
|
|
@@ -27,14 +28,14 @@ module Braintree
|
|
27
28
|
end
|
28
29
|
|
29
30
|
def delete(customer_id)
|
30
|
-
@config.http.delete("/customers/#{customer_id}")
|
31
|
+
@config.http.delete("#{@config.base_merchant_path}/customers/#{customer_id}")
|
31
32
|
SuccessfulResult.new
|
32
33
|
end
|
33
34
|
|
34
35
|
def find(customer_id)
|
35
36
|
raise ArgumentError, "customer_id contains invalid characters" unless customer_id.to_s =~ /\A[\w-]+\z/
|
36
37
|
raise ArgumentError, "customer_id cannot be blank" if customer_id.nil?|| customer_id.to_s.strip == ""
|
37
|
-
response = @config.http.get("/customers/#{customer_id}")
|
38
|
+
response = @config.http.get("#{@config.base_merchant_path}/customers/#{customer_id}")
|
38
39
|
Customer._new(@gateway, response[:customer])
|
39
40
|
rescue NotFoundError
|
40
41
|
raise NotFoundError, "customer with id #{customer_id.inspect} not found"
|
@@ -44,12 +45,12 @@ module Braintree
|
|
44
45
|
search = CustomerSearch.new
|
45
46
|
block.call(search) if block
|
46
47
|
|
47
|
-
response = @config.http.post
|
48
|
+
response = @config.http.post("#{@config.base_merchant_path}/customers/advanced_search_ids", {:search => search.to_hash})
|
48
49
|
ResourceCollection.new(response) { |ids| _fetch_customers(search, ids) }
|
49
50
|
end
|
50
51
|
|
51
52
|
def transactions(customer_id, options = {})
|
52
|
-
response = @config.http.post
|
53
|
+
response = @config.http.post("#{@config.base_merchant_path}/customers/#{customer_id}/transaction_ids")
|
53
54
|
ResourceCollection.new(response) { |ids| _fetch_transactions(customer_id, ids) }
|
54
55
|
end
|
55
56
|
|
@@ -80,8 +81,8 @@ module Braintree
|
|
80
81
|
]
|
81
82
|
end
|
82
83
|
|
83
|
-
def _do_create(
|
84
|
-
response = @config.http.post
|
84
|
+
def _do_create(path, params=nil) # :nodoc:
|
85
|
+
response = @config.http.post("#{@config.base_merchant_path}#{path}", params)
|
85
86
|
if response[:customer]
|
86
87
|
SuccessfulResult.new(:customer => Customer._new(@gateway, response[:customer]))
|
87
88
|
elsif response[:api_error_response]
|
@@ -91,8 +92,8 @@ module Braintree
|
|
91
92
|
end
|
92
93
|
end
|
93
94
|
|
94
|
-
def _do_update(http_verb,
|
95
|
-
response = @config.http.send
|
95
|
+
def _do_update(http_verb, path, params) # :nodoc:
|
96
|
+
response = @config.http.send(http_verb, "#{@config.base_merchant_path}#{path}", params)
|
96
97
|
if response[:customer]
|
97
98
|
SuccessfulResult.new(:customer => Customer._new(@gateway, response[:customer]))
|
98
99
|
elsif response[:api_error_response]
|
@@ -104,13 +105,13 @@ module Braintree
|
|
104
105
|
|
105
106
|
def _fetch_customers(search, ids) # :nodoc:
|
106
107
|
search.ids.in ids
|
107
|
-
response = @config.http.post
|
108
|
+
response = @config.http.post("#{@config.base_merchant_path}/customers/advanced_search", {:search => search.to_hash})
|
108
109
|
attributes = response[:customers]
|
109
110
|
Util.extract_attribute_as_array(attributes, :customer).map { |attrs| Customer._new(@gateway, attrs) }
|
110
111
|
end
|
111
112
|
|
112
113
|
def _fetch_transactions(customer_id, ids) # :nodoc:
|
113
|
-
response = @config.http.post
|
114
|
+
response = @config.http.post("#{@config.base_merchant_path}/customers/#{customer_id}/transactions", :search => {:ids => ids})
|
114
115
|
attributes = response[:credit_card_transactions]
|
115
116
|
Util.extract_attribute_as_array(attributes, :transaction).map do |transaction_attributes|
|
116
117
|
Transaction._new @gateway, transaction_attributes
|