@@ -211,6 +239,55 @@ const getStatusTextColor = status => STATUS_COLORS[status] || 'text-n-slate-12';
}}
+
+
+
+
+
+ {{ t('INBOX_MGMT.ACCOUNT_HEALTH.WEBHOOK.TITLE') }}
+
+
+
+
+
+
+ {{ t('INBOX_MGMT.ACCOUNT_HEALTH.WEBHOOK.CONFIGURED_SUCCESS') }}
+
+
+
+ {{
+ webhookUrlMismatch
+ ? t('INBOX_MGMT.ACCOUNT_HEALTH.WEBHOOK.URL_MISMATCH')
+ : t('INBOX_MGMT.ACCOUNT_HEALTH.WEBHOOK.ACTION_REQUIRED')
+ }}
+
+
+ {{ t('INBOX_MGMT.ACCOUNT_HEALTH.WEBHOOK.REGISTER_BUTTON') }}
+
+
+
diff --git a/app/services/whatsapp/health_service.rb b/app/services/whatsapp/health_service.rb
index 94789ef79..428fb4e6b 100644
--- a/app/services/whatsapp/health_service.rb
+++ b/app/services/whatsapp/health_service.rb
@@ -39,11 +39,11 @@ class Whatsapp::HealthService
def health_fields
%w[
+ id
quality_rating
messaging_limit_tier
code_verification_status
account_mode
- id
display_phone_number
name_status
verified_name
@@ -68,6 +68,7 @@ class Whatsapp::HealthService
def format_health_response(response)
{
+ id: response['id'],
display_phone_number: response['display_phone_number'],
verified_name: response['verified_name'],
name_status: response['name_status'],
@@ -75,10 +76,20 @@ class Whatsapp::HealthService
messaging_limit_tier: response['messaging_limit_tier'],
account_mode: response['account_mode'],
code_verification_status: response['code_verification_status'],
+ webhook_configuration: response['webhook_configuration'],
+ expected_webhook_url: build_expected_webhook_url,
throughput: response['throughput'],
last_onboarded_time: response['last_onboarded_time'],
platform_type: response['platform_type'],
+ certificate: response['certificate'],
business_id: @channel.provider_config['business_account_id']
}
end
+
+ def build_expected_webhook_url
+ frontend_url = ENV.fetch('FRONTEND_URL', nil)
+ return nil if frontend_url.blank?
+
+ "#{frontend_url}/webhooks/whatsapp/#{@channel.phone_number}"
+ end
end
diff --git a/app/services/whatsapp/webhook_setup_service.rb b/app/services/whatsapp/webhook_setup_service.rb
index 63fed1e93..97a53eb9a 100644
--- a/app/services/whatsapp/webhook_setup_service.rb
+++ b/app/services/whatsapp/webhook_setup_service.rb
@@ -1,9 +1,9 @@
class Whatsapp::WebhookSetupService
- def initialize(channel, waba_id, access_token)
+ def initialize(channel, waba_id = nil, access_token = nil)
@channel = channel
- @waba_id = waba_id
- @access_token = access_token
- @api_client = Whatsapp::FacebookApiClient.new(access_token)
+ @waba_id = waba_id || channel.provider_config['business_account_id']
+ @access_token = access_token || channel.provider_config['api_key']
+ @api_client = Whatsapp::FacebookApiClient.new(@access_token)
end
def perform
@@ -17,6 +17,11 @@ class Whatsapp::WebhookSetupService
setup_webhook
end
+ def register_callback
+ validate_parameters!
+ setup_webhook
+ end
+
private
def validate_parameters!
@@ -33,8 +38,6 @@ class Whatsapp::WebhookSetupService
store_pin(pin)
rescue StandardError => e
Rails.logger.warn("[WHATSAPP] Phone registration failed but continuing: #{e.message}")
- # Continue with webhook setup even if registration fails
- # This is just a warning, not a blocking error
end
def fetch_or_create_pin
diff --git a/config/routes.rb b/config/routes.rb
index 0992d21a2..5fe70bdca 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -218,6 +218,7 @@ Rails.application.routes.draw do
delete :avatar, on: :member
post :sync_templates, on: :member
get :health, on: :member
+ post :register_webhook, on: :member
if ChatwootApp.enterprise?
resource :conference, only: %i[create destroy], controller: 'conference' do
get :token, on: :member