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' => 'Спасибо, заявка отправлена!']));