lib/active_merchant/billing/gateways/authorize_net.rb in activemerchant-1.116.0 vs lib/active_merchant/billing/gateways/authorize_net.rb in activemerchant-1.117.0

- old
+ new

@@ -255,10 +255,12 @@ add_customer_data(xml, payment, options) add_market_type_device_type(xml, payment, options) add_settings(xml, payment, options) add_user_fields(xml, amount, options) add_ship_from_address(xml, options) + add_processing_options(xml, options) + add_subsequent_auth_information(xml, options) end end def add_cim_auth_purchase(xml, transaction_type, amount, payment, options) add_order_id(xml, options) @@ -406,11 +408,11 @@ String(key).split('_').inject([]) { |buffer, e| buffer.push(buffer.empty? ? e : e.capitalize) }.join end def add_settings(xml, source, options) xml.transactionSettings do - if options[:recurring] + if options[:recurring] || subsequent_recurring_transaction?(options) xml.setting do xml.settingName('recurringBilling') xml.settingValue('true') end end @@ -700,10 +702,34 @@ def add_extra_options_for_cim(xml, options) xml.extraOptions("x_delim_char=#{options[:delimiter]}") if options[:delimiter] end + def add_processing_options(xml, options) + return unless options[:stored_credential] + + xml.processingOptions do + if options[:stored_credential][:initial_transaction] + xml.isFirstSubsequentAuth 'true' + # xml.isFirstRecurringPayment 'true' if options[:stored_credential][:reason_type] == 'recurring' + elsif options[:stored_credential][:initiator] == 'cardholder' + xml.isStoredCredentials 'true' + else + xml.isSubsequentAuth 'true' + end + end + end + + def add_subsequent_auth_information(xml, options) + return unless options.dig(:stored_credential, :reason_type) == 'unscheduled' + + xml.subsequentAuthInformation do + xml.reason options[:stored_credential_reason_type_override] if options[:stored_credential_reason_type_override] + xml.originalNetworkTransId options[:stored_credential][:network_transaction_id] if options[:stored_credential][:network_transaction_id] + end + end + def create_customer_payment_profile(credit_card, options) commit(:cim_store_update, options) do |xml| xml.customerProfileId options[:customer_profile_id] xml.paymentProfile do add_billing_address(xml, credit_card, options) @@ -760,9 +786,13 @@ if %w[US CA].include?(address[:country]) address[:state] || 'NC' else address[:state] || 'n/a' end + end + + def subsequent_recurring_transaction?(options) + options.dig(:stored_credential, :reason_type) == 'recurring' && !options.dig(:stored_credential, :initial_transaction) end def headers { 'Content-Type' => 'text/xml' } end