Amocrm — хорошая русская система, но когда читаешь документацию к её api, создаётся впечатление, что писал это явно туркмен. Не в обиду туркменам.
Авторизация по api в amocrm имеет интересную особенность, получения токенов доступа, обновления, этот доступ получается один раз, по коду авторизации, потом для его получения нужен токен обновления, в общем у «туркменов» какие то свои понятия о безопасности, почему то они считают что токен доступа перехватить можно, а токен обновления уже нельзя. Короче простейший код:
Вот у нас есть такой класс для упрощения взаимодействия с апи, статический метод отправляет запросы
class API
{
public static function amocrm($request, $method = 'GET', $data = '', $headers = ['Content-Type:application/json'])
{
global $amocrm_domain;
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_USERAGENT, 'amoCRM-oAuth-client/1.0');
curl_setopt($curl, CURLOPT_URL, 'https://' . $amocrm_domain . $request);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
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);
$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',
];
try {
if ($code < 200 || $code > 204) {
throw new Exception(isset($errors[$code]) ? $errors[$code] : 'Undefined error', $code);
}
} catch (Exception $e) {
die('Ошибка: ' . $e->getMessage() . PHP_EOL . 'Код ошибки: ' . $e->getCode());
}
return json_decode($out);
}
}
Теперь обработчик собственно отправки форм, если ещё нет у нас токена обновления то получаем токен доступа по коду авторизации, его берем в интеграции, он 20 мин действует. Далее получаем уже по кодам обновления токен доступа и отправляем в апи данные
<?php
/** amocrm обработчик форм */
$client_id = 'xxxxxxxxx';
$client_secret = 'xxxxxxxx';
$amocrm_domain = 'xxxx.amocrm.ru';
$redirect_uri = 'https://xxxxx.com/api/action/amocrm';
$refresh_token = file_exists('temp/refresh_token') ? file_get_contents('temp/refresh_token') : '';
$access_token = file_exists('temp/access_token') && filemtime('temp/access_token') > time() ? file_get_contents('temp/access_token') : '';
if (!$refresh_token) {
$response = API::amocrm('/oauth2/access_token', 'POST', [
'client_id' => $client_id,
'client_secret' => $client_secret,
'grant_type' => 'authorization_code',
'code' => 'ваш первичный код авторизации из вашей интеграции, который 20 минут действует',
'redirect_uri' => $redirect_uri,
]);
file_put_contents('temp/refresh_token', $response->refresh_token);
file_put_contents('temp/access_token', $response->access_token);
touch('temp/access_token', time() + $response->expires_in - 1800);
$access_token = $response->access_token;
$refresh_token = $response->refresh_token;
}
if ($refresh_token && !$access_token) {
$response = API::amocrm('/oauth2/access_token', 'POST', [
'client_id' => $client_id,
'client_secret' => $client_secret,
'grant_type' => 'refresh_token',
'refresh_token' => $refresh_token,
'redirect_uri' => $redirect_uri,
]);
file_put_contents('temp/refresh_token', $response->refresh_token);
file_put_contents('temp/access_token', $response->access_token);
touch('temp/access_token', time() + $response->expires_in - 1800);
$access_token = $response->access_token;
$refresh_token = $response->refresh_token;
}
!empty($_POST['contact']) or exit;
$_POST['name'] = $_POST['name'] ?? $_POST['contact'];
$data = [];
$data[0]['pipeline_id'] = 9999999;
$data[0]['_embedded']['tags'][0]['name'] = 'Сайт: Заявка на подбор';
$data[0]['_embedded']['contacts'][0]['name'] = $_POST['name'];
$data[0]['_embedded']['contacts'][0]['first_name'] = $_POST['name'];
$data[0]['_embedded']['contacts'][0]['custom_fields_values'] = [[
"field_code" => "PHONE",
"values" => [
[
"enum_code" => "WORK",
"value" => $_POST['contact']
]
]
]];
$response = API::amocrm('/api/v4/leads/complex', 'POST', $data, [
'Content-Type: application/json',
'Authorization: Bearer ' . $access_token,
]);
exit(json_encode(['result' => 'ok', 'message' => 'Спасибо, заявка отправлена!']));