lib/active_merchant/billing/gateways/cyber_source.rb in activemerchant-1.46.0 vs lib/active_merchant/billing/gateways/cyber_source.rb in activemerchant-1.47.0

- old
+ new

@@ -25,15 +25,17 @@ # calculating tax/VAT. # * All transactions use dollar values. # * To process pinless debit cards through the pinless debit card # network, your Cybersource merchant account must accept pinless # debit card payments. + # * The order of the XML elements does matter, make sure to follow the order in + # the documentation exactly. class CyberSourceGateway < Gateway self.test_url = 'https://ics2wstest.ic3.com/commerce/1.x/transactionProcessor' self.live_url = 'https://ics2ws.ic3.com/commerce/1.x/transactionProcessor' - XSD_VERSION = "1.69" + XSD_VERSION = "1.109" # visa, master, american_express, discover self.supported_cardtypes = [:visa, :master, :american_express, :discover] self.supported_countries = %w(US BR CA CN DK FI FR DE JP MX NO SE GB SG) self.default_currency = 'USD' @@ -239,45 +241,45 @@ end def build_auth_request(money, creditcard_or_reference, options) xml = Builder::XmlMarkup.new :indent => 2 add_payment_method_or_subscription(xml, money, creditcard_or_reference, options) - add_auth_service(xml) - add_business_rules_data(xml, options) + add_auth_service(xml, creditcard_or_reference, options) + add_business_rules_data(xml, creditcard_or_reference, options) xml.target! end def build_tax_calculation_request(creditcard, options) xml = Builder::XmlMarkup.new :indent => 2 add_address(xml, creditcard, options[:billing_address], options, false) add_address(xml, creditcard, options[:shipping_address], options, true) add_line_item_data(xml, options) add_purchase_data(xml, 0, false, options) add_tax_service(xml) - add_business_rules_data(xml, options) + add_business_rules_data(xml, creditcard, options) xml.target! end def build_capture_request(money, authorization, options) order_id, request_id, request_token = authorization.split(";") options[:order_id] = order_id xml = Builder::XmlMarkup.new :indent => 2 add_purchase_data(xml, money, true, options) add_capture_service(xml, request_id, request_token) - add_business_rules_data(xml, options) + add_business_rules_data(xml, authorization, options) xml.target! end def build_purchase_request(money, payment_method_or_reference, options) xml = Builder::XmlMarkup.new :indent => 2 add_payment_method_or_subscription(xml, money, payment_method_or_reference, options) if !payment_method_or_reference.is_a?(String) && card_brand(payment_method_or_reference) == 'check' add_check_service(xml) else - add_purchase_service(xml, options) - add_business_rules_data(xml, options) unless options[:pinless_debit_card] + add_purchase_service(xml, payment_method_or_reference, options) + add_business_rules_data(xml, payment_method_or_reference, options) unless options[:pinless_debit_card] end xml.target! end def build_void_request(identification, options) @@ -338,15 +340,15 @@ add_subscription(xml, options) if options[:setup_fee] if card_brand(payment_method) == 'check' add_check_service(xml, options) else - add_purchase_service(xml, options) + add_purchase_service(xml, payment_method, options) end end add_subscription_create_service(xml, options) - add_business_rules_data(xml, options) + add_business_rules_data(xml, payment_method, options) xml.target! end def build_update_subscription_request(reference, creditcard, options) xml = Builder::XmlMarkup.new :indent => 2 @@ -354,11 +356,11 @@ add_purchase_data(xml, options[:setup_fee], true, options) unless options[:setup_fee].blank? add_creditcard(xml, creditcard) if creditcard add_creditcard_payment_method(xml) if creditcard add_subscription(xml, options, reference) add_subscription_update_service(xml, options) - add_business_rules_data(xml, options) + add_business_rules_data(xml, creditcard, options) xml.target! end def build_delete_subscription_request(reference, options) xml = Builder::XmlMarkup.new :indent => 2 @@ -379,16 +381,18 @@ add_creditcard(xml, creditcard) add_validate_pinless_debit_service(xml) xml.target! end - def add_business_rules_data(xml, options) + def add_business_rules_data(xml, payment_method, options) prioritized_options = [options, @options] - xml.tag! 'businessRules' do - xml.tag!('ignoreAVSResult', 'true') if extract_option(prioritized_options, :ignore_avs) - xml.tag!('ignoreCVResult', 'true') if extract_option(prioritized_options, :ignore_cvv) + unless network_tokenization?(payment_method) + xml.tag! 'businessRules' do + xml.tag!('ignoreAVSResult', 'true') if extract_option(prioritized_options, :ignore_avs) + xml.tag!('ignoreCVResult', 'true') if extract_option(prioritized_options, :ignore_cvv) + end end end def extract_option prioritized_options, option_name options_matching_key = prioritized_options.detect do |options| @@ -466,25 +470,65 @@ xml.tag!('nexus', @options[:nexus]) unless @options[:nexus].blank? xml.tag!('sellerRegistration', @options[:vat_reg_number]) unless @options[:vat_reg_number].blank? end end - def add_auth_service(xml) - xml.tag! 'ccAuthService', {'run' => 'true'} + def add_auth_service(xml, payment_method, options) + if network_tokenization?(payment_method) + add_network_tokenization(xml, payment_method, options) + else + xml.tag! 'ccAuthService', {'run' => 'true'} + end end + def network_tokenization?(payment_method) + payment_method.is_a?(NetworkTokenizationCreditCard) + end + + def add_network_tokenization(xml, payment_method, options) + return unless network_tokenization?(payment_method) + + case card_brand(payment_method).to_sym + when :visa + xml.tag! 'ccAuthService', {'run' => 'true'} do + xml.tag!("cavv", payment_method.payment_cryptogram) + xml.tag!("commerceIndicator", "vbv") + xml.tag!("xid", payment_method.payment_cryptogram) + end + when :mastercard + xml.tag! 'ucaf' do + xml.tag!("authenticationData", payment_method.payment_cryptogram) + xml.tag!("collectionIndicator", "2") + end + xml.tag! 'ccAuthService', {'run' => 'true'} do + xml.tag!("commerceIndicator", "spa") + end + when :american_express + cryptogram = Base64.decode64(payment_method.payment_cryptogram) + xml.tag! 'ccAuthService', {'run' => 'true'} do + xml.tag!("cavv", Base64.encode64(cryptogram[0...20])) + xml.tag!("commerceIndicator", "aesk") + xml.tag!("xid", Base64.encode64(cryptogram[20...40])) + end + end + + xml.tag! 'paymentNetworkToken' do + xml.tag!('transactionType', "1") + end + end + def add_capture_service(xml, request_id, request_token) xml.tag! 'ccCaptureService', {'run' => 'true'} do xml.tag! 'authRequestID', request_id xml.tag! 'authRequestToken', request_token end end - def add_purchase_service(xml, options) + def add_purchase_service(xml, payment_method, options) if options[:pinless_debit_card] xml.tag! 'pinlessDebitService', {'run' => 'true'} else - xml.tag! 'ccAuthService', {'run' => 'true'} + add_auth_service(xml, payment_method, options) xml.tag! 'ccCaptureService', {'run' => 'true'} end end def add_void_service(xml, request_id, request_token)