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,8 +1,5 @@
|
|
1
1
|
module Braintree
|
2
|
-
#
|
3
|
-
#
|
4
|
-
# For more detailed documentation on CreditCards, see http://www.braintreepaymentsolutions.com/gateway/credit-card-api
|
5
|
-
# For more detailed documentation on CreditCard verification, see http://www.braintreepaymentsolutions.com/gateway/credit-card-verification-api
|
2
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby
|
6
3
|
class CreditCard
|
7
4
|
include BaseModule # :nodoc:
|
8
5
|
|
@@ -32,131 +29,125 @@ module Braintree
|
|
32
29
|
attr_reader :billing_address, :bin, :card_type, :cardholder_name, :created_at, :customer_id, :expiration_month,
|
33
30
|
:expiration_year, :last_4, :subscriptions, :token, :updated_at
|
34
31
|
|
32
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/credit_cards/create
|
35
33
|
def self.create(attributes)
|
36
|
-
|
37
|
-
raise ArgumentError.new("create with both expiration_month and expiration_year or only expiration_date")
|
38
|
-
end
|
39
|
-
Util.verify_keys(_create_signature, attributes)
|
40
|
-
_do_create("/payment_methods", :credit_card => attributes)
|
34
|
+
Configuration.gateway.credit_card.create(attributes)
|
41
35
|
end
|
42
36
|
|
37
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/credit_cards/create
|
43
38
|
def self.create!(attributes)
|
44
39
|
return_object_or_raise(:credit_card) { create(attributes) }
|
45
40
|
end
|
46
41
|
|
47
|
-
#
|
42
|
+
# Deprecated. Use Braintree::TransparentRedirect.url
|
43
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/credit_cards/create_tr
|
48
44
|
def self.create_credit_card_url
|
49
45
|
warn "[DEPRECATED] CreditCard.create_credit_card_url is deprecated. Please use TransparentRedirect.url"
|
50
|
-
|
46
|
+
Configuration.gateway.credit_card.create_credit_card_url
|
51
47
|
end
|
52
48
|
|
49
|
+
# Deprecated. Use Braintree::TransparentRedirect.confirm
|
50
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/credit_cards/create_tr
|
53
51
|
def self.create_from_transparent_redirect(query_string)
|
54
52
|
warn "[DEPRECATED] CreditCard.create_from_transparent_redirect is deprecated. Please use TransparentRedirect.confirm"
|
55
|
-
|
56
|
-
_do_create("/payment_methods/all/confirm_transparent_redirect_request", :id => params[:id])
|
53
|
+
Configuration.gateway.credit_card.create_from_transparent_redirect(query_string)
|
57
54
|
end
|
58
55
|
|
56
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create_from_vault
|
59
57
|
def self.credit(token, transaction_attributes)
|
60
|
-
Transaction.credit(transaction_attributes.merge(
|
61
|
-
:payment_method_token => token
|
62
|
-
))
|
58
|
+
Transaction.credit(transaction_attributes.merge(:payment_method_token => token))
|
63
59
|
end
|
64
60
|
|
61
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create_from_vault
|
65
62
|
def self.credit!(token, transaction_attributes)
|
66
63
|
return_object_or_raise(:transaction) { credit(token, transaction_attributes) }
|
67
64
|
end
|
68
65
|
|
66
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/credit_cards/delete
|
69
67
|
def self.delete(token)
|
70
|
-
|
68
|
+
Configuration.gateway.credit_card.delete(token)
|
71
69
|
end
|
72
70
|
|
73
|
-
#
|
71
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/credit_cards/search
|
74
72
|
def self.expired(options = {})
|
75
|
-
|
76
|
-
ResourceCollection.new(response) { |ids| _fetch_expired(ids) }
|
73
|
+
Configuration.gateway.credit_card.expired(options)
|
77
74
|
end
|
78
75
|
|
79
|
-
#
|
80
|
-
# Only the month and year of the start and end dates are used.
|
76
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/credit_cards/search
|
81
77
|
def self.expiring_between(start_date, end_date, options = {})
|
82
|
-
|
83
|
-
formatted_end_date = end_date.strftime('%m%Y')
|
84
|
-
response = Http.post("/payment_methods/all/expiring_ids?start=#{formatted_start_date}&end=#{formatted_end_date}")
|
85
|
-
ResourceCollection.new(response) { |ids| _fetch_expiring_between(formatted_start_date, formatted_end_date, ids) }
|
78
|
+
Configuration.gateway.credit_card.expiring_between(start_date, end_date, options)
|
86
79
|
end
|
87
80
|
|
88
|
-
#
|
81
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/credit_cards/search
|
89
82
|
def self.find(token)
|
90
|
-
|
91
|
-
new(response[:credit_card])
|
92
|
-
rescue NotFoundError
|
93
|
-
raise NotFoundError, "payment method with token #{token.inspect} not found"
|
83
|
+
Configuration.gateway.credit_card.find(token)
|
94
84
|
end
|
95
85
|
|
86
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create_from_vault
|
96
87
|
def self.sale(token, transaction_attributes)
|
97
|
-
|
98
|
-
:payment_method_token => token
|
99
|
-
))
|
88
|
+
Configuration.gateway.transaction.sale(transaction_attributes.merge(:payment_method_token => token))
|
100
89
|
end
|
101
90
|
|
91
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create_from_vault
|
102
92
|
def self.sale!(token, transaction_attributes)
|
103
93
|
return_object_or_raise(:transaction) { sale(token, transaction_attributes) }
|
104
94
|
end
|
105
95
|
|
96
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/credit_cards/update
|
106
97
|
def self.update(token, attributes)
|
107
|
-
|
108
|
-
_do_update(:put, "/payment_methods/#{token}", :credit_card => attributes)
|
98
|
+
Configuration.gateway.credit_card.update(token, attributes)
|
109
99
|
end
|
110
100
|
|
101
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/credit_cards/update
|
111
102
|
def self.update!(token, attributes)
|
112
103
|
return_object_or_raise(:credit_card) { update(token, attributes) }
|
113
104
|
end
|
114
105
|
|
106
|
+
# Deprecated. Use Braintree::TransparentRedirect.confirm
|
107
|
+
#
|
108
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/credit_cards/update_tr
|
115
109
|
def self.update_from_transparent_redirect(query_string)
|
116
110
|
warn "[DEPRECATED] CreditCard.update_via_transparent_redirect_request is deprecated. Please use TransparentRedirect.confirm"
|
117
|
-
|
118
|
-
_do_update(:post, "/payment_methods/all/confirm_transparent_redirect_request", :id => params[:id])
|
111
|
+
Configuration.gateway.credit_card.update_from_transparent_redirect(query_string)
|
119
112
|
end
|
120
113
|
|
121
|
-
#
|
114
|
+
# Deprecated. Use Braintree::TransparentRedirect.url
|
115
|
+
#
|
116
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/credit_cards/update_tr
|
122
117
|
def self.update_credit_card_url
|
123
118
|
warn "[DEPRECATED] CreditCard.update_credit_card_url is deprecated. Please use TransparentRedirect.url"
|
124
|
-
|
125
|
-
end
|
126
|
-
|
127
|
-
def self._fetch_expired(ids)
|
128
|
-
response = Http.post("/payment_methods/all/expired", :search => {:ids => ids})
|
129
|
-
attributes = response[:payment_methods]
|
130
|
-
Util.extract_attribute_as_array(attributes, :credit_card).map { |attrs| _new(attrs) }
|
119
|
+
Configuration.gateway.credit_card.update_credit_card_url
|
131
120
|
end
|
132
121
|
|
133
|
-
def
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
)
|
138
|
-
attributes = response[:payment_methods]
|
139
|
-
Util.extract_attribute_as_array(attributes, :credit_card).map { |attrs| _new(attrs) }
|
140
|
-
end
|
141
|
-
|
142
|
-
def initialize(attributes) # :nodoc:
|
143
|
-
_init attributes
|
144
|
-
@subscriptions = (@subscriptions || []).map { |subscription_hash| Subscription._new(subscription_hash) }
|
122
|
+
def initialize(gateway, attributes) # :nodoc:
|
123
|
+
@gateway = gateway
|
124
|
+
set_instance_variables_from_hash(attributes)
|
125
|
+
@billing_address = attributes[:billing_address] ? Address._new(@gateway, attributes[:billing_address]) : nil
|
126
|
+
@subscriptions = (@subscriptions || []).map { |subscription_hash| Subscription._new(@gateway, subscription_hash) }
|
145
127
|
end
|
146
128
|
|
147
|
-
#
|
129
|
+
# Deprecated. Use Braintree::CreditCard.credit
|
130
|
+
#
|
131
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create_from_vault
|
148
132
|
def credit(transaction_attributes)
|
149
|
-
|
150
|
-
|
151
|
-
))
|
133
|
+
warn "[DEPRECATED] credit as an instance method is deprecated. Please use CreditCard.credit"
|
134
|
+
@gateway.transaction.credit(transaction_attributes.merge(:payment_method_token => token))
|
152
135
|
end
|
153
136
|
|
137
|
+
# Deprecated. Use Braintree::CreditCard.credit!
|
138
|
+
#
|
139
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create_from_vault
|
154
140
|
def credit!(transaction_attributes)
|
141
|
+
warn "[DEPRECATED] credit! as an instance method is deprecated. Please use CreditCard.credit!"
|
155
142
|
return_object_or_raise(:transaction) { credit(transaction_attributes) }
|
156
143
|
end
|
157
144
|
|
145
|
+
# Deprecated. Use Braintree::CreditCard.delete
|
146
|
+
#
|
147
|
+
# http://www.braintreepaymentsolutions.com/docs/ruby/credit_cards/delete
|
158
148
|
def delete
|
159
|
-
CreditCard.delete
|
149
|
+
warn "[DEPRECATED] delete as an instance method is deprecated. Please use CreditCard.delete"
|
150
|
+
@gateway.credit_card.delete(token)
|
160
151
|
end
|
161
152
|
|
162
153
|
# Returns true if this credit card is the customer's default.
|
@@ -187,29 +178,39 @@ module Braintree
|
|
187
178
|
"#{bin}******#{last_4}"
|
188
179
|
end
|
189
180
|
|
190
|
-
#
|
181
|
+
# Deprecated. Use Braintree::CreditCard.sale
|
182
|
+
#
|
183
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create_from_vault
|
191
184
|
def sale(transaction_attributes)
|
192
|
-
CreditCard.sale
|
185
|
+
warn "[DEPRECATED] sale as an instance method is deprecated. Please use CreditCard.sale"
|
186
|
+
@gateway.transaction.sale(transaction_attributes.merge(:payment_method_token => token))
|
193
187
|
end
|
194
188
|
|
189
|
+
# Deprecated. Use Braintree::CreditCard.sale!
|
190
|
+
#
|
191
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create_from_vault
|
195
192
|
def sale!(transaction_attributes)
|
193
|
+
warn "[DEPRECATED] sale! as an instance method is deprecated. Please use CreditCard.sale!"
|
196
194
|
return_object_or_raise(:transaction) { sale(transaction_attributes) }
|
197
195
|
end
|
198
196
|
|
197
|
+
# Deprecated. Use Braintree::CreditCard.update
|
198
|
+
#
|
199
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/credit_cards/update
|
199
200
|
def update(attributes)
|
200
|
-
|
201
|
-
|
202
|
-
if
|
203
|
-
|
204
|
-
SuccessfulResult.new(:credit_card => self)
|
205
|
-
elsif response[:api_error_response]
|
206
|
-
ErrorResult.new(response[:api_error_response])
|
207
|
-
else
|
208
|
-
raise UnexpectedError, "expected :credit_card or :api_error_response"
|
201
|
+
warn "[DEPRECATED] update as an instance method is deprecated. Please use CreditCard.update"
|
202
|
+
result = @gateway.credit_card.update(token, attributes)
|
203
|
+
if result.success?
|
204
|
+
copy_instance_variables_from_object result.credit_card
|
209
205
|
end
|
206
|
+
result
|
210
207
|
end
|
211
208
|
|
209
|
+
# Deprecated. Use Braintree::CreditCard.update!
|
210
|
+
#
|
211
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/credit_cards/update
|
212
212
|
def update!(attributes)
|
213
|
+
warn "[DEPRECATED] update! as an instance method is deprecated. Please use CreditCard.update!"
|
213
214
|
return_object_or_raise(:credit_card) { update(attributes) }
|
214
215
|
end
|
215
216
|
|
@@ -230,63 +231,8 @@ module Braintree
|
|
230
231
|
]
|
231
232
|
end
|
232
233
|
|
233
|
-
def self._create_signature # :nodoc:
|
234
|
-
_signature(:create)
|
235
|
-
end
|
236
|
-
|
237
234
|
def self._new(*args) # :nodoc:
|
238
235
|
self.new *args
|
239
236
|
end
|
240
|
-
|
241
|
-
def self._do_create(url, params=nil) # :nodoc:
|
242
|
-
response = Http.post url, params
|
243
|
-
if response[:credit_card]
|
244
|
-
SuccessfulResult.new(:credit_card => new(response[:credit_card]))
|
245
|
-
elsif response[:api_error_response]
|
246
|
-
ErrorResult.new(response[:api_error_response])
|
247
|
-
else
|
248
|
-
raise UnexpectedError, "expected :credit_card or :api_error_response"
|
249
|
-
end
|
250
|
-
end
|
251
|
-
|
252
|
-
def self._do_update(http_verb, url, params) # :nodoc:
|
253
|
-
response = Http.send http_verb, url, params
|
254
|
-
if response[:credit_card]
|
255
|
-
SuccessfulResult.new(:credit_card => new(response[:credit_card]))
|
256
|
-
elsif response[:api_error_response]
|
257
|
-
ErrorResult.new(response[:api_error_response])
|
258
|
-
else
|
259
|
-
raise UnexpectedError, "expected :credit_card or :api_error_response"
|
260
|
-
end
|
261
|
-
end
|
262
|
-
|
263
|
-
def self._update_signature # :nodoc:
|
264
|
-
_signature(:update)
|
265
|
-
end
|
266
|
-
|
267
|
-
def self._signature(type) # :nodoc:
|
268
|
-
billing_address_params = Address._shared_signature
|
269
|
-
signature = [
|
270
|
-
:cardholder_name, :cvv, :expiration_date, :expiration_month, :expiration_year, :number, :token,
|
271
|
-
{:options => [:make_default, :verification_merchant_account_id, :verify_card]},
|
272
|
-
{:billing_address => billing_address_params}
|
273
|
-
]
|
274
|
-
|
275
|
-
case type
|
276
|
-
when :create
|
277
|
-
signature << :customer_id
|
278
|
-
when :update
|
279
|
-
billing_address_params << {:options => [:update_existing]}
|
280
|
-
else
|
281
|
-
raise ArgumentError
|
282
|
-
end
|
283
|
-
|
284
|
-
return signature
|
285
|
-
end
|
286
|
-
|
287
|
-
def _init(attributes) # :nodoc:
|
288
|
-
set_instance_variables_from_hash(attributes)
|
289
|
-
@billing_address = attributes[:billing_address] ? Address._new(attributes[:billing_address]) : nil
|
290
|
-
end
|
291
237
|
end
|
292
238
|
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
module Braintree
|
2
|
+
class CreditCardGateway # :nodoc:
|
3
|
+
def initialize(gateway)
|
4
|
+
@gateway = gateway
|
5
|
+
@config = gateway.config
|
6
|
+
end
|
7
|
+
|
8
|
+
def create(attributes)
|
9
|
+
if attributes.has_key?(:expiration_date) && (attributes.has_key?(:expiration_month) || attributes.has_key?(:expiration_year))
|
10
|
+
raise ArgumentError.new("create with both expiration_month and expiration_year or only expiration_date")
|
11
|
+
end
|
12
|
+
Util.verify_keys(CreditCardGateway._create_signature, attributes)
|
13
|
+
_do_create("/payment_methods", :credit_card => attributes)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Deprecated
|
17
|
+
def create_credit_card_url
|
18
|
+
"#{@config.base_merchant_url}/payment_methods/all/create_via_transparent_redirect_request"
|
19
|
+
end
|
20
|
+
|
21
|
+
# Deprecated
|
22
|
+
def create_from_transparent_redirect(query_string)
|
23
|
+
params = @gateway.transparent_redirect.parse_and_validate_query_string query_string
|
24
|
+
_do_create("/payment_methods/all/confirm_transparent_redirect_request", :id => params[:id])
|
25
|
+
end
|
26
|
+
|
27
|
+
def delete(token)
|
28
|
+
@config.http.delete("/payment_methods/#{token}")
|
29
|
+
end
|
30
|
+
|
31
|
+
def expired(options = {})
|
32
|
+
response = @config.http.post("/payment_methods/all/expired_ids")
|
33
|
+
ResourceCollection.new(response) { |ids| _fetch_expired(ids) }
|
34
|
+
end
|
35
|
+
|
36
|
+
def expiring_between(start_date, end_date, options = {})
|
37
|
+
formatted_start_date = start_date.strftime('%m%Y')
|
38
|
+
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
|
+
ResourceCollection.new(response) { |ids| _fetch_expiring_between(formatted_start_date, formatted_end_date, ids) }
|
41
|
+
end
|
42
|
+
|
43
|
+
def find(token)
|
44
|
+
response = @config.http.get "/payment_methods/#{token}"
|
45
|
+
CreditCard._new(@gateway, response[:credit_card])
|
46
|
+
rescue NotFoundError
|
47
|
+
raise NotFoundError, "payment method with token #{token.inspect} not found"
|
48
|
+
end
|
49
|
+
|
50
|
+
def update(token, attributes)
|
51
|
+
Util.verify_keys(CreditCardGateway._update_signature, attributes)
|
52
|
+
_do_update(:put, "/payment_methods/#{token}", :credit_card => attributes)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Deprecated
|
56
|
+
def update_from_transparent_redirect(query_string)
|
57
|
+
warn "[DEPRECATED] CreditCard.update_via_transparent_redirect_request is deprecated. Please use TransparentRedirect.confirm"
|
58
|
+
params = @gateway.transparent_redirect.parse_and_validate_query_string query_string
|
59
|
+
_do_update(:post, "/payment_methods/all/confirm_transparent_redirect_request", :id => params[:id])
|
60
|
+
end
|
61
|
+
|
62
|
+
# Deprecated
|
63
|
+
def update_credit_card_url
|
64
|
+
warn "[DEPRECATED] CreditCard.update_credit_card_url is deprecated. Please use TransparentRedirect.url"
|
65
|
+
"#{@config.base_merchant_url}/payment_methods/all/update_via_transparent_redirect_request"
|
66
|
+
end
|
67
|
+
|
68
|
+
def self._create_signature # :nodoc:
|
69
|
+
_signature(:create)
|
70
|
+
end
|
71
|
+
|
72
|
+
def self._update_signature # :nodoc:
|
73
|
+
_signature(:update)
|
74
|
+
end
|
75
|
+
|
76
|
+
def self._signature(type) # :nodoc:
|
77
|
+
billing_address_params = AddressGateway._shared_signature
|
78
|
+
signature = [
|
79
|
+
:cardholder_name, :cvv, :expiration_date, :expiration_month, :expiration_year, :number, :token,
|
80
|
+
{:options => [:make_default, :verification_merchant_account_id, :verify_card]},
|
81
|
+
{:billing_address => billing_address_params}
|
82
|
+
]
|
83
|
+
|
84
|
+
case type
|
85
|
+
when :create
|
86
|
+
signature << :customer_id
|
87
|
+
when :update
|
88
|
+
billing_address_params << {:options => [:update_existing]}
|
89
|
+
else
|
90
|
+
raise ArgumentError
|
91
|
+
end
|
92
|
+
|
93
|
+
return signature
|
94
|
+
end
|
95
|
+
|
96
|
+
def _do_create(url, params=nil) # :nodoc:
|
97
|
+
response = @config.http.post url, params
|
98
|
+
if response[:credit_card]
|
99
|
+
SuccessfulResult.new(:credit_card => CreditCard._new(@gateway, response[:credit_card]))
|
100
|
+
elsif response[:api_error_response]
|
101
|
+
ErrorResult.new(@gateway, response[:api_error_response])
|
102
|
+
else
|
103
|
+
raise UnexpectedError, "expected :credit_card or :api_error_response"
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def _do_update(http_verb, url, params) # :nodoc:
|
108
|
+
response = @config.http.send http_verb, url, params
|
109
|
+
if response[:credit_card]
|
110
|
+
SuccessfulResult.new(:credit_card => CreditCard._new(@gateway, response[:credit_card]))
|
111
|
+
elsif response[:api_error_response]
|
112
|
+
ErrorResult.new(@gateway, response[:api_error_response])
|
113
|
+
else
|
114
|
+
raise UnexpectedError, "expected :credit_card or :api_error_response"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def _fetch_expired(ids) # :nodoc:
|
119
|
+
response = @config.http.post("/payment_methods/all/expired", :search => {:ids => ids})
|
120
|
+
attributes = response[:payment_methods]
|
121
|
+
Util.extract_attribute_as_array(attributes, :credit_card).map { |attrs| CreditCard._new(@gateway, attrs) }
|
122
|
+
end
|
123
|
+
|
124
|
+
def _fetch_expiring_between(formatted_start_date, formatted_end_date, ids) # :nodoc:
|
125
|
+
response = @config.http.post(
|
126
|
+
"/payment_methods/all/expiring?start=#{formatted_start_date}&end=#{formatted_end_date}",
|
127
|
+
:search => {:ids => ids}
|
128
|
+
)
|
129
|
+
attributes = response[:payment_methods]
|
130
|
+
Util.extract_attribute_as_array(attributes, :credit_card).map { |attrs| CreditCard._new(@gateway, attrs) }
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -1,7 +1,15 @@
|
|
1
1
|
module Braintree
|
2
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/general/card_verification
|
2
3
|
class CreditCardVerification
|
3
4
|
include BaseModule
|
4
5
|
|
6
|
+
module Status
|
7
|
+
FAILED = 'failed'
|
8
|
+
GATEWAY_REJECTED = 'gateway_rejected'
|
9
|
+
PROCESSOR_DECLINED = 'processor_declined'
|
10
|
+
VERIFIED = 'verified'
|
11
|
+
end
|
12
|
+
|
5
13
|
attr_reader :avs_error_response_code, :avs_postal_code_response_code, :avs_street_address_response_code,
|
6
14
|
:cvv_response_code, :merchant_account_id, :processor_response_code, :processor_response_text, :status,
|
7
15
|
:gateway_rejection_reason
|