Class: ActiveMerchant::Billing::BraintreeBlueGateway
Overview
For more information on the Braintree Gateway please visit their Developer Portal
About this implementation
This implementation leverages the Braintree-authored ruby gem: github.com/braintree/braintree_ruby
Setting an ActiveMerchant wiredump_device
will automatically configure the Braintree logger (via the Braintree gem’s configuration) when the BraintreeBlueGateway is instantiated. Additionally, the log level will be set to DEBUG
. Therefore, all you have to do is set the wiredump_device
and you’ll get your debug output from your HTTP interactions with the remote gateway. (Don’t enable this in production.) The ActiveMerchant implementation doesn’t mess with the Braintree::Configuration globals at all, so there won’t be any side effects outside Active Merchant.
If no wiredump_device
is set, the logger in Braintree::Configuration.logger
will be cloned and the log level set to WARN
.
Constant Summary
collapse
- ERROR_CODES =
{
cannot_refund_if_unsettled: 91506
}
Constants inherited
from Gateway
Gateway::CREDIT_DEPRECATION_MESSAGE, Gateway::DEBIT_CARDS, Gateway::RECURRING_DEPRECATION_MESSAGE, Gateway::STANDARD_ERROR_CODE
Instance Attribute Summary
Attributes inherited from Gateway
#options
Instance Method Summary
collapse
-
#authorize(money, credit_card_or_vault_id, options = {}) ⇒ Object
-
#capture(money, authorization, options = {}) ⇒ Object
-
#credit(money, credit_card_or_vault_id, options = {}) ⇒ Object
-
#initialize(options = {}) ⇒ BraintreeBlueGateway
constructor
A new instance of BraintreeBlueGateway.
-
#purchase(money, credit_card_or_vault_id, options = {}) ⇒ Object
-
#refund(*args) ⇒ Object
-
#store(creditcard, options = {}) ⇒ Object
-
#supports_network_tokenization? ⇒ Boolean
-
#unstore(customer_vault_id, options = {}) ⇒ Object
(also: #delete)
-
#update(vault_id, creditcard, options = {}) ⇒ Object
-
#verify(credit_card, options = {}) ⇒ Object
-
#verify_credentials ⇒ Object
-
#void(authorization, options = {}) ⇒ Object
included, #scrub, #supports_scrubbing
Methods inherited from Gateway
#card_brand, card_brand, #generate_unique_id, inherited, #scrub, supported_countries, #supported_countries, supported_countries=, supports?, #supports_scrubbing?, #test?
#expdate, #format
Methods included from PostsData
included, #raw_ssl_request, #ssl_get, #ssl_post, #ssl_request
Constructor Details
Returns a new instance of BraintreeBlueGateway.
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
# File 'lib/active_merchant/billing/gateways/braintree_blue.rb', line 49
def initialize(options = {})
requires!(options, :merchant_id, :public_key, :private_key)
@merchant_account_id = options[:merchant_account_id]
super
if wiredump_device.present?
logger = ((Logger === wiredump_device) ? wiredump_device : Logger.new(wiredump_device))
logger.level = Logger::DEBUG
else
logger = Braintree::Configuration.logger.clone
logger.level = Logger::WARN
end
@configuration = Braintree::Configuration.new(
:merchant_id => options[:merchant_id],
:public_key => options[:public_key],
:private_key => options[:private_key],
:environment => (options[:environment] || (test? ? :sandbox : :production)).to_sym,
:custom_user_agent => "ActiveMerchant #{ActiveMerchant::VERSION}",
:logger => options[:logger] || logger,
)
@braintree_gateway = Braintree::Gateway.new( @configuration )
end
|
Instance Method Details
#authorize(money, credit_card_or_vault_id, options = {}) ⇒ Object
75
76
77
|
# File 'lib/active_merchant/billing/gateways/braintree_blue.rb', line 75
def authorize(money, credit_card_or_vault_id, options = {})
create_transaction(:sale, money, credit_card_or_vault_id, options)
end
|
#capture(money, authorization, options = {}) ⇒ Object
79
80
81
82
83
84
|
# File 'lib/active_merchant/billing/gateways/braintree_blue.rb', line 79
def capture(money, authorization, options = {})
commit do
result = @braintree_gateway.transaction.submit_for_settlement(authorization, amount(money).to_s)
response_from_result(result)
end
end
|
#credit(money, credit_card_or_vault_id, options = {}) ⇒ Object
90
91
92
|
# File 'lib/active_merchant/billing/gateways/braintree_blue.rb', line 90
def credit(money, credit_card_or_vault_id, options = {})
create_transaction(:credit, money, credit_card_or_vault_id, options)
end
|
#purchase(money, credit_card_or_vault_id, options = {}) ⇒ Object
86
87
88
|
# File 'lib/active_merchant/billing/gateways/braintree_blue.rb', line 86
def purchase(money, credit_card_or_vault_id, options = {})
authorize(money, credit_card_or_vault_id, options.merge(:submit_for_settlement => true))
end
|
#refund(*args) ⇒ Object
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
# File 'lib/active_merchant/billing/gateways/braintree_blue.rb', line 94
def refund(*args)
money, transaction_id, options = (args)
money = amount(money).to_s if money
commit do
response = response_from_result(@braintree_gateway.transaction.refund(transaction_id, money))
return response if response.success?
return response unless options[:force_full_refund_if_unsettled]
void(transaction_id) if response.message =~ /#{ERROR_CODES[:cannot_refund_if_unsettled]}/
end
end
|
#store(creditcard, options = {}) ⇒ Object
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
# File 'lib/active_merchant/billing/gateways/braintree_blue.rb', line 122
def store(creditcard, options = {})
if options[:customer].present?
MultiResponse.new.tap do |r|
customer_exists_response = nil
r.process{customer_exists_response = check_customer_exists(options[:customer])}
r.process do
if customer_exists_response.params["exists"]
add_credit_card_to_customer(creditcard, options)
else
add_customer_with_credit_card(creditcard, options)
end
end
end
else
add_customer_with_credit_card(creditcard, options)
end
end
|
#supports_network_tokenization? ⇒ Boolean
182
183
184
|
# File 'lib/active_merchant/billing/gateways/braintree_blue.rb', line 182
def supports_network_tokenization?
true
end
|
#unstore(customer_vault_id, options = {}) ⇒ Object
Also known as:
delete
170
171
172
173
174
175
176
177
178
179
|
# File 'lib/active_merchant/billing/gateways/braintree_blue.rb', line 170
def unstore(customer_vault_id, options = {})
commit do
if(!customer_vault_id && options[:credit_card_token])
@braintree_gateway.credit_card.delete(options[:credit_card_token])
else
@braintree_gateway.customer.delete(customer_vault_id)
end
Response.new(true, "OK")
end
end
|
#update(vault_id, creditcard, options = {}) ⇒ Object
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
# File 'lib/active_merchant/billing/gateways/braintree_blue.rb', line 140
def update(vault_id, creditcard, options = {})
braintree_credit_card = nil
commit do
braintree_credit_card = @braintree_gateway.customer.find(vault_id).credit_cards.detect { |cc| cc.default? }
return Response.new(false, 'Braintree::NotFoundError') if braintree_credit_card.nil?
options.merge!(:update_existing_token => braintree_credit_card.token)
credit_card_params = merge_credit_card_options({
:credit_card => {
:cardholder_name => creditcard.name,
:number => creditcard.number,
:cvv => creditcard.verification_value,
:expiration_month => creditcard.month.to_s.rjust(2, "0"),
:expiration_year => creditcard.year.to_s
}
}, options)[:credit_card]
result = @braintree_gateway.customer.update(vault_id,
:first_name => creditcard.first_name,
:last_name => creditcard.last_name,
:email => scrub_email(options[:email]),
:credit_card => credit_card_params
)
Response.new(result.success?, message_from_result(result),
:braintree_customer => (customer_hash(@braintree_gateway.customer.find(vault_id), :include_credit_cards) if result.success?),
:customer_vault_id => (result.customer.id if result.success?)
)
end
end
|
#verify(credit_card, options = {}) ⇒ Object
115
116
117
118
119
120
|
# File 'lib/active_merchant/billing/gateways/braintree_blue.rb', line 115
def verify(credit_card, options = {})
MultiResponse.run(:use_first_response) do |r|
r.process { authorize(100, credit_card, options) }
r.process(:ignore_result) { void(r.authorization, options) }
end
end
|
#verify_credentials ⇒ Object
186
187
188
189
190
191
192
193
194
195
196
|
# File 'lib/active_merchant/billing/gateways/braintree_blue.rb', line 186
def verify_credentials
begin
@braintree_gateway.transaction.find("non_existent_token")
rescue Braintree::AuthenticationError
return false
rescue Braintree::NotFoundError
return true
end
true
end
|
#void(authorization, options = {}) ⇒ Object
109
110
111
112
113
|
# File 'lib/active_merchant/billing/gateways/braintree_blue.rb', line 109
def void(authorization, options = {})
commit do
response_from_result(@braintree_gateway.transaction.void(authorization))
end
end
|