Skip to content

Instantly share code, notes, and snippets.

@sashabeep
Last active March 7, 2023 09:47
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save sashabeep/401be029521c6a8c698c9bbd3dbc50a0 to your computer and use it in GitHub Desktop.
Save sashabeep/401be029521c6a8c698c9bbd3dbc50a0 to your computer and use it in GitHub Desktop.
Отправка сделки на AmoCRM
<?php
//ПРЕДОПРЕДЕЛЯЕМЫЕ ПЕРЕМЕННЫЕ
$responsible_user_id = ######; //id ответственного по сделке, контакту, компании
$lead_name = 'Заявка с сайта'; //Название добавляемой сделки
$lead_status_id = ''; //id этапа продаж, куда помещать сделку. Пусто - неразобранное
$lead_desc = '' //Дополнительная заметка к сделке. Сюда можно поместить тело письма и т.д.
$contact_name = $cname; //Название добавляемого контакта
$contact_phone = $cphone; //Телефон контакта
$contact_email = $cemail; //Емейл контакта
//АВТОРИЗАЦИЯ
$user=array(
'USER_LOGIN'=>'###', //Ваш логин (электронная почта)
'USER_HASH'=>'###' //Хэш для доступа к API (смотрите в профиле пользователя)
);
$subdomain='###';
//АВТОРИЗАЦИЯ
//Формируем ссылку для запроса
$link = 'https://' . $subdomain . '.amocrm.ru/private/api/auth.php?type=json';
/* Нам необходимо инициировать запрос к серверу. Воспользуемся библиотекой cURL (поставляется в составе PHP). Вы также
можете
использовать и кроссплатформенную программу cURL, если вы не программируете на PHP. */
$curl = curl_init(); //Сохраняем дескриптор сеанса cURL
//Устанавливаем необходимые опции для сеанса cURL
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_USERAGENT, 'amoCRM-API-client/1.0');
curl_setopt($curl, CURLOPT_URL, $link);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($user));
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_COOKIEFILE, __DIR__ . '/cookie.txt');
curl_setopt($curl, CURLOPT_COOKIEJAR, __DIR__ . '/cookie.txt');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
$out = curl_exec($curl); //Инициируем запрос к API и сохраняем ответ в переменную
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); //Получим HTTP-код ответа сервера
curl_close($curl); //Завершаем сеанс cURL
/* Теперь мы можем обработать ответ, полученный от сервера. Это пример. Вы можете обработать данные своим способом. */
$code = (int) $code;
$errors = array(
301 => 'Moved permanently',
400 => 'Bad request',
401 => 'Unauthorized',
403 => 'Forbidden',
404 => 'Not found',
500 => 'Internal server error',
502 => 'Bad gateway',
503 => 'Service unavailable',
);
try
{
//Если код ответа не равен 200 или 204 - возвращаем сообщение об ошибке
if ($code != 200 && $code != 204) {
throw new Exception(isset($errors[$code]) ? $errors[$code] : 'Undescribed error', $code);
}
} catch (Exception $E) {
die('Ошибка: ' . $E->getMessage() . PHP_EOL . 'Код ошибки: ' . $E->getCode());
}
/*
Данные получаем в формате JSON, поэтому, для получения читаемых данных,
нам придётся перевести ответ в формат, понятный PHP
*/
$Response = json_decode($out, true);
//echo '<b>Авторизация:</b>'; echo '<pre>'; print_r($Response); echo '</pre>';
//ПОЛУЧАЕМ ДАННЫЕ АККАУНТА
//Формируем ссылку для запроса
$link = 'https://' . $subdomain . '.amocrm.ru/api/v2/account?with=pipelines,groups,note_types,task_types,custom_fields';
/*
Нам необходимо инициировать запрос к серверу. Воспользуемся библиотекой cURL (поставляется в составе PHP).
Вы также можете использовать и кроссплатформенную программу cURL, если вы не программируете на PHP.
*/
$curl = curl_init(); //Сохраняем дескриптор сеанса cURL
//Устанавливаем необходимые опции для сеанса cURL
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_USERAGENT, 'amoCRM-API-client/1.0');
curl_setopt($curl, CURLOPT_URL, $link);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_COOKIEFILE, __DIR__ . '/cookie.txt');
curl_setopt($curl, CURLOPT_COOKIEJAR, __DIR__ . '/cookie.txt');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
$out = curl_exec($curl); //Инициируем запрос к API и сохраняем ответ в переменную
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
/*
Теперь мы можем обработать ответ, полученный от сервера.
Это пример. Вы можете обработать данные своим способом.
*/
$code = (int) $code;
$errors = array(
301 => 'Moved permanently',
400 => 'Bad request',
401 => 'Unauthorized',
403 => 'Forbidden',
404 => 'Not found',
500 => 'Internal server error',
502 => 'Bad gateway',
503 => 'Service unavailable'
);
try { //Если код ответа не равен 200 или 204 - возвращаем сообщение об ошибке
if ($code != 200 && $code != 204) {
throw new Exception(isset($errors[$code]) ? $errors[$code] : 'Undescribed error', $code);
}
} catch (Exception $E) {
die('Ошибка: ' . $E->getMessage() . PHP_EOL . 'Код ошибки: ' . $E->getCode());
}
/*
Данные получаем в формате JSON, поэтому, для получения читаемых данных,
нам придётся перевести ответ в формат, понятный PHP
*/
$Response = json_decode($out, true);
//echo '<b>Данные аккаунта:</b>'; echo '<pre>'; print_r($Response); echo '</pre>';
//ПОЛУЧАЕМ СУЩЕСТВУЮЩИЕ ПОЛЯ
$amoAllFields = $Response['_embedded']['custom_fields']; //Все поля
$amoConactsFields = $amoAllFields['contacts']; //Поля контактов
//echo '<b>Поля из амо:</b>'; echo '<pre>'; print_r($amoConactsFields); echo '</pre>';
//ФОРМИРУЕМ МАССИВ С ЗАПОЛНЕННЫМИ ПОЛЯМИ КОНТАКТА
//Стандартные поля амо:
$sFields = array_flip(array(
'PHONE', //Телефон. Варианты: WORK, WORKDD, MOB, FAX, HOME, OTHER
'EMAIL' //Email. Варианты: WORK, PRIV, OTHER
)
);
//Проставляем id этих полей из базы амо
foreach($amoConactsFields as $afield) {
if(isset($sFields[$afield['code']])) {
$sFields[$afield['code']] = $afield['id'];
}
}
//ДОБАВЛЯЕМ СДЕЛКУ
$leads['add']=array(
array(
'name' => $lead_name,
'status_id' => $lead_status_id, //id статуса
'responsible_user_id' => $responsible_user_id, //id ответственного по сделке
//'date_create'=>1298904164, //optional
//'price'=>300000,
//'tags' => 'TEST', //Теги
//'custom_fields'=>array()
)
);
$link='https://'.$subdomain.'.amocrm.ru/api/v2/leads';
$curl=curl_init(); //Сохраняем дескриптор сеанса cURL
//Устанавливаем необходимые опции для сеанса cURL
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_USERAGENT, 'amoCRM-API-client/1.0');
curl_setopt($curl, CURLOPT_URL, $link);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($leads));
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl,CURLOPT_COOKIEFILE,__DIR__.'/cookie.txt');
curl_setopt($curl,CURLOPT_COOKIEJAR,__DIR__.'/cookie.txt');
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,0);
$out=curl_exec($curl); //Инициируем запрос к API и сохраняем ответ в переменную
$code=curl_getinfo($curl,CURLINFO_HTTP_CODE);
$Response=json_decode($out,true);
//echo '<b>Новая сделка:</b>'; echo '<pre>'; print_r($Response); echo '</pre>';
if(is_array($Response['_embedded']['items'])){
foreach($Response['_embedded']['items'] as $lead) {
$lead_id = $lead["id"]; //id новой сделки
}
}
//ДОБАВЛЯЕМ СДЕЛКУ - КОНЕЦ
//ДОБАВЛЕНИЕ КОНТАКТА
$contacts['add'][] = array(
'name' => $contact_name,
'leads_id' => array($lead_id), //id сделки
'responsible_user_id' => $responsible_user_id, //id ответственного
'custom_fields'=>array(
array(
'id' => $sFields['PHONE'],
'values' => array(
array(
'value' => $contact_phone,
'enum' => 'WORK'
)
)
),
array(
'id' => $sFields['EMAIL'],
'values' => array(
array(
'value' => $contact_email,
'enum' => 'WORK'
)
)
)
)
);
//echo '<pre>'; print_r($contacts); echo '</pre>';
$link = 'https://' . $subdomain . '.amocrm.ru/api/v2/contacts';
$curl = curl_init(); //Сохраняем дескриптор сеанса cURL
//Устанавливаем необходимые опции для сеанса cURL
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_USERAGENT, 'amoCRM-API-client/1.0');
curl_setopt($curl, CURLOPT_URL, $link);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($contacts));
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_COOKIEFILE, __DIR__ . '/cookie.txt');
curl_setopt($curl, CURLOPT_COOKIEJAR, __DIR__ . '/cookie.txt');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
$out = curl_exec($curl);
$Response=json_decode($out,true);
//echo '<b>Новый контакт:</b>'; echo '<pre>'; print_r($Response); echo '</pre>';
//ДОБАВЛЕНИЕ КОНТАКТА - КОНЕЦ
//ДОБАВЛЕНИЕ ЗАДАЧИ связаться через 60 минут
$tasks['add'][] = array(
'element_id' => $lead_id, //id сделки
'task_type' => '1',
'element_type' => '2',
'responsible_user_id' => $responsible_user_id, //id ответственного
'text' => $lead_name,
'complete_till' => time() + (1 * 60 * 60)
);
$link = 'https://' . $subdomain . '.amocrm.ru/api/v2/tasks';
$curl = curl_init(); //Сохраняем дескриптор сеанса cURL
//Устанавливаем необходимые опции для сеанса cURL
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_USERAGENT, 'amoCRM-API-client/1.0');
curl_setopt($curl, CURLOPT_URL, $link);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($tasks));
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_COOKIEFILE, __DIR__ . '/cookie.txt');
curl_setopt($curl, CURLOPT_COOKIEJAR, __DIR__ . '/cookie.txt');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
$out = curl_exec($curl); //Инициируем запрос к API и сохраняем ответ в переменную
$Response=json_decode($out,true);
//echo '<b>Новая задача:</b>'; echo '<pre>'; print_r($Response); echo '</pre>';
//ДОБАВЛЕНИЕ ЗАДАЧИ - КОНЕЦ
//ДОБАВЛЕНИЕ NOTE
$data = array(
'add' => array(
0 => array(
'element_id' => $lead_id,
'element_type' => '2',
'text' => $lead_desc,
'note_type' => '4'
),
),
);
$link = 'https://' . $subdomain . '.amocrm.ru/api/v2/notes';
/* Нам необходимо инициировать запрос к серверу. Воспользуемся библиотекой cURL (поставляется в составе PHP). Подробнее о
работе с этой
библиотекой Вы можете прочитать в мануале. */
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_USERAGENT, 'amoCRM-API-client/1.0');
curl_setopt($curl, CURLOPT_URL, $link);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_COOKIEFILE, __DIR__ . '/cookie.txt');
curl_setopt($curl, CURLOPT_COOKIEJAR, __DIR__ . '/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 = array(
301 => 'Moved permanently',
400 => 'Bad request',
401 => 'Unauthorized',
403 => 'Forbidden',
404 => 'Not found',
500 => 'Internal server error',
502 => 'Bad gateway',
503 => 'Service unavailable',
);
try
{
#Если код ответа не равен 200 или 204 - возвращаем сообщение об ошибке
if ($code != 200 && $code != 204) {
throw new Exception(isset($errors[$code]) ? $errors[$code] : 'Undescribed error', $code);
}
} catch (Exception $E) {
die('Ошибка: ' . $E->getMessage() . PHP_EOL . 'Код ошибки: ' . $E->getCode());
}
$Response=json_decode($out,true);
//echo '<b>Новая заметка:</b>'; echo '<pre>'; print_r($Response); echo '</pre>';
//переписано с https://gist.github.com/webag/58ad75276aaa14325ab02a0189c9e37d 29-04-2020
?>
@Alex-V6
Copy link

Alex-V6 commented May 10, 2020

Sasha а вам удалось в итоге решить вопрос с дублями контактов ?

@sashabeep
Copy link
Author

sashabeep commented May 10, 2020

@Alex-V6 nope.
В моем случае это не так актуально. В-основном, во второй раз контакт с пользователем происходит через менеджеров, а не через формы. Даже если пользователь отправил несколько форм за раз, в моем случае это не вызывает сложностей. Они приходят примерно в один вмеяемый промежуток, чтобы привести контакт в нормальное состояние и назначить его всем задачам.

Вроде как query есть в описании https://www.amocrm.com/developers/content/api/contacts/ но что туда писать, не нашел. Да и в моем случае не так уж важно

@Alex-V6
Copy link

Alex-V6 commented May 10, 2020

Ясно , спасибо , буду искать дальше )

@kostealupu
Copy link

Добрый день, сейчас этот код будет работать, там вроде новое api

@sashabeep
Copy link
Author

@kostealpu а попробовать?

@kostealupu
Copy link

kostealupu commented Sep 17, 2020

@kostealpu а попробовать?

сейчас же в профиле нет api ключ, как попробовать?

@sashabeep
Copy link
Author

сейчас же в профиле нет api ключ, как попробовать?

Да. Отключили. Стало быть, подходит только для тех случаев, когда ключ еще был выпущен

@sashabeep
Copy link
Author

@kostealupu
Copy link

кто то понимает как сделать авторизацию через OAuth 2.0?
может есть простой пример?

@GERAunits
Copy link

Было бы здорово, если бы автор переделал авторизацию. Заранее Благодарю!

@DarkTraveler
Copy link

/settings/profile/
Открываем консоль браузера и вводим AMOCRM.widgets.system.amohash
В ответ вернет Hash, да его удалили визуально, но они выдаются и API пока продолжает работать без изменений

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment