fcritic/amojo-api-client

PHP client for the amoCRM chat API service

v1.3.0 2025-04-22 16:28 UTC

This package is auto-updated.

Last update: 2025-06-22 16:50:12 UTC


README

amoJo PHP Client

amoJo PHP Client

πŸš€ PHP ΠΊΠ»ΠΈΠ΅Π½Ρ‚ для ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с сСрвисом API Ρ‡Π°Ρ‚ΠΎΠ² amoCRM

ВСрсия Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ВСрсия PHP License

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

✨ ВозмоТности

  • ПолноС ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ API Ρ‡Π°Ρ‚ΠΎΠ² amoCRM
  • Бтрогая типизация Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· DTO
  • Гибкая систСма Middleware
  • ΠŸΡ€Π΅Π΄ΡΠΊΠ°Π·ΡƒΠ΅ΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² WebHooks
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° сСгмСнтов .ru ΠΈ .com
  • ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок
  • Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°
    • Бтрогая типизация (strict_types)
    • PSR-12 совмСстимый ΠΊΠΎΠ΄
    • Полная докумСнтация PHPDoc
    • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Guzzle ΠΈ PSR-18

πŸ“¦ Установка

Установка Ρ‡Π΅Ρ€Π΅Π· Composer:

composer require fcritic/amojo-api-client

ВрСбования:

  • PHP 7.4+

πŸš€ Быстрый старт

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ

1. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Π°
use AmoJo\Client\AmoJoClient;
use AmoJo\Models\Channel;

$channel = new Channel(uid: 'channel-uid', secretKey: 'secret-key');
$client = new AmoJoClient(
    channel: $channel,
    additionalMiddleware: [],
    segment: 'ru'
);

$response = $client->connect(
    accountUid: 'f36b8c48-ed97-4866-8aba-d55d429da86d',
    title: 'Мой канал',
    hookVersion: 'v2'
);

echo 'Scope ID: ' . $response->getScopeId();
2. ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Π°
$response = $client->disconnect(accountUid: 'f36b8c48-ed97-4866-8aba-d55d429da86d');
if ($response->getDisconnect()) {
    echo 'Канал ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½';
}

Π Π°Π±ΠΎΡ‚Π° с Ρ‡Π°Ρ‚Π°ΠΌΠΈ

1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ‡Π°Ρ‚Π°
use AmoJo\Models\Conversation;
use AmoJo\Models\Users\Sender;

$conversation = (new Conversation())->setId('chat-123');
$contact = (new Sender())
    ->setId('user-123')
    ->setName('Иван Иванов')
    ->setAvatar('https://picsum.photos/300/300')
    ->setProfile((new UserProfile())->setPhone('+1464874556719'));

$response = $client->createChat(
    accountUid: 'f36b8c48-ed97-4866-8aba-d55d429da86d',
    conversation: $conversation,
    contact: $contact
);

echo 'ID Ρ‡Π°Ρ‚Π° Π² API Ρ‡Π°Ρ‚ΠΎΠ²: ' . $response->getConversationRefId();

Π Π°Π±ΠΎΡ‚Π° с сообщСниями

1. ВходящиС тСкстовоС сообщСниС
use AmoJo\Models\Payload;
use AmoJo\Models\Messages\TextMessage;

$message = (new TextMessage())->setUid('MSG_100')->setText('Hello');

$response = $client->sendMessage(
    accountUid: 'f36b8c48-ed97-4866-8aba-d55d429da86d',
    payload: (new Payload())
        ->setConversation($conversation)
        ->setSender($contact)
        ->setMessage($message),
    externalId: 'Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ'
);

echo 'ID Ρ‡Π°Ρ‚Π° Π² API Ρ‡Π°Ρ‚ΠΎΠ²: ' . $response->getReceiverRefId();
2. Π˜ΡΡ…ΠΎΠ΄ΡΡ‰ΠΈΠ΅ тСкстовоС сообщСниС
use AmoJo\Models\Users\Receiver;

// amojo_id ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ amoCRM
$sender = (new Sender())->setRefId('113de373-a2d3-4eb7-a67c-04660332df07');
$message = (new TextMessage())->setUid('MSG_101')->setText('Hello');

$response = $client->sendMessage(
    accountUid: 'f36b8c48-ed97-4866-8aba-d55d429da86d',
    payload: (new Payload())
        ->setConversation($conversation)
        ->setSender($sender)
        ->setReceiver($contact)
        ->setMessage($message),
    externalId: 'Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ'
);
3. Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сообщСния
$message = (new TextMessage())->setUid('MSG_101')->setText('Hello, Richard');

$response = $client->editMessage(
    accountUid: 'f36b8c48-ed97-4866-8aba-d55d429da86d',
    (new Payload())
        ->setConversation($conversation)
        ->setMessage($message)
);
4. ΠžΡ‚Π²Π΅Ρ‚ Π½Π° сообщСния
use AmoJo\Models\Messages\ReplyTo;

$message = (new TextMessage())->setUid('MSG_102')->setText('I want to place an order');

$response = $client->sendMessage(
    accountUid: 'f36b8c48-ed97-4866-8aba-d55d429da86d',
    payload: (new Payload())
        ->setConversation($conversation)
        ->setSender($contact)
        ->setMessage($message)
        ->setReplyTo((new ReplyTo())->setReplyUid('MSG_101'))
);

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

1. Π˜ΡΡ‚ΠΎΡ€ΠΈΡ Ρ‡Π°Ρ‚Π°
$response = $client->getHistoryChat(
    accountUid: 'f36b8c48-ed97-4866-8aba-d55d429da86d',
    conversationRefId: $conversation->getRefId()
);

foreach ($response->getMessages() as $message) {
    echo 'ВСкст сообщСния: ' . $message->getMessage()->getText();
}
2. ОбновлСниС статуса доставки
use AmoJo\Enum\DeliveryStatus;
use AmoJo\Enum\ErrorCode;
use AmoJo\Models\Deliver;

$response = $client->deliverStatus(
    accountUid: 'f36b8c48-ed97-4866-8aba-d55d429da86d',
    messageUid: $message->getRefUid(),
    deliver: (new Deliver(DeliveryStatus::ERROR))
        ->setErrorCode(ErrorCode::WITH_DESCRIPTION)
        ->setMessageError('User deleted')
);

if ($response->getDelivery()) {
    echo 'Бтатус установлСн';
}
3. ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΈΠ»ΠΈ снятиС Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ
$response = $client->react(
    accountUid: 'f36b8c48-ed97-4866-8aba-d55d429da86d',
    conversation: $conversation,
    sender: $contact,
    message: $message,
    emoji: 'πŸ‘'
);

if ($response->getReact()) {
    echo 'РСакция установлСна';
}
4. Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π½ΠΈΠ΅
$response = $client->typing(
    accountUid: 'f36b8c48-ed97-4866-8aba-d55d429da86d',
    conversation: $conversation,
    sender: $contact,
);

if ($response->getTyping()) {
    echo 'Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ доставлСна';
}

πŸ”Œ ΠšΠ°ΡΡ‚ΠΎΠΌΠ½Ρ‹Π΅ middleware

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ middleware для логирования запросов:
use AmoJo\Middleware\MiddlewareInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Log\LoggerInterface;
use Closure;

final class LoggingMiddleware implements MiddlewareInterface
{
    public function __invoke(callable $handler): Closure
    {
        return function (RequestInterface $request, array $options) use ($handler) {
            error_log('Request: ' . $request->getMethod() . ' ' . $request->getUri());
            return $handler($request, $options);
        };
    }
}
ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ middleware:
$client = new AmoJoClient(
    channel: $channel,
    additionalMiddleware: [LoggingMiddleware::class]
);

πŸ“’ ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок

ΠšΠ»ΠΈΠ΅Π½Ρ‚ выбрасываСт ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΡ€ΠΈ ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…:

  • AmoJoException - Π‘Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅
  • EmptyMessageErrorException - НС ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ сообщСниС ΠΎΠ± ошибки ΠΏΡ€ΠΈ 905 ΠΊΠΎΠ΄Π΅ ошибкС deliverStatus()
  • InvalidRequestWebHookException - Π½Π΅ Π²Π°Π»ΠΈΠ΄Π½ΠΎΠΌ Π²Π΅Π±Ρ…ΡƒΠΊΠ΅ ΠΎΠ± исходящим сообщСнии
  • InvalidResponseException - НСкоррСктный ΠΎΡ‚Π²Π΅Ρ‚ сСрвСра
  • NotFountException - Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ URL запроса
  • RequiredParametersMissingException - ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹
  • SenderException - НС Π±Ρ‹Π» ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ID Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΡ€ΠΈ исходящим сообщСниС
  • UnsupportedMessageTypeException - ΠŸΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ Π½Π΅ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏΠ° сообщСния

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ:

try {
    // Π’Ρ‹Π·ΠΎΠ² API ΠΌΠ΅Ρ‚ΠΎΠ΄Π°
} catch (RequiredParametersMissingException $e) {
    echo "Ошибка: " . $e->getMessage();
} catch (AmoJoException $e) {
    var_dump([
        'type'    => $e->getType(),
        'message' => $e->getMessage(),
        'code'    => $e->getCode(),
        'context' => $e->getContext(),
        'file'    => $e->getFile(),
    ]);
}

πŸ” Π Π°Π±ΠΎΡ‚Π° с WebHooks

1. Валидация WebHooks
use AmoJo\Webhook\ValidatorWebHooks;

if (! ValidatorWebHooks::isValid(request: $request, secretKey: '465c28d756f...')) {
    // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π΅ Π²Π°Π»ΠΈΠ΄Π½ΠΎΠ³ΠΎ Π²Π΅Π±Ρ…ΡƒΠΊΠ°
}
2. Бтрогая типизация Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΈΠ· WebHooks amoCRM
use AmoJo\Webhook\ParserWebHooks;

$event = (new ParserWebHooks())->parse($requestBody);
        
var_dump($event->toArray());

πŸ“ ДокумСнтация

ΠžΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ докумСнтация API Ρ‡Π°Ρ‚ΠΎΠ² amoCRM:

πŸ“„ ЛицСнзия

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ распространяСтся ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ MIT - подробности Π² Ρ„Π°ΠΉΠ»Π΅ LICENSE