mirror of
https://github.com/zammad/zammad
synced 2026-05-24 09:48:36 +00:00
50 lines
1.7 KiB
Ruby
50 lines
1.7 KiB
Ruby
# Copyright (C) 2012-2026 Zammad Foundation, https://zammad-foundation.org/
|
|
|
|
class ChannelsWhatsappController < ApplicationController
|
|
skip_before_action :verify_csrf_token, only: %i[verify_webhook perform_webhook]
|
|
|
|
def verify_webhook
|
|
configuration = Whatsapp::Webhook::Configuration.new(options: params)
|
|
challenge = configuration.verify!
|
|
|
|
render plain: challenge, status: :ok
|
|
rescue Whatsapp::Webhook::Configuration::VerificationError, Whatsapp::Webhook::NoChannelError => e
|
|
Rails.logger.error e.message
|
|
log_request
|
|
|
|
raise Exceptions::UnprocessableContent, e.message
|
|
end
|
|
|
|
def perform_webhook
|
|
signature = request.headers['X-Hub-Signature-256'].sub('sha256=', '')
|
|
uuid = params[:callback_url_uuid]
|
|
json = request.raw_post
|
|
|
|
begin
|
|
payload = Whatsapp::Webhook::Payload.new(json:, uuid:, signature:)
|
|
payload.process
|
|
rescue Whatsapp::Webhook::Payload::ValidationError => e
|
|
Rails.logger.error e.message
|
|
log_request
|
|
|
|
raise Exceptions::UnprocessableContent, e.message
|
|
rescue Whatsapp::Webhook::Payload::ProcessableError, Whatsapp::Webhook::NoChannelError => e
|
|
# Fail silently, any HTTP status code other than 200 will cause WhatsApp
|
|
# to retry the request
|
|
|
|
Rails.logger.error(e.respond_to?(:reason) && e.reason.present? ? "#{e.message}: #{e.reason}" : e.message)
|
|
log_request
|
|
end
|
|
|
|
render json: {}, status: :ok
|
|
end
|
|
|
|
private
|
|
|
|
def log_request
|
|
Rails.logger.error "WhatsApp Webhook: #{request.method} #{request.url}"
|
|
Rails.logger.error "WhatsApp Webhook: Headers: #{request.headers.inspect}"
|
|
Rails.logger.error "WhatsApp Webhook: Params: #{params.inspect}"
|
|
Rails.logger.error "WhatsApp Webhook: Payload: #{request.raw_post}"
|
|
end
|
|
end
|