Создание плагина для обработки вебхуков AmoCRM в Joomla

WT Amo CRM library - Документация
Категория: Библиотеки

Как обработать данные вебхука 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. Перед вызовом импортируются группы плагинов:

  1. system
  2. user
  3. amocrm

Рекомендуется создавать плагины в группе amocrm для того, чтобы не перегружать систему событий Joomla. В общем диспетчере событий Joomla системные плагины вызываются всегда и до плагинов групп. Таким образом системный плагин, обрабатывающий входящий вебхук будет вызываться при каждой генерации страницы, участвовать во всех процессах Joomla, что в данном конкретном случае совершенно избыточно.

Создание плагина обработки вебхуков AmoCRM в Joomla

Сам процесс создания плагина для Joomla многократно описан:

  1. Создание плагинов с учётом новой структуры Joomla 4 (на этом сайте)
  2. Создание плагинов с учётом новой структуры Joomla 4 (на Хабре)
  3. Официальная документация Joomla для разработчиков manual.joomla.org
  4. Книга греческого Joomla-разработчика Николаса Дионисопулоса "Joomla Extensions development"
  5. Как триггерить события для плагинов на манер 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');

 

Расширения Joomla WebTolk

96 Всего расширений
12 Категорий
492 Выпущено версий
563498 Всего скачиваний
Корзина
Корзина пуста