fix: Improve WhatsApp template message error handling (#12168)

WhatsApp template message errors were not being properly handled because
the `@message instance` variable was only set in the `send_message`
method but not in `send_template`. When template sending failed, the
`handle_error` method couldn't update the message status due to the
missing @message reference, resulting in silent failures with no user
feedback.
This commit is contained in:
Muhsin Keloth
2025-08-12 16:31:56 +05:30
committed by GitHub
parent fdcfed2cd7
commit dbb164a37d
7 changed files with 27 additions and 26 deletions

View File

@@ -84,7 +84,7 @@ class Whatsapp::OneoffCampaignService
namespace: namespace,
lang_code: lang_code,
parameters: processed_parameters
})
}, nil)
rescue StandardError => e
Rails.logger.error "Failed to send WhatsApp template message to #{to}: #{e.message}"

View File

@@ -15,7 +15,7 @@ class Whatsapp::Providers::BaseService
raise 'Overwrite this method in child class'
end
def send_template(_phone_number, _template_info)
def send_template(_phone_number, _template_info, _message)
raise 'Overwrite this method in child class'
end
@@ -31,27 +31,27 @@ class Whatsapp::Providers::BaseService
raise 'Overwrite this method in child class'
end
def process_response(response)
def process_response(response, message)
parsed_response = response.parsed_response
if response.success? && parsed_response['error'].blank?
parsed_response['messages'].first['id']
else
handle_error(response)
handle_error(response, message)
nil
end
end
def handle_error(response)
def handle_error(response, message)
Rails.logger.error response.body
return if @message.blank?
return if message.blank?
# https://developers.facebook.com/docs/whatsapp/cloud-api/support/error-codes/#sample-response
error_message = error_message(response)
return if error_message.blank?
@message.external_error = error_message
@message.status = :failed
@message.save!
message.external_error = error_message
message.status = :failed
message.save!
end
def create_buttons(items)

View File

@@ -10,7 +10,7 @@ class Whatsapp::Providers::Whatsapp360DialogService < Whatsapp::Providers::BaseS
end
end
def send_template(phone_number, template_info)
def send_template(phone_number, template_info, message)
response = HTTParty.post(
"#{api_base_path}/messages",
headers: api_headers,
@@ -21,7 +21,7 @@ class Whatsapp::Providers::Whatsapp360DialogService < Whatsapp::Providers::BaseS
}.to_json
)
process_response(response)
process_response(response, message)
end
def sync_templates
@@ -68,7 +68,7 @@ class Whatsapp::Providers::Whatsapp360DialogService < Whatsapp::Providers::BaseS
}.to_json
)
process_response(response)
process_response(response, message)
end
def send_attachment_message(phone_number, message)
@@ -90,7 +90,7 @@ class Whatsapp::Providers::Whatsapp360DialogService < Whatsapp::Providers::BaseS
}.to_json
)
process_response(response)
process_response(response, message)
end
def error_message(response)
@@ -123,6 +123,6 @@ class Whatsapp::Providers::Whatsapp360DialogService < Whatsapp::Providers::BaseS
}.to_json
)
process_response(response)
process_response(response, message)
end
end

View File

@@ -11,7 +11,7 @@ class Whatsapp::Providers::WhatsappCloudService < Whatsapp::Providers::BaseServi
end
end
def send_template(phone_number, template_info)
def send_template(phone_number, template_info, message)
template_body = template_body_parameters(template_info)
request_body = {
@@ -28,7 +28,7 @@ class Whatsapp::Providers::WhatsappCloudService < Whatsapp::Providers::BaseServi
body: request_body.to_json
)
process_response(response)
process_response(response, message)
end
def sync_templates
@@ -92,7 +92,7 @@ class Whatsapp::Providers::WhatsappCloudService < Whatsapp::Providers::BaseServi
}.to_json
)
process_response(response)
process_response(response, message)
end
def send_attachment_message(phone_number, message)
@@ -115,7 +115,7 @@ class Whatsapp::Providers::WhatsappCloudService < Whatsapp::Providers::BaseServi
}.to_json
)
process_response(response)
process_response(response, message)
end
def error_message(response)
@@ -179,6 +179,6 @@ class Whatsapp::Providers::WhatsappCloudService < Whatsapp::Providers::BaseServi
}.to_json
)
process_response(response)
process_response(response, message)
end
end

View File

@@ -33,7 +33,7 @@ class Whatsapp::SendOnWhatsappService < Base::SendOnChannelService
namespace: namespace,
lang_code: lang_code,
parameters: processed_parameters
})
}, message)
message.update!(source_id: message_id) if message_id.present?
end