fcritic / amojo-api-client
PHP client for the amoCRM chat API service
v1.3.0
2025-04-22 16:28 UTC
Requires
- php: >=7.4
- ext-json: *
- guzzlehttp/guzzle: ^7.2
Requires (Dev)
This package is auto-updated.
Last update: 2025-06-22 16:50:12 UTC
README
amoJo PHP Client
π PHP ΠΊΠ»ΠΈΠ΅Π½Ρ Π΄Π»Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Ρ ΡΠ΅ΡΠ²ΠΈΡΠΎΠΌ API ΡΠ°ΡΠΎΠ² amoCRM
Π‘ΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅
- β¨ ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ
- π¦ Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
- π ΠΡΡΡΡΡΠΉ ΡΡΠ°ΡΡ
- π ΠΠ°ΡΡΠΎΠΌΠ½ΡΠ΅ middleware
- π’ ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ
- π Π Π°Π±ΠΎΡΠ° Ρ WebHooks
- π ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ
- π ΠΠΈΡΠ΅Π½Π·ΠΈΡ
β¨ ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ
- ΠΠΎΠ»Π½ΠΎΠ΅ ΠΏΠΎΠΊΡΡΡΠΈΠ΅ 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