Создание плагина для обработки вебхуков AmoCRM в Joomla
Как обработать данные вебхука AmoCRM в Joomla? Создание плагина Joomla для обработки уведомлений и данных AmoCRM.
При верной настройке библиотеки WT AmoCRM вебхуки AmoCRM отправляются на единую точку входа в Joomla вида <ваш_сайт>/index.php?option=com_ajax&plugin=wt_amocrm&group=system&format=raw&action=webhook&action_type=external&token=<joomla_token>. После этого происходит очистка данных от GET-параметров URL точки входа: option, plugin, group, format, action, action_type, token.
Для обработки очищенных данных нужно создать собственный плагин, который будет слушать событие onAmocrmIncomingWebhook. Перед вызовом импортируются группы плагинов:
systemuseramocrm
Рекомендуется создавать плагины в группе amocrm для того, чтобы не перегружать систему событий Joomla. В общем диспетчере событий Joomla системные плагины вызываются всегда и до плагинов групп. Таким образом системный плагин, обрабатывающий входящий вебхук будет вызываться при каждой генерации страницы, участвовать во всех процессах Joomla, что в данном конкретном случае совершенно избыточно.
Создание плагина обработки вебхуков AmoCRM в Joomla
Сам процесс создания плагина для Joomla многократно описан:
- Создание плагинов с учётом новой структуры Joomla 4 (на этом сайте)
- Создание плагинов с учётом новой структуры Joomla 4 (на Хабре)
- Официальная документация Joomla для разработчиков manual.joomla.org
- Книга греческого Joomla-разработчика Николаса Дионисопулоса "Joomla Extensions development"
- Как триггерить события для плагинов на манер Joomla 5+?
Поэтому здесь будут описаны нюансы, касающиеся работы именно с библиотекой.
Namespace плагина
Например, имя класса вашего плагина customamocrmprocess. Тогда в XML-манифесте плагина указываем:
<namespace path="src">Joomla\Plugin\Amocrm\Customamocrmprocess</namespace>
В классе плагина, который будет находиться в plugins/amocrm/customamocrmprocess/src/Extension/Customamocrmprocess.php указываем
<?php
namespace Joomla\Plugin\Amocrm\Customamocrmprocess\Extension;
use Webtolk\Amocrm\Event\WebhookEvent;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Uri\Uri;
use Joomla\Event\SubscriberInterface;
\defined('_JEXEC') or die;
final class Customamocrmprocess extends CMSPlugin implements SubscriberInterface
{
/**
* Returns an array of events this subscriber will listen to.
*
* @return array
*
* @since 5.3.0
*/
public static function getSubscribedEvents(): array
{
return [
'onAmocrmIncomingWebhook' => 'onAmocrmIncomingWebhook',
];
}
/**
* Set as required the passwords fields when mail to user is set to No
*
* @param PrepareFormEvent $event The event instance.
*
* @return void
*
* @since 4.0.0
*/
public function onAmocrmIncomingWebhook(WebhookEvent $event): void
{
// выполняем работу с данными
}
}
Предполагается, что метод onAmocrmIncomingWebhook не возвращает никаких данных (void), так как в ответ на уведомление мы можем только выполнить свой запрос в API или просто обработать данные.
Аргумент $event события onAmocrmIncomingWebhook
Аргумент $event события onAmocrmIncomingWebhook - это объект класса \Webtolk\Amocrm\Event\WebhookEvent, находящегося в libraries/Webtolk/Amocrm/src/Event/WebhookEvent.php. Этот класс предоставляет возможность получить php массив с данными из вебхука. Если данных нет - будет возвращён пустой массив.
<?php
// Все `сырые` данные вебхука если есть
$data = $event->getData();
// Данные аккаунта если есть
$account = $event->getAccount();
// Данные контактов/компаний если есть
$contacts = $event->getContacts();
// Данные сделок, если есть
$leads = $event->getLeads();
// Данные задач, если есть
$tasks = $event->getTasks();
// Данные неразобранного, если есть
$unsorted = $event->getUnsorted();
// Данные сообщений, если есть
$messages = $event->getMessages();
Пример кода для вашего плагина.
<?php
use Webtolk\Amocrm\Event\WebhookEvent;
/**
* @param WebhookEvent $event
*
* @return void
*
* @throws AmocrmClientException
* @see WebhookEvent
* @since 1.3.0
*/
public function onAmocrmIncomingWebhook(WebhookEvent $event): void
{
/** @var array $contacts Array of contacts from webhook if exists */
$contacts = $event->getContacts();
if (empty($contacts)) {
return;
}
// делаем что-то с контактами
}
Конечно, никто не мешает вам самостоятельно получать данные из объекта Input Joomla.
<?php
$app = $this->getApplication();
$any_data = $app->getInput()->getString('any_data', 'default_value_if_empty');