Last active
October 23, 2023 23:22
-
-
Save webag/aaaf02a98987080be67c5bffb4a5265e to your computer and use it in GitHub Desktop.
Amocrm new version integration
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<? | |
$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); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<? | |
$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