Авторизация и получение токенов доступа
Задача — интеграция АМО с e-commerce платформой для магазина. Заказы должны поступать в АМО и при изменении статуса заказа, так же должен меняться статус заказа на e-commerce платформе.
Взаимодействуют обе системы через сторонний сервер который обеспечивает также интеграцию с платежной системой и API Greeninvoice для отправки чеков.
Для тех кто не в курсе что такое AMO CRM — Это довольно таки мощный инструмент для бизнеса, основное его назначение это контакт с покупателем. Он позволяет автоматизировать многие рутинные задачи и облегчает бизнес процессы.
В данном случае основная задача, получить заказ из интернет магазина и работать с ним в уже знакомой заказчику среде. При получении заказа из интернет магазина сервер интеграции обрабатывает данные и создает в АМО сделку, создает и прикрепляет к ней учетную запись клиента с его данными (телефон, адрес и прочее), также при необходимости обновляет список товаров в АМО, заполняет данные о заказе (заказанные товары, дата и способ доставки, комментарий покупателя, статус оплаты и прочее разное).
В общем-то всё то же самое что есть в админ панели самой e-commerce платформы. НО в АМО собираются заказы из самых разных источников, что позволяет работать с заказами вне зависимости от источника.
AMO CRM имеет свою PHP библиотеку для работы со своим API. Ставится через Composer. После установки мы имеем в папке vendor/amocrm/examples примеры для работы с библиотекой.
Первое что я сделал, это интерфейс авторизации для получения токенов. Теоретически этого можно было бы не делать, амо использует 2 вида токенов, первый имеет короткий срок жизни и служит для запросов к апи, второй живет 3 мес и нужен для получения первого, и вряд-ли бизнес может позволить себе 3 мес стоять. Но бывает всякое, и у клиента должна быть возможность запустить интеграцию вручную.
На амо есть инструкция пример по шагам. Сначала по этой инструкции создал саму интеграцию в кабинете на амо. Потом сделал контроллер который показывал, на мой взгляд самый простой способ авторизации приложения, кнопку амо. По сути я просто скопировал скрипт и подставил туда свои параметры
Ниже пример кода скрипта.
<script
class="amocrm_oauth"
charset="utf-8"
data-client-id="<?php echo $amoIntegrationId; ?>"
data-title=""
data-compact="false"
data-class-name="amoButton"
data-color="default"
data-state="<?php echo $autoriseHesh; ?>"
data-error-callback="functionName"
data-mode="popup"
src="https://www.amocrm.ru/auth/button.min.js"
></script>
Далее я сделал функцию в контроллере для записи получения ответа от амо. Ниже обе функции первая передает во вьюху параметры для кнопки, вторая записывает их в файл (это не обязательно, я сделал для анализа возможных ошибок) и получает токены (код авторизации живет только 20 минут).
public function indexAction()
{
parent::indexAction(); // TODO: Change the autogenerated stub
return $this->view->render('Amocrm/index.phtml', [
'amoIntegrationId' => (string) AMO_INTEGRATION_ID,
'autoriseHesh' => AMO_AUTORISE_HESH,
]);
}
// первичная запись ответа при авторизации
// получаем кад авторизации и по нему получаем токены
public function callbackAction()
{
if(!empty($_GET['code']) && $_GET['state'] == AMO_AUTORISE_HESH) {
$getJson = json_encode($_GET);
file_put_contents(AMO_AUTORISE_FILE, $getJson);
// получение токенов доступа
реализовано через объект модели
Amo::getTokens($_GET, 'authorization_code');
}
}
Порывшись в примерах я сделал модель Amo и функцию для получения токенов.
class Amo { // константы прописаны в конфиг файле private static $secretKey = AMO_SECRET_KEY; private static $integrationId = AMO_INTEGRATION_ID; private static $requestUrl = AMO_APP_BACKURL; public static function getTokens(array $AmoDate, $mode) { $subdomain = $AmoDate['referer']; //Поддомен нужного аккаунта $link = 'https://' . $subdomain . '/oauth2/access_token'; //Формируем URL для запроса /** Соберем данные для запроса */ $data = [ 'client_id' => self::$integrationId, 'client_secret' => self::$secretKey, 'grant_type' => $mode, 'redirect_uri' => AMO_APP_BACKURL, ]; // модификация запроса для получения или обновления токенов if ($mode == 'refresh_token') { $data['refresh_token'] = $AmoDate['refresh_token']; } else { $data['code'] = $AmoDate['code']; } /** * Нам необходимо инициировать запрос к серверу. * Воспользуемся библиотекой cURL (поставляется в составе PHP). * Вы также можете использовать и кроссплатформенную программу cURL, если вы не программируете на PHP. */ $curl = curl_init(); //Сохраняем дескриптор сеанса cURL /** Устанавливаем необходимые опции для сеанса cURL */ curl_setopt($curl,CURLOPT_RETURNTRANSFER, true); curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-oAuth-client/1.0'); curl_setopt($curl,CURLOPT_URL, $link); curl_setopt($curl,CURLOPT_HTTPHEADER,['Content-Type:application/json']); curl_setopt($curl,CURLOPT_HEADER, false); curl_setopt($curl,CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($curl,CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, 1); curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, 2); $out = curl_exec($curl); //Инициируем запрос к API и сохраняем ответ в переменную $code = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); /** Теперь мы можем обработать ответ, полученный от сервера. Это пример. Вы можете обработать данные своим способом. */ $code = (int)$code; $errors = [ 400 => 'Bad request', 401 => 'Unauthorized', 403 => 'Forbidden', 404 => 'Not found', 500 => 'Internal server error', 502 => 'Bad gateway', 503 => 'Service unavailable', ]; /** Если код ответа не успешный - возвращаем сообщение об ошибке */ if ($code < 200 || $code > 204) { if (!empty($errors[$code])) { echo "error $code " . $errors[$code] . '<br>'; } $res = json_decode($out); foreach ($res as $k => $val) { // тут скорее всего надо бы записать ошибку в лог echo "<p>$k - $val</p>"; } } else { /** * Данные получаем в формате JSON * Записывем в файл ответ с токенами */ file_put_contents(AMO_TOKEN_MODEL_FILE, $out); return $out; } } }
Вообще в библиотеке амо для получения токенов есть примеры. Но так исторически сложилось что я сделал свою реализацию. И пользуясь принципом, работает — не трогай, пока там ничего не меняю )))
В следующей статье рассмотрен пример создания сделки в амоCRM Опыт интеграции с AMO CRM part 2