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
data/lib/braintree/customer.rb
CHANGED
@@ -1,147 +1,123 @@
|
|
1
1
|
module Braintree
|
2
|
-
#
|
3
|
-
#
|
4
|
-
# For more detailed documentation on Customers, see http://www.braintreepaymentsolutions.com/gateway/customer-api
|
2
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby
|
5
3
|
class Customer
|
6
4
|
include BaseModule
|
7
5
|
|
8
6
|
attr_reader :addresses, :company, :created_at, :credit_cards, :email, :fax, :first_name, :id, :last_name,
|
9
7
|
:phone, :updated_at, :website, :custom_fields
|
10
8
|
|
11
|
-
#
|
12
|
-
#
|
13
|
-
# customers = Braintree::Customer.all
|
14
|
-
# customers.each do |customer|
|
15
|
-
# puts "Customer #{customer.id} email is #{customer.email}"
|
16
|
-
# end
|
9
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/customers/search
|
17
10
|
def self.all
|
18
|
-
|
19
|
-
ResourceCollection.new(response) { |ids| _fetch_customers(ids) }
|
20
|
-
end
|
21
|
-
|
22
|
-
def self._fetch_customers(ids)
|
23
|
-
response = Http.post "/customers/advanced_search", {:search => {:ids => ids}}
|
24
|
-
attributes = response[:customers]
|
25
|
-
Util.extract_attribute_as_array(attributes, :customer).map { |attrs| _new(attrs) }
|
11
|
+
Configuration.gateway.customer.all
|
26
12
|
end
|
27
13
|
|
28
|
-
#
|
29
|
-
# the gateway will generate it.
|
30
|
-
#
|
31
|
-
# result = Braintree::Customer.create(
|
32
|
-
# :first_name => "John",
|
33
|
-
# :last_name => "Smith",
|
34
|
-
# :company => "Smith Co.",
|
35
|
-
# :email => "john@smith.com",
|
36
|
-
# :website => "www.smithco.com",
|
37
|
-
# :fax => "419-555-1234",
|
38
|
-
# :phone => "614-555-1234"
|
39
|
-
# )
|
40
|
-
# if result.success?
|
41
|
-
# puts "Created customer #{result.customer.id}
|
42
|
-
# else
|
43
|
-
# puts "Could not create customer, see result.errors"
|
44
|
-
# end
|
14
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/customers/create
|
45
15
|
def self.create(attributes = {})
|
46
|
-
|
47
|
-
_do_create "/customers", :customer => attributes
|
16
|
+
Configuration.gateway.customer.create(attributes)
|
48
17
|
end
|
49
18
|
|
19
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/customers/create
|
50
20
|
def self.create!(attributes = {})
|
51
21
|
return_object_or_raise(:customer) { create(attributes) }
|
52
22
|
end
|
53
23
|
|
24
|
+
# Deprecated. Use Braintree::TransparentRedirect.url
|
25
|
+
#
|
26
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/customers/create_tr
|
54
27
|
def self.create_customer_url
|
55
28
|
warn "[DEPRECATED] Customer.create_customer_url is deprecated. Please use TransparentRedirect.url"
|
56
|
-
|
29
|
+
Configuration.gateway.customer.create_customer_url
|
57
30
|
end
|
58
31
|
|
32
|
+
# Deprecated. Use Braintree::TransparentRedirect.confirm
|
33
|
+
#
|
34
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/customers/create_tr
|
59
35
|
def self.create_from_transparent_redirect(query_string)
|
60
36
|
warn "[DEPRECATED] Customer.create_from_transparent_redirect is deprecated. Please use TransparentRedirect.confirm"
|
61
|
-
|
62
|
-
_do_create("/customers/all/confirm_transparent_redirect_request", :id => params[:id])
|
37
|
+
Configuration.gateway.customer.create_from_transparent_redirect(query_string)
|
63
38
|
end
|
64
39
|
|
40
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create_from_vault
|
65
41
|
def self.credit(customer_id, transaction_attributes)
|
66
42
|
Transaction.credit(transaction_attributes.merge(:customer_id => customer_id))
|
67
43
|
end
|
68
44
|
|
45
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create_from_vault
|
69
46
|
def self.credit!(customer_id, transaction_attributes)
|
70
47
|
return_object_or_raise(:transaction){ credit(customer_id, transaction_attributes) }
|
71
48
|
end
|
72
49
|
|
50
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/customers/delete
|
73
51
|
def self.delete(customer_id)
|
74
|
-
|
75
|
-
SuccessfulResult.new
|
52
|
+
Configuration.gateway.customer.delete(customer_id)
|
76
53
|
end
|
77
54
|
|
55
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/customers/search
|
78
56
|
def self.find(customer_id)
|
79
|
-
|
80
|
-
raise ArgumentError, "customer_id cannot be blank" if customer_id.to_s == ""
|
81
|
-
response = Http.get("/customers/#{customer_id}")
|
82
|
-
new(response[:customer])
|
83
|
-
rescue NotFoundError
|
84
|
-
raise NotFoundError, "customer with id #{customer_id.inspect} not found"
|
57
|
+
Configuration.gateway.customer.find(customer_id)
|
85
58
|
end
|
86
59
|
|
60
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create_from_vault
|
87
61
|
def self.sale(customer_id, transaction_attributes)
|
88
62
|
Transaction.sale(transaction_attributes.merge(:customer_id => customer_id))
|
89
63
|
end
|
90
64
|
|
65
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create_from_vault
|
91
66
|
def self.sale!(customer_id, transaction_attributes)
|
92
|
-
|
67
|
+
return_object_or_raise(:transaction) { sale(customer_id, transaction_attributes) }
|
93
68
|
end
|
94
69
|
|
95
70
|
# Returns a ResourceCollection of transactions for the customer with the given +customer_id+.
|
96
71
|
def self.transactions(customer_id, options = {})
|
97
|
-
|
98
|
-
ResourceCollection.new(response) { |ids| _fetch_transactions(customer_id, ids) }
|
99
|
-
end
|
100
|
-
|
101
|
-
def self._fetch_transactions(customer_id, ids)
|
102
|
-
response = Http.post "/customers/#{customer_id}/transactions", :search => {:ids => ids}
|
103
|
-
attributes = response[:credit_card_transactions]
|
104
|
-
Util.extract_attribute_as_array(attributes, :transaction).map do |transaction_attributes|
|
105
|
-
Transaction._new transaction_attributes
|
106
|
-
end
|
72
|
+
Configuration.gateway.customer.transactions(customer_id, options = {})
|
107
73
|
end
|
108
74
|
|
75
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/customers/update
|
109
76
|
def self.update(customer_id, attributes)
|
110
|
-
|
111
|
-
_do_update(:put, "/customers/#{customer_id}", :customer => attributes)
|
77
|
+
Configuration.gateway.customer.update(customer_id, attributes)
|
112
78
|
end
|
113
79
|
|
80
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/customers/update
|
114
81
|
def self.update!(customer_id, attributes)
|
115
82
|
return_object_or_raise(:customer) { update(customer_id, attributes) }
|
116
83
|
end
|
117
84
|
|
85
|
+
# Deprecated. Use Braintree::TransparentRedirect.url
|
86
|
+
#
|
87
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/customers/update_tr
|
118
88
|
def self.update_customer_url
|
119
89
|
warn "[DEPRECATED] Customer.update_customer_url is deprecated. Please use TransparentRedirect.url"
|
120
|
-
|
90
|
+
Configuration.gateway.customer.update_customer_url
|
121
91
|
end
|
122
92
|
|
93
|
+
# Deprecated. Use Braintree::TransparentRedirect.confirm
|
94
|
+
#
|
95
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/customers/update_tr
|
123
96
|
def self.update_from_transparent_redirect(query_string)
|
124
97
|
warn "[DEPRECATED] Customer.update_from_transparent_redirect is deprecated. Please use TransparentRedirect.confirm"
|
125
|
-
|
126
|
-
_do_update(:post, "/customers/all/confirm_transparent_redirect_request", :id => params[:id])
|
98
|
+
Configuration.gateway.customer.update_from_transparent_redirect(query_string)
|
127
99
|
end
|
128
100
|
|
129
|
-
def initialize(attributes) # :nodoc:
|
101
|
+
def initialize(gateway, attributes) # :nodoc:
|
102
|
+
@gateway = gateway
|
130
103
|
set_instance_variables_from_hash(attributes)
|
131
|
-
@credit_cards = (@credit_cards || []).map { |pm| CreditCard._new pm }
|
132
|
-
@addresses = (@addresses || []).map { |addr| Address._new addr }
|
104
|
+
@credit_cards = (@credit_cards || []).map { |pm| CreditCard._new gateway, pm }
|
105
|
+
@addresses = (@addresses || []).map { |addr| Address._new gateway, addr }
|
133
106
|
end
|
134
107
|
|
108
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create_from_vault
|
135
109
|
def credit(transaction_attributes)
|
136
|
-
|
110
|
+
@gateway.transaction.credit(transaction_attributes.merge(:customer_id => id))
|
137
111
|
end
|
138
112
|
|
113
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create_from_vault
|
139
114
|
def credit!(transaction_attributes)
|
140
115
|
return_object_or_raise(:transaction) { credit(transaction_attributes) }
|
141
116
|
end
|
142
117
|
|
118
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/customers/delete
|
143
119
|
def delete
|
144
|
-
|
120
|
+
@gateway.customer.delete(id)
|
145
121
|
end
|
146
122
|
|
147
123
|
def inspect # :nodoc:
|
@@ -154,35 +130,48 @@ module Braintree
|
|
154
130
|
"#<#{self.class} #{nice_attributes.join(', ')}>"
|
155
131
|
end
|
156
132
|
|
133
|
+
# Deprecated. Use Braintree::Customer.sale
|
134
|
+
#
|
135
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create_from_vault
|
157
136
|
def sale(transaction_attributes)
|
158
|
-
|
137
|
+
warn "[DEPRECATED] sale as an instance method is deprecated. Please use CreditCard.sale"
|
138
|
+
@gateway.transaction.sale(transaction_attributes.merge(:customer_id => id))
|
159
139
|
end
|
160
140
|
|
141
|
+
# Deprecated. Use Braintree::Customer.sale!
|
142
|
+
#
|
143
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create_from_vault
|
161
144
|
def sale!(transaction_attributes)
|
145
|
+
warn "[DEPRECATED] sale! as an instance method is deprecated. Please use CreditCard.sale!"
|
162
146
|
return_object_or_raise(:transaction) { sale(transaction_attributes) }
|
163
147
|
end
|
164
148
|
|
165
149
|
# Returns a ResourceCollection of transactions for the customer.
|
166
150
|
def transactions(options = {})
|
167
|
-
|
151
|
+
@gateway.customer.transactions(id, options)
|
168
152
|
end
|
169
153
|
|
154
|
+
# Deprecated. Use Braintree::Customer.update
|
155
|
+
#
|
156
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/customers/update
|
170
157
|
def update(attributes)
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
elsif response[:api_error_response]
|
176
|
-
ErrorResult.new(response[:api_error_response])
|
177
|
-
else
|
178
|
-
raise "expected :customer or :errors"
|
158
|
+
warn "[DEPRECATED] update as an instance method is deprecated. Please use CreditCard.update"
|
159
|
+
result = @gateway.customer.update(id, attributes)
|
160
|
+
if result.success?
|
161
|
+
copy_instance_variables_from_object result.customer
|
179
162
|
end
|
163
|
+
result
|
180
164
|
end
|
181
165
|
|
166
|
+
# Deprecated. Use Braintree::Customer.update!
|
167
|
+
#
|
168
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/customers/update
|
182
169
|
def update!(attributes)
|
170
|
+
warn "[DEPRECATED] update! as an instance method is deprecated. Please use CreditCard.update!"
|
183
171
|
return_object_or_raise(:customer) { update(attributes) }
|
184
172
|
end
|
185
173
|
|
174
|
+
# Returns true if +other+ is a Customer with the same id
|
186
175
|
def ==(other)
|
187
176
|
return false unless other.is_a?(Customer)
|
188
177
|
id == other.id
|
@@ -192,56 +181,14 @@ module Braintree
|
|
192
181
|
protected :new
|
193
182
|
end
|
194
183
|
|
195
|
-
def self._attributes # :nodoc:
|
196
|
-
[
|
197
|
-
:addresses, :company, :credit_cards, :email, :fax, :first_name, :id, :last_name, :phone, :website,
|
198
|
-
:created_at, :updated_at
|
199
|
-
]
|
200
|
-
end
|
201
|
-
|
202
|
-
def self._create_signature # :nodoc:
|
203
|
-
credit_card_signature = CreditCard._create_signature - [:customer_id]
|
204
|
-
[
|
205
|
-
:company, :email, :fax, :first_name, :id, :last_name, :phone, :website,
|
206
|
-
{:credit_card => credit_card_signature},
|
207
|
-
{:custom_fields => :_any_key_}
|
208
|
-
]
|
209
|
-
end
|
210
|
-
|
211
|
-
def self._do_create(url, params=nil) # :nodoc:
|
212
|
-
response = Http.post url, params
|
213
|
-
if response[:customer]
|
214
|
-
SuccessfulResult.new(:customer => new(response[:customer]))
|
215
|
-
elsif response[:api_error_response]
|
216
|
-
ErrorResult.new(response[:api_error_response])
|
217
|
-
else
|
218
|
-
raise "expected :customer or :api_error_response"
|
219
|
-
end
|
220
|
-
end
|
221
|
-
|
222
|
-
def self._do_update(http_verb, url, params) # :nodoc:
|
223
|
-
response = Http.send http_verb, url, params
|
224
|
-
if response[:customer]
|
225
|
-
SuccessfulResult.new(:customer => new(response[:customer]))
|
226
|
-
elsif response[:api_error_response]
|
227
|
-
ErrorResult.new(response[:api_error_response])
|
228
|
-
else
|
229
|
-
raise UnexpectedError, "expected :customer or :api_error_response"
|
230
|
-
end
|
231
|
-
end
|
232
|
-
|
233
184
|
def self._new(*args) # :nodoc:
|
234
185
|
self.new *args
|
235
186
|
end
|
236
187
|
|
237
|
-
def self.
|
238
|
-
credit_card_signature = CreditCard._update_signature - [:customer_id]
|
239
|
-
credit_card_options = credit_card_signature.find { |item| item.respond_to?(:keys) && item.keys == [:options] }
|
240
|
-
credit_card_options[:options] << :update_existing_token
|
188
|
+
def self._attributes # :nodoc:
|
241
189
|
[
|
242
|
-
:company, :email, :fax, :first_name, :id, :last_name, :phone, :website,
|
243
|
-
|
244
|
-
{:custom_fields => :_any_key_}
|
190
|
+
:addresses, :company, :credit_cards, :email, :fax, :first_name, :id, :last_name, :phone, :website,
|
191
|
+
:created_at, :updated_at
|
245
192
|
]
|
246
193
|
end
|
247
194
|
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
module Braintree
|
2
|
+
class CustomerGateway # :nodoc:
|
3
|
+
def initialize(gateway)
|
4
|
+
@gateway = gateway
|
5
|
+
@config = gateway.config
|
6
|
+
end
|
7
|
+
|
8
|
+
def all
|
9
|
+
response = @config.http.post "/customers/advanced_search_ids"
|
10
|
+
ResourceCollection.new(response) { |ids| _fetch_customers(ids) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def create(attributes = {})
|
14
|
+
Util.verify_keys(CustomerGateway._create_signature, attributes)
|
15
|
+
_do_create "/customers", :customer => attributes
|
16
|
+
end
|
17
|
+
|
18
|
+
# Deprecated
|
19
|
+
def create_customer_url
|
20
|
+
"#{@config.base_merchant_url}/customers/all/create_via_transparent_redirect_request"
|
21
|
+
end
|
22
|
+
|
23
|
+
# Deprecated
|
24
|
+
def create_from_transparent_redirect(query_string)
|
25
|
+
params = @gateway.transparent_redirect.parse_and_validate_query_string query_string
|
26
|
+
_do_create("/customers/all/confirm_transparent_redirect_request", :id => params[:id])
|
27
|
+
end
|
28
|
+
|
29
|
+
def delete(customer_id)
|
30
|
+
@config.http.delete("/customers/#{customer_id}")
|
31
|
+
SuccessfulResult.new
|
32
|
+
end
|
33
|
+
|
34
|
+
def find(customer_id)
|
35
|
+
raise ArgumentError, "customer_id contains invalid characters" unless customer_id.to_s =~ /\A[\w-]+\z/
|
36
|
+
raise ArgumentError, "customer_id cannot be blank" if customer_id.to_s == ""
|
37
|
+
response = @config.http.get("/customers/#{customer_id}")
|
38
|
+
Customer._new(@gateway, response[:customer])
|
39
|
+
rescue NotFoundError
|
40
|
+
raise NotFoundError, "customer with id #{customer_id.inspect} not found"
|
41
|
+
end
|
42
|
+
|
43
|
+
def transactions(customer_id, options = {})
|
44
|
+
response = @config.http.post "/customers/#{customer_id}/transaction_ids"
|
45
|
+
ResourceCollection.new(response) { |ids| _fetch_transactions(customer_id, ids) }
|
46
|
+
end
|
47
|
+
|
48
|
+
def update(customer_id, attributes)
|
49
|
+
Util.verify_keys(CustomerGateway._update_signature, attributes)
|
50
|
+
_do_update(:put, "/customers/#{customer_id}", :customer => attributes)
|
51
|
+
end
|
52
|
+
|
53
|
+
# Deprecated
|
54
|
+
def update_customer_url
|
55
|
+
warn "[DEPRECATED] Customer.update_customer_url is deprecated. Please use TransparentRedirect.url"
|
56
|
+
"#{@config.base_merchant_url}/customers/all/update_via_transparent_redirect_request"
|
57
|
+
end
|
58
|
+
|
59
|
+
# Deprecated
|
60
|
+
def update_from_transparent_redirect(query_string)
|
61
|
+
params = @gateway.transparent_redirect.parse_and_validate_query_string(query_string)
|
62
|
+
_do_update(:post, "/customers/all/confirm_transparent_redirect_request", :id => params[:id])
|
63
|
+
end
|
64
|
+
|
65
|
+
def self._create_signature # :nodoc:
|
66
|
+
credit_card_signature = CreditCardGateway._create_signature - [:customer_id]
|
67
|
+
[
|
68
|
+
:company, :email, :fax, :first_name, :id, :last_name, :phone, :website,
|
69
|
+
{:credit_card => credit_card_signature},
|
70
|
+
{:custom_fields => :_any_key_}
|
71
|
+
]
|
72
|
+
end
|
73
|
+
|
74
|
+
def _do_create(url, params=nil) # :nodoc:
|
75
|
+
response = @config.http.post url, params
|
76
|
+
if response[:customer]
|
77
|
+
SuccessfulResult.new(:customer => Customer._new(@gateway, response[:customer]))
|
78
|
+
elsif response[:api_error_response]
|
79
|
+
ErrorResult.new(@gateway, response[:api_error_response])
|
80
|
+
else
|
81
|
+
raise "expected :customer or :api_error_response"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def _do_update(http_verb, url, params) # :nodoc:
|
86
|
+
response = @config.http.send http_verb, url, params
|
87
|
+
if response[:customer]
|
88
|
+
SuccessfulResult.new(:customer => Customer._new(@gateway, response[:customer]))
|
89
|
+
elsif response[:api_error_response]
|
90
|
+
ErrorResult.new(@gateway, response[:api_error_response])
|
91
|
+
else
|
92
|
+
raise UnexpectedError, "expected :customer or :api_error_response"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def _fetch_customers(ids) # :nodoc:
|
97
|
+
response = @config.http.post "/customers/advanced_search", {:search => {:ids => ids}}
|
98
|
+
attributes = response[:customers]
|
99
|
+
Util.extract_attribute_as_array(attributes, :customer).map { |attrs| Customer._new(@gateway, attrs) }
|
100
|
+
end
|
101
|
+
|
102
|
+
def _fetch_transactions(customer_id, ids) # :nodoc:
|
103
|
+
response = @config.http.post "/customers/#{customer_id}/transactions", :search => {:ids => ids}
|
104
|
+
attributes = response[:credit_card_transactions]
|
105
|
+
Util.extract_attribute_as_array(attributes, :transaction).map do |transaction_attributes|
|
106
|
+
Transaction._new @gateway, transaction_attributes
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def self._update_signature # :nodoc:
|
111
|
+
credit_card_signature = CreditCardGateway._update_signature - [:customer_id]
|
112
|
+
credit_card_options = credit_card_signature.find { |item| item.respond_to?(:keys) && item.keys == [:options] }
|
113
|
+
credit_card_options[:options] << :update_existing_token
|
114
|
+
[
|
115
|
+
:company, :email, :fax, :first_name, :id, :last_name, :phone, :website,
|
116
|
+
{:credit_card => credit_card_signature},
|
117
|
+
{:custom_fields => :_any_key_}
|
118
|
+
]
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
data/lib/braintree/digest.rb
CHANGED
@@ -3,6 +3,7 @@ module Braintree
|
|
3
3
|
# The constants should be used to check for a specific validation error in a ValidationErrorCollection.
|
4
4
|
# The error messages returned from the server may change, but the codes will remain the same.
|
5
5
|
module ErrorCodes
|
6
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/addresses/validations
|
6
7
|
module Address
|
7
8
|
CannotBeBlank = "81801"
|
8
9
|
CompanyIsTooLong = "81802"
|
@@ -23,6 +24,7 @@ module Braintree
|
|
23
24
|
StreetAddressIsTooLong = "81812"
|
24
25
|
end
|
25
26
|
|
27
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/credit_cards/validations
|
26
28
|
module CreditCard
|
27
29
|
BillingAddressConflict = "91701"
|
28
30
|
BillingAddressIdIsInvalid = "91702"
|
@@ -54,6 +56,7 @@ module Braintree
|
|
54
56
|
end
|
55
57
|
end
|
56
58
|
|
59
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/customers/validations
|
57
60
|
module Customer
|
58
61
|
CompanyIsTooLong = "81601"
|
59
62
|
CustomFieldIsInvalid = "91602"
|
@@ -64,7 +67,8 @@ module Braintree
|
|
64
67
|
FaxIsTooLong = "81607"
|
65
68
|
FirstNameIsTooLong = "81608"
|
66
69
|
IdIsInUse = "91609"
|
67
|
-
IdIsInvaild = "91610"
|
70
|
+
IdIsInvaild = "91610" # Deprecated
|
71
|
+
IdIsInvalid = "91610"
|
68
72
|
IdIsNotAllowed = "91611"
|
69
73
|
IdIsRequired = "91613"
|
70
74
|
IdIsTooLong = "91612"
|
@@ -74,10 +78,26 @@ module Braintree
|
|
74
78
|
WebsiteIsTooLong = "81615"
|
75
79
|
end
|
76
80
|
|
81
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/subscriptions/validations
|
77
82
|
module Subscription
|
83
|
+
BillingDayOfMonthCannotBeUpdated = "91918"
|
84
|
+
BillingDayOfMonthIsInvalid = "91914"
|
85
|
+
BillingDayOfMonthMustBeNumeric = "91913"
|
86
|
+
CannotAddDuplicateAddonOrDiscount = "91911"
|
78
87
|
CannotEditCanceledSubscription = "81901"
|
79
|
-
|
88
|
+
CannotEditExpiredSubscription = "81910"
|
89
|
+
CannotEditPriceChangingFieldsOnPastDueSubscription = "91920"
|
90
|
+
FirstBillingDateCannotBeInThePast = "91916"
|
91
|
+
FirstBillingDateCannotBeUpdated = "91919"
|
92
|
+
FirstBillingDateIsInvalid = "91915"
|
93
|
+
IdIsInUse = "81902"
|
94
|
+
InconsistentNumberOfBillingCycles = "91908"
|
95
|
+
InconsistentStartDate = "91917"
|
80
96
|
MerchantAccountIdIsInvalid = "91901"
|
97
|
+
NumberOfBillingCyclesCannotBeBlank = "91912"
|
98
|
+
NumberOfBillingCyclesIsTooSmall = "91909"
|
99
|
+
NumberOfBillingCyclesMustBeGreaterThanZero = "91907"
|
100
|
+
NumberOfBillingCyclesMustBeNumeric = "91906"
|
81
101
|
PaymentMethodTokenCardTypeIsNotAccepted = "91902"
|
82
102
|
PaymentMethodTokenIsInvalid = "91903"
|
83
103
|
PaymentMethodTokenNotAssociatedWithCustomer = "91905"
|
@@ -86,16 +106,39 @@ module Braintree
|
|
86
106
|
PriceFormatIsInvalid = "81904"
|
87
107
|
StatusIsCanceled = "81905"
|
88
108
|
TokenFormatIsInvalid = "81906"
|
89
|
-
TrialDurationFormatIsInvalid =
|
109
|
+
TrialDurationFormatIsInvalid = "81907"
|
90
110
|
TrialDurationIsRequired = "81908"
|
91
|
-
TrialDurationUnitIsInvalid =
|
111
|
+
TrialDurationUnitIsInvalid = "81909"
|
112
|
+
|
113
|
+
module Modification
|
114
|
+
AmountCannotBeBlank = "92003"
|
115
|
+
AmountIsInvalid = "92002"
|
116
|
+
CannotEditModificationsOnPastDueSubscription = "92022"
|
117
|
+
CannotUpdateAndRemove = "92015"
|
118
|
+
ExistingIdIsIncorrectKind = "92020"
|
119
|
+
ExistingIdIsInvalid = "92011"
|
120
|
+
ExistingIdIsRequired = "92012"
|
121
|
+
IdToRemoveIsIncorrectKind = "92021"
|
122
|
+
IdToRemoveIsNotPresent = "92016"
|
123
|
+
InconsistentNumberOfBillingCycles = "92018"
|
124
|
+
InheritedFromIdIsInvalid = "92013"
|
125
|
+
InheritedFromIdIsRequired = "92014"
|
126
|
+
NumberOfBillingCyclesCannotBeBlank = "92017"
|
127
|
+
NumberOfBillingCyclesIsInvalid = "92005"
|
128
|
+
NumberOfBillingCyclesMustBeGreaterThanZero = "92019"
|
129
|
+
QuantityCannotBeBlank = "92004"
|
130
|
+
QuantityIsInvalid = "92001"
|
131
|
+
QuantityMustBeGreaterThanZero = "92010"
|
132
|
+
end
|
92
133
|
end
|
93
134
|
|
135
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/validations
|
94
136
|
module Transaction
|
95
137
|
AmountCannotBeNegative = "81501"
|
96
138
|
AmountIsRequired = "81502"
|
97
139
|
AmountIsInvalid = "81503"
|
98
140
|
AmountIsTooLarge = "81528"
|
141
|
+
AmountMustBeGreaterThanZero = "81531"
|
99
142
|
BillingAddressConflict = "91530"
|
100
143
|
CannotBeVoided = "91504"
|
101
144
|
CannotRefundCredit = "91505"
|
@@ -108,7 +151,8 @@ module Braintree
|
|
108
151
|
CustomerIdIsInvalid = "91510"
|
109
152
|
CustomerDoesNotHaveCreditCard = "91511"
|
110
153
|
HasAlreadyBeenRefunded = "91512"
|
111
|
-
|
154
|
+
MerchantAccountIdIsInvalid = "91513"
|
155
|
+
MerchantAccountNameIsInvalid = "91513" # Deprecated
|
112
156
|
MerchantAccountIsSuspended = "91514"
|
113
157
|
OrderIdIsTooLong = "91501"
|
114
158
|
PaymentMethodConflict = "91515"
|
@@ -122,6 +166,7 @@ module Braintree
|
|
122
166
|
SettlementAmountIsTooLarge = "91522"
|
123
167
|
SubscriptionDoesNotBelongToCustomer = "91529"
|
124
168
|
SubscriptionIdIsInvalid = "91528"
|
169
|
+
SubscriptionStatusMustBePastDue = "91531"
|
125
170
|
TypeIsInvalid = "91523"
|
126
171
|
TypeIsRequired = "91524"
|
127
172
|
module Options
|