Интеграция amoCRM с сайтом API
AmoCRM одна из самых популярных CRM. В этой статье мы создадим сделку в «Неразобранном», контакт и компанию
Создаем файлы интеграции
Создаем папку amo, например, в корне сайта. Файлы внутри: amo.php access.php config.php get.php cookie.txt tokens.txt Названия могут быть произвольными
Получение ключей
Открываем AmoCRM, заходим в Установки > Интеграции, жмем «+ Создать интеграцию» и создаем внешнюю интеграцию Указываем ссылку на наш amo.php файл, ставим галочку предоставления доступа и вводим произвольное название и описание:
Получаем 3 ключа. Открываем config.php и вписываем их туда:
$subdomain = ''; // поддомен AmoCRM $client_secret = ''; // Секретный ключ $client_id = ''; // ID интеграции $code = ''; // Код авторизации $token_file = 'tokens.txt'; $redirect_uri = 'https://site.com/amo/amo.php';
Поддомен AmoCRM берем из url нашей CRM В $redirect_uri не забудьте изменить свой домен сайта Затем идем в файл auth.php и вставим следующее:
require_once 'config.php'; $link = "https://$subdomain.amocrm.ru/oauth2/access_token"; $data = [ 'client_id' => $client_id, 'client_secret' => $client_secret, 'grant_type' => 'authorization_code', 'code' => $code, 'redirect_uri' => $redirect_uri, ];
$curl = curl_init(); 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_VERIFYPEER, 1);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, 2); $out = curl_exec($curl); $code = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); $code = (int)$code; $errors = [ 301 => 'Перемещено навсегда.', 400 => 'Неправильная структура массива передаваемых данных или недопустимые идентификаторы пользовательских полей.', 401 => 'Не авторизован. На сервере нет информации об учетной записи. Необходимо сделать запрос на другой сервер по переданному IP.', 403 => 'Аккаунт заблокирован, за неоднократное превышение количества запросов в секунду.', 404 => 'Не найден.', 500 => 'Внутренняя ошибка сервера.', 502 => 'Плохой шлюз.', 503 => 'Сервис недоступен.' ]; if ($code < 200 || $code > 204) die( 'Ошибка $code. " . (isset($errors[$code]) ? $errors[$code] : 'Неопределенная ошибка') ); $response = json_decode($out, true)
$arrParamsAmo = [ "access_token" => $response['access_token'], "refresh_token" => $response['refresh_token'], "token_type" => $response['token_type'], "expires_in" => $response['expires_in'], "endTokenTime" => $response['expires_in'] + time(), ]
$arrParamsAmo = json_encode($arrParamsAmo); $f = fopen($token_file, 'w'); fwrite($f, $arrParamsAmo); fclose($f); print_r($arrParamsAmo)
; Здесь мы отправляем запрос в AmoCRM для получения токенов. Токены сохраняются в файл (45-57 строки), вы можете хранить их в БД. Запустите файл https://site.com/amo/auth.php Как результат в файле tokens.txt должны появиться данные
Обновление токена
Access token является временным и требует обновления. Открываем файл access.php и добавляем следующее:
require_once 'config.php'; $dataToken = file_get_contents($token_file); $dataToken = json_decode($dataToken, true);
if ($dataToken["endTokenTime"] < time()) { $link = "https://$subdomain.amocrm.ru/oauth2/access_token"; $data = [ 'client_id' => $client_id, 'client_secret' => $client_secret, 'grant_type' => 'refresh_token', 'refresh_token' => $dataToken["refresh_token"], 'redirect_uri' => $redirect_uri, ]
$curl = curl_init(); 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_VERIFYPEER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); $out = curl_exec($curl); $code = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); $code = (int)$code; $errors = [ 301 => 'Перемещено навсегда.', 400 => 'Неправильная структура массива передаваемых данных или недопустимые идентификаторы пользовательских полей.', 401 => 'Не авторизован. На сервере нет информации об учетной записи. Необходимо сделать запрос на другой сервер по переданному IP.', 403 => 'Аккаунт заблокирован, за неоднократное превышение количества запросов в секунду.', 404 => 'Не найден.', 500 => 'Внутренняя ошибка сервера.', 502 => 'Плохой шлюз.', 503 => 'Сервис недоступен.' ]; if ($code < 200 || $code > 204) die( 'Ошибка $code. " . (isset($errors[$code]) ? $errors[$code] : 'Неопределенная ошибка') ); $response = json_decode($out, true)
$arrParamsAmo = [ "access_token" => $response['access_token'], "refresh_token" => $response['refresh_token'], "token_type" => $response['token_type'], "expires_in" => $response['expires_in'], "endTokenTime" => $response['expires_in'] + time(), ]
$arrParamsAmo = json_encode($arrParamsAmo); $f = fopen($token_file, 'w'); fwrite($f, $arrParamsAmo); fclose($f); $access_token = $response['access_token']
} else { $access_token = $dataToken["access_token"]; }
Если вы сохраняли данные предыдущего запроса БД, пропишите получение их из БД (59-61 строки).
Переходим к интеграции
Не буду приводить пример html формы, нужно обработать форму и передать в amo.php необходимые данные. Открываем amo.php и добавляем:
require_once 'access.php'; $name = 'Имя клиента'; $phone = '+380123456789'; $email = 'email@gmail.com'; $target = 'Цель'; $company = 'Название компании'; $custom_field_id = 454021; $custom_field_value = 'тест'; $ip = '1.2.3.4'; $domain = 'site.com'; $price = 0; $pipeline_id = 5059931; $user_amo = 0; $utm_source = ''; $utm_content = ''; $utm_medium = ''; $utm_campaign = ''; $utm_term = ''; $utm_referrer = '';
$data = [ [ "name" => $phone, "price" => $price, "responsible_user_id" => $user_amo, "pipeline_id" => $pipeline_id, "_embedded" => [ "metadata" => [ "category" => "forms", "form_id" => 1, "form_name" => "Форма на сайте", "form_page" => $target, "form_sent_at" => strtotime(date("Y-m-d H:i:s")), "ip" => $ip, "referer" => $domain ], "contacts" => [ [ [ "first_name" => $name, "custom_fields_values" => [ [ [ "field_code" => "EMAIL", "values" => [ [ "enum_code" => "WORK", "value" => $email ] ] ], [ "field_code" => "PHONE"
"values" => [ [ [ "enum_code" => "WORK", "value" => $phone ] ] ], [ "field_id" => $custom_field_id, "values" => [ [ "value" => $custom_field_value ] ] ], "companies" => [ [ "name" => $company ] ] ], [ [ [ "name" => $company ] ]
"custom_fields_values" => [ [ [ "field_code" => 'UTM_SOURCE', "values" => [ [ "value" => $utm_source ] ] ], [ "field_code" => 'UTM_CONTENT', "values" => [ [ "value" => $utm_content ] ] ], [ "field_code" => 'UTM_MEDIUM', "values" => [ [ "value" => $utm_medium ] ] ]
[ "field_code" => 'UTM_CAMPAIGN', "values" => [ [ "value" => $utm_campaign ] ] ], [ "field_code" => 'UTM_TERM', "values" => [ [ "value" => $utm_term ] ], [ "field_code" => 'UTM_REFERRER', "values" => [ [ "value" => $utm_referrer ] ], ] ], ]
$method = "/api/v4/leads/complex"; $headers = [ 'Content-Type: application/json', 'Authorization: Bearer ' . $access_token, ]; $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_USERAGENT, 'amoCRM-API-client/1.0'); curl_setopt($curl, CURLOPT_URL, "https://$subdomain.amocrm.ru"$method); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_COOKIEFILE, 'amo/cookie.txt'); curl_setopt($curl, CURLOPT_COOKIEJAR, 'amo/cookie.txt'); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); $out = curl_exec($curl); $code = curl_getinfo($curl, CURLINFO_HTTP_CODE); $code = (int) $code; $errors = [ 301 => 'Перемещено навсегда.', 400 => 'Неправильная структура массива передаваемых данных или недопустимые идентификаторы пользовательских полей.', 401 => 'Не авторизован. На сервере нет информации об учетной записи. Необходимо сделать запрос на другой сервер по переданному IP.', 403 => 'Аккаунт заблокирован, за неоднократное превышение количества запросов в секунду.', 404 => 'Не найден.', 500 => 'Внутренняя ошибка сервера.', 502 => 'Плохой шлюз.', 503 => 'Сервис недоступен.' ]; if ($code < 200 || $code > 204) die( 'Ошибка $code. " . (isset($errors[$code]) ? $errors[$code] : 'Неопределенная ошибка') ); $Response = json_decode($out, true); $Response = $Response['_embedded']['items']; $output = 'ID добавленных элементов списков:' . PHP_EOL; foreach ($Response as $v) if (is_array($v)) $output .= $v['id'] . PHP_EOL; return $output;
В самом начале мы имеем список переменных, куда необходимо передать данные из формы, например: $name = $_POST[‘name’]; В $pipeline_id необходимо записать id воронки, его можно получить из url crm: Открываем раздел «Сделки», берем id открывшейся воронки (число в конце url), либо переключаем другую. К $user_amo вернемся чуть позже. Заполняем остальные переменные. Массив $data заполните информацией на свое усмотрение, согласно документации
Получение id полей
Получение идентификаторов полей, пользователей и прочего реализовано через GET запросы. Подробнее можно ознакомиться в документации, а для наших целей я подготовил отдельный файл, нужны эти данные. Открываем файл get.php и добавляем в него:
require_once 'config.php'; function printLink($method, $title, $subdomain) { echo ' '; echo "$title"; echo ' '; } printLink('api/v4/leads/custom_fields', 'Список utm меток', $subdomain);
printLink('api/v4/users', 'Список пользователей', $subdomain); printLink('api/v4/contacts/custom_fields', 'Список полей контакта', $subdomain);
Запустите файл: https://site.com/amo/get.php Вы увидите перечень ссылок, перейдя по которым получаете список id и других параметров полей для utm меток, пользователей, контактов. По аналогии можно просмотреть остальное. Вернемся к переменной $user_amo. Сюда нужно вписать ID пользователя, ответственного за сделку. На этом все, лиды будут приходить в неразобранное, создавать контакт, подтягиваться в него имя, телефон, а также кастомные поля, utm метки, которые были указаны в $data и название компании. Если вам нужна помощь с интеграцией CRM систем, напишите нам 😉 Если вам нужна помощь с интеграцией CRM систем, напишите нам 😉
