dotzero / amocrm-php

:sparkles: Удобный и быстрый клиент для работы с API amoCRM
https://dotzero.github.io/amocrm-php/
MIT License
220 stars 110 forks source link

Поддержка работы с чатами #71

Open edvardpotter opened 6 years ago

edvardpotter commented 6 years ago

Планируете ли добавить функционал для работы с amo чатами?

edvardpotter commented 6 years ago

Так же предлагаю добавить возможность получать amojo_id опционально, сейчас пришлось внести изменения в файл /src/Request/Request.php:

protected function prepareEndpoint($url)
    {
        if ($this->v1 === false) {
            $query = http_build_query(array_merge($this->parameters->getGet(), [
                'USER_LOGIN' => $this->parameters->getAuth('login'),
                'USER_HASH' => $this->parameters->getAuth('apikey'),
                // Изменение
                'amojo' => 'Y',
                // end
            ]), null, '&');
        } else {
            $query = http_build_query(array_merge($this->parameters->getGet(), [
                'login' => $this->parameters->getAuth('login'),
                'api_key' => $this->parameters->getAuth('apikey'),
            ]), null, '&');
        }

        return sprintf('https://%s%s?%s', $this->parameters->getAuth('domain'), $url, $query);
    }
dotzero commented 6 years ago

Планирую вместе с переходом на новое API. На базе старого это сделать не представляется возможным.

dotzero commented 6 years ago

Можете рассказать подробно, что делает amojo ?

tkachev-o commented 6 years ago

amojo это единый поддомен для работы с API чатов – https://amojo.amocrm.ru/v2/....

edvardpotter commented 6 years ago

@dotzero В новой версии не собираетесь использовать Guzzle? amojo - дополнительный параметр(о котором можно почитать тут) который позволяет получить данные для работы с api чатов(account_id и т.п.). В официальной доке. написано:

UUID, Уникальный идентификатор аккаунта для работы с сервисом онлайн-чатов

У меня получилось сделать реализацию работы с чатами используя вашу библиотеку, и guzzle:

//...
$params['account_id'] = $amo->account->apiCurrent()['amojo_id'];// Получаю account_id для работы с чатами
//...

App::$router->any('/hookw.php', function () use ($params, $client, $amo) {// Хук для получения сообщений из WhatsApp
    require_once __DIR__ . '/../whatsapi.php';
        $data = json_decode(file_get_contents('php://input'), true);
        $message = $data['messages'][0];
        $tmp = explode("@", $message['author']);
        $phone = $tmp[0];
        $body = json_encode([
            'account_id' => $params['account_id']
        ]);
        $signature = hash_hmac('sha1', $body, $params['secret']);
        $headers = [
            "cache-control" => "no-cache",
            "content-type" => "application/json",
            "x-signature" => $signature
        ];
        $options = [
            'body' => $body,
            'headers' => $headers,
        ];
        // Подключаю аккаунт к каналу(чату)
        $response = $client->post('https://amojo.amocrm.ru/v2/origin/custom/' . $params['channel_id'] . '/connect', $options);
        // Scope id для публикации сообщений в аккаунт
        $params['scope_id'] = json_decode($response->getBody(), true)['scope_id'];
        $user_id = QB::table('users')->where('phone', '=', $phone)->first()->id;
        $conversation_id = QB::table('conversations')->where('user_id', '=', $user_id)->first()->id;
        if ($conversation_id) {
            $body = json_encode([
                'event_type' => 'new_message',
                'payload' => [
                    'timestamp' => time(),
                    'msgid' => uniqid(),
                    'conversation_id' => $conversation_id,
                    'sender' => [
                        'id' => $user_id,
                        'avatar' => 'https://www.amocrm.ru/version2/images/logo_bill.png',
                        'name' => $message['senderName'],
                        'profile' => [
                            'phone' => $phone,
                        ],
                        'profile_link' => 'http://example.com',
                    ],
                    'message' => [
                        'type' => 'text',
                        'text' => $message['body']
                    ]
                ]
            ]);
            $headers = [
                "cache-control" => "no-cache",
                "content-type" => "application/json",
                "x-signature" => hash_hmac('sha1', $body, $params['secret'])
            ];
            $options = [
                'headers' => $headers,
                'body' => $body
            ];
            $response = $client->post("https://amojo.amocrm.ru/v2/origin/custom/{$params['scope_id']}", $options);
        }
});
shift-reality commented 6 years ago

а как вы получаете сообщения из WA?

dotzero commented 6 years ago

В новой версии не собираетесь использовать Guzzle?

Собираюсь

edvardpotter commented 6 years ago

@shift-reality Написан свой хук для получения сообщений от туда

shift-reality commented 6 years ago

@edvardpotter а подробнее можете, плиз? также необходима такая возможность просто, реализовали через веб, но глючит....