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