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
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
|