Skip to content

Instantly share code, notes, and snippets.

@webag
Last active October 23, 2023 23:22
Show Gist options
  • Save webag/aaaf02a98987080be67c5bffb4a5265e to your computer and use it in GitHub Desktop.
Save webag/aaaf02a98987080be67c5bffb4a5265e to your computer and use it in GitHub Desktop.
Amocrm new version integration
<?
$subdomain = "XXX";
$client_id = "XXX"; // id нашей интеграции
$client_secret = "XXX"; // секретный ключ нашей интеграции
$redirect_uri = "https://XXX.ru/"; // домен сайта нашей интеграции
$amoTokenFile = $_SERVER['DOCUMENT_ROOT'] . "/ajax/amotoken.txt"; // Путь для файла с токенами - любой удобный
$responsible_user_id = 9380670;
$resultAmoIntegration = [];
// Массив с данными юзера
$formData = [
// поля для сделки
"LEAD" => [
"lead_name" => $subject . ' / ' . $_POST["user_name"],
"lead_note" => $message_amo,
],
// поля для контакта
"CONTACT" => [
"user_name" => $_POST["user_name"],
"user_phone" => $_POST["user_tel"],
"user_email" => $_POST["user_email"],
],
];
// Массив с данными юзера
// Функция отправки curl запроса. Принимает массив данных (не json). Отдает массив ответа, преобразованный из json. Если есть $data - будет POST, иначе GET.
function curlRequest($link, $accessToken, $data = [])
{
$headers = [
"Accept: application/json",
'Authorization: Bearer ' . $accessToken
];
$dataJson = json_encode($data);
$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, $headers);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
if ($data){
curl_setopt($curl, CURLOPT_POSTFIELDS, $dataJson);
}
$responseJson = curl_exec($curl);
curl_close($curl);
$response = json_decode($responseJson, TRUE);
return $response;
}
function amoAddContact($accessToken, $formData)
{
global $subdomain, $resultAmoIntegration;
$link = 'https://' . $subdomain . '.amocrm.ru/api/v4/contacts';
$contactData = array(
[
'name' => $formData["CONTACT"]["user_name"],
'custom_fields_values' => [
[
'field_id' => 270635, // ТЕЛЕФОН
'values' => [
[
'value' => $formData["CONTACT"]["user_phone"],
'enum_code' => 'MOB'
]
]
],
[
'field_id' => 270637, // EMAIL
'values' => [
[
'value' => $formData["CONTACT"]["user_email"],
'enum_code' => 'WORK'
]
]
],
],
'_embedded' => [
'tags' => [
0 => [
"name" => 'авто отправка'
]
]
],
]
);
$contactResponse = curlRequest($link, $accessToken, $contactData);
$resultAmoIntegration['amoContact'] = $contactResponse;
$contactId = $contactResponse['_embedded']['contacts'][0]['id'];
return $contactId;
}
function amoAddLead($accessToken, $formData, $contactId = 0)
{
global $subdomain, $resultAmoIntegration, $responsible_user_id;
$link = "https://" . $subdomain . ".amocrm.ru/api/v4/leads";
$leadData = [
0 => [
'name' => $formData["LEAD"]["lead_name"],
'responsible_user_id' => $responsible_user_id,
'_embedded' => [
'contacts' => [
0 => [
"id" => $contactId
]
],
'tags' => [
0 => [
"name" => 'авто отправка'
]
]
],
],
];
$leadResponse = curlRequest($link, $accessToken, $leadData);
$resultAmoIntegration['amoLead'] = $leadResponse;
$leadId = $leadResponse['_embedded']['leads'][0]['id'];
return $leadId;
}
function amoAddNoteToLead($accessToken, $formData, $leadId = false)
{
global $subdomain, $resultAmoIntegration;
$link = "https://" . $subdomain . ".amocrm.ru/api/v4/leads/" . $leadId . "/notes";
$noteData = [
0 => [
'note_type' => 'common',
'params' => [
'text' => $formData["LEAD"]["lead_note"]
]
],
];
$noteResponse = curlRequest($link, $accessToken, $noteData);
$resultAmoIntegration['amoNote'] = $noteResponse;
}
function amoGetLeadFields($accessToken)
{
global $subdomain, $resultAmoIntegration;
$link = "https://" . $subdomain . ".amocrm.ru/api/v4/leads/custom_fields";
$leadFieldsResponse = curlRequest($link, $accessToken);
$resultAmoIntegration['amoLeadFields'] = $leadFieldsResponse;
}
function amoGetContactFields($accessToken)
{
global $subdomain, $resultAmoIntegration;
$link = "https://" . $subdomain . ".amocrm.ru/api/v4/contacts/custom_fields";
$contactFieldsResponse = curlRequest($link, $accessToken);
$resultAmoIntegration['amoContactFields'] = $contactFieldsResponse;
}
function amoGetUsers($accessToken)
{
global $subdomain, $resultAmoIntegration;
$link = "https://" . $subdomain . ".amocrm.ru/api/v4/users";
$usersResponse = curlRequest($link, $accessToken);
$resultAmoIntegration['amoUsers'] = $usersResponse;
}
// Функция обновления токенов. В эту функцию мы передаём текущий refresh_token
function returnNewToken($refresh_token)
{
global $subdomain, $client_id, $client_secret, $redirect_uri, $amoTokenFile;
$link = 'https://' . $subdomain . '.amocrm.ru/oauth2/access_token';
$data = [
'client_id' => $client_id,
'client_secret' => $client_secret,
'grant_type' => 'refresh_token',
'refresh_token' => $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_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) {
$resultAmoIntegration['error'] = 'Ошибка 2: ' . $e->getMessage() . PHP_EOL . 'Код ошибки: ' . $e->getCode();
}
$response = json_decode($out, true);
if ($response) {
/* записываем конечное время жизни токена */
$response["endTokenTime"] = time() + $response["expires_in"];
$responseJSON = json_encode($response);
$f = fopen($amoTokenFile, 'w');
fwrite($f, $responseJSON);
fclose($f);
$response = json_decode($responseJSON, true);
return $response;
} else {
return false;
}
}
// Функция обновления токенов
function amoIntegration($formData)
{
global $amoTokenFile, $resultAmoIntegration;
/* получаем значения токенов из файла */
$dataToken = file_get_contents($amoTokenFile);
$dataToken = json_decode($dataToken, true);
/* проверяем, истёкло ли время действия токена Access */
if ($dataToken["endTokenTime"] < time()) {
/* запрашиваем новый токен */
$dataToken = returnNewToken($dataToken["refresh_token"]);
$newAccessToken = $dataToken["access_token"];
} else {
$newAccessToken = $dataToken["access_token"];
}
$contactId = amoAddContact($newAccessToken, $formData);
$leadId = amoAddLead($newAccessToken, $formData, $contactId);
amoAddNoteToLead($newAccessToken, $formData, $leadId);
amoGetLeadFields($newAccessToken);
amoGetContactFields($newAccessToken);
amoGetUsers($newAccessToken);
echo json_encode($resultAmoIntegration);
}
amoIntegration($formData);
<?
$subdomain = "XXXX";
$client_id = "XXXXX"; // id нашей интеграции
$client_secret = "XXXXXX"; // секретный ключ нашей интеграции
$redirect_uri = "XXXXX"; // домен сайта нашей интеграции
$auth_code = 'XXXXXX'; //Код авторизации - меняется после каждого запроса
$amoTokenFile = $_SERVER['DOCUMENT_ROOT'] . "/amotoken.txt"; // Путь для файла с токенами - любой удобный
//Получаем первоначальные токены
$link = 'https://' . $subdomain . '.amocrm.ru/oauth2/access_token'; //Формируем URL для запроса
$data = [
'client_id' => $client_id,
'client_secret' => $client_secret,
'grant_type' => 'authorization_code',
'code' => $auth_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_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) {
echo "File with tokens NOT generated. <br>";
echo "Если 400 ошибка, то скорее всего обновился код авторизации. Актуальный брать из параметров интеграции в AMO. <br>";
die('Ошибка: ' . $e->getMessage() . PHP_EOL . 'Код ошибки: ' . $e->getCode());
}
/* Данные получаем в формате JSON, поэтому, для получения читаемых данных, нам придётся перевести ответ в формат, понятный PHP */
$response = json_decode($out, true);
/* массив со всеми необходимыми данными, его сохраним в файле $amoTokenFile */
$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(),
];
$arrParamsAmoJSON = json_encode($arrParamsAmo);
$f = fopen($amoTokenFile, 'w');
fwrite($f, $arrParamsAmoJSON);
fclose($f);
echo "File with tokens generated";
// выведем наши токены.
// access_token будет использоваться для каждого запроса как идентификатор интеграции
?>
<pre style='font-size:12px'><?print_r($arrParamsAmo)?></pre>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment