lib/active_merchant/billing/gateways/blue_snap.rb in activemerchant-1.103.0 vs lib/active_merchant/billing/gateways/blue_snap.rb in activemerchant-1.104.0
- old
+ new
@@ -254,10 +254,11 @@
end
end
def add_level_3_data(doc, options)
return unless options[:customer_reference_number]
+
doc.send('level-3-data') do
send_when_present(doc, :customer_reference_number, options)
send_when_present(doc, :sales_tax_amount, options)
send_when_present(doc, :freight_amount, options)
send_when_present(doc, :duty_amount, options)
@@ -271,10 +272,11 @@
end
end
def send_when_present(doc, options_key, options, xml_element_name = nil)
return unless options[options_key]
+
xml_element_name ||= options_key.to_s
doc.send(xml_element_name.dasherize, options[options_key])
end
@@ -378,11 +380,11 @@
parsed = parse(response)
succeeded = success_from(action, response)
Response.new(
succeeded,
- message_from(succeeded, parsed),
+ message_from(succeeded, response),
parsed,
authorization: authorization_from(action, parsed, payment_method_details),
avs_result: avs_result(parsed),
cvv_result: cvv_result(parsed),
error_code: error_code_from(parsed),
@@ -410,20 +412,46 @@
def success_from(action, response)
(200...300).cover?(response.code.to_i)
end
- def message_from(succeeded, parsed_response)
+ def message_from(succeeded, response)
return 'Success' if succeeded
- parsed_response['description']
+
+ parsed = parse(response)
+ if parsed.dig('error-name') == 'FRAUD_DETECTED'
+ fraud_codes_from(response)
+ else
+ parsed['description']
+ end
end
+ def fraud_codes_from(response)
+ event_summary = {}
+ doc = Nokogiri::XML(response.body)
+ fraud_events = doc.xpath('//xmlns:fraud-events', 'xmlns' => 'http://ws.plimus.com')
+ fraud_events.children.each do |child|
+ if child.children.children.any?
+ event_summary[child.name] = event_summary[child.name] || []
+ event = {}
+ child.children.each do |chi|
+ event[chi.name] = chi.text
+ end
+ event_summary[child.name] << event
+ else
+ event_summary[child.name] = child.text
+ end
+ end
+ event_summary.to_json
+ end
+
def authorization_from(action, parsed_response, payment_method_details)
action == :store ? vaulted_shopper_id(parsed_response, payment_method_details) : parsed_response['transaction-id']
end
def vaulted_shopper_id(parsed_response, payment_method_details)
return nil unless parsed_response['content-location-header']
+
vaulted_shopper_id = parsed_response['content-location-header'].split('/').last
vaulted_shopper_id += "|#{payment_method_details.payment_method_type}" if payment_method_details.alt_transaction?
vaulted_shopper_id
end