lib/active_merchant/billing/gateways/braintree.rb in activemerchant-1.4.2 vs lib/active_merchant/billing/gateways/braintree.rb in activemerchant-1.5.0

- old
+ new

@@ -1,222 +1,17 @@ -require File.join(File.dirname(__FILE__), '..', 'check.rb') - +require File.join(File.dirname(__FILE__),'smart_ps.rb') module ActiveMerchant #:nodoc: module Billing #:nodoc: - class BraintreeGateway < Gateway - URL = 'https://secure.braintreepaymentgateway.com/api/transact.php' + class BraintreeGateway < SmartPs + def api_url + 'https://secure.braintreepaymentgateway.com/api/transact.php' + end self.supported_countries = ['US'] self.supported_cardtypes = [:visa, :master, :american_express, :discover] self.homepage_url = 'http://www.braintreepaymentsolutions.com' self.display_name = 'Braintree' - - def initialize(options = {}) - requires!(options, :login, :password) - @options = options - super - end - - # Pass :store => true in the options to store the - # payment info at BrainTree and get a generated - # customer_vault_id in the response. - # Pass :store => some_number_or_string to specify the - # customer_vault_id BrainTree should use (make sure it's - # unique). - def authorize(money, payment_source, options = {}) - post = {} - add_invoice(post, options) - add_payment_source(post, payment_source, options) - add_address(post, payment_source, options) - add_customer_data(post, options) - - commit('auth', money, post) - end - - def purchase(money, payment_source, options = {}) - post = {} - add_invoice(post, options) - add_payment_source(post, payment_source, options) - add_address(post, payment_source, options) - add_customer_data(post, options) - - commit('sale', money, post) - end - - def capture(money, authorization, options = {}) - post ={} - post[:transactionid] = authorization - commit('capture', money, post) - end - - def void(authorization, options = {}) - post ={} - post[:transactionid] = authorization - commit('void', nil, post) - end - - # Update the values (such as CC expiration) stored at - # BrainTree. The CC number must be supplied in the - # CreditCard object. - def update(vault_id, creditcard, options = {}) - post = {} - post[:customer_vault] = "update_customer" - add_customer_vault_id(post, vault_id) - add_creditcard(post, creditcard, options) - add_address(post, creditcard, options) - add_customer_data(post, options) - - commit(nil, nil, post) - end - - def delete(vault_id) - post = {} - post[:customer_vault] = "delete_customer" - add_customer_vault_id(post, vault_id) - commit(nil, nil, post) - end - - # To match the other stored-value gateways, like TrustCommerce, - # store and unstore need to be defined - def store(payment_source, options = {}) - billing_id = options.delete(:billing_id).to_s || true - post = {} - post[:customer_vault] = 'add_customer' - if billing_id - post[:customer_vault_id] = billing_id - end - add_payment_source(post, payment_source, options) - add_address(post, payment_source, options) - add_customer_data(post, options) - commit(nil,nil, post) - end - - alias_method :unstore, :delete - - private - def add_customer_data(post, options) - if options.has_key? :email - post[:email] = options[:email] - end - - if options.has_key? :ip - post[:ipaddress] = options[:ip] - end - end - - def add_address(post, creditcard, options) - if address = options[:billing_address] || options[:address] - post[:address1] = address[:address1].to_s - post[:address2] = address[:address2].to_s unless address[:address2].blank? - post[:company] = address[:company].to_s - post[:phone] = address[:phone].to_s - post[:zip] = address[:zip].to_s - post[:city] = address[:city].to_s - post[:country] = address[:country].to_s - post[:state] = address[:state].blank? ? 'n/a' : address[:state] - end - end - - def add_invoice(post, options) - post[:orderid] = options[:order_id].to_s.gsub(/[^\w.]/, '') - end - - def add_payment_source(params, source, options={}) - case determine_funding_source(source) - when :vault then add_customer_vault_id(params, source) - when :credit_card then add_creditcard(params, source, options) - when :check then add_check(params, source) - end - end - - def add_customer_vault_id(params,vault_id) - params[:customer_vault_id] = vault_id - end - - def add_creditcard(post, creditcard,options) - if options[:store] - post[:customer_vault] = "add_customer" - post[:customer_vault_id] = options[:store] unless options[:store] == true - end - post[:ccnumber] = creditcard.number - post[:cvv] = creditcard.verification_value if creditcard.verification_value? - post[:ccexp] = expdate(creditcard) - post[:firstname] = creditcard.first_name - post[:lastname] = creditcard.last_name - end - - def add_check(post, check) - post[:payment] = 'check' # Set transaction to ACH - post[:checkname] = check.name # The name on the customer's Checking Account - post[:checkaba] = check.routing_number # The customer's bank routing number - post[:checkaccount] = check.account_number # The customer's account number - post[:account_holder_type] = check.account_holder_type # The customer's type of ACH account - post[:account_type] = check.account_type # The customer's type of ACH account - end - - def parse(body) - results = {} - body.split(/&/).each do |pair| - key,val = pair.split(/=/) - results[key] = val - end - - results - end - - def commit(action, money, parameters) - parameters[:amount] = amount(money) if money - - response = parse( ssl_post(URL, post_data(action,parameters)) ) - - Response.new(response["response"] == "1", message_from(response), response, - :authorization => response["transactionid"], - :test => test?, - :cvv_result => response["cvvresponse"], - :avs_result => { :code => response["avsresponse"] } - ) - - end - - def expdate(creditcard) - year = sprintf("%.4i", creditcard.year) - month = sprintf("%.2i", creditcard.month) - - "#{month}#{year[-2..-1]}" - end - - - def message_from(response) - case response["responsetext"] - when "SUCCESS","Approved" - "This transaction has been approved" - when "DECLINE" - "This transaction has been declined" - else - response["responsetext"] - end - end - - def post_data(action, parameters = {}) - post = {} - post[:username] = @options[:login] - post[:password] = @options[:password] - post[:type] = action if action - - request = post.merge(parameters).map {|key,value| "#{key}=#{CGI.escape(value.to_s)}"}.join("&") - request - end - - def determine_funding_source(source) - case - when source.is_a?(String) then :vault - when CreditCard.card_companies.keys.include?(card_brand(source)) then :credit_card - when card_brand(source) == 'check' then :check - else raise ArgumentError, "Unsupported funding source provided" - end - end + self.default_currency = 'USD' end - - BrainTreeGateway = BraintreeGateway end end