Skip to content

Instantly share code, notes, and snippets.

@webag
Last active April 8, 2024 09:50
Show Gist options
  • Star 31 You must be signed in to star a gist
  • Fork 18 You must be signed in to fork a gist
  • Save webag/58ad75276aaa14325ab02a0189c9e37d to your computer and use it in GitHub Desktop.
Save webag/58ad75276aaa14325ab02a0189c9e37d to your computer and use it in GitHub Desktop.
PHP Добавление контакта и сделки в amocrm с полями из формы сайта.
<?
//amo
//ПРЕДОПРЕДЕЛЯЕМЫЕ ПЕРЕМЕННЫЕ
$responsible_user_id = 7292136; //id ответственного по сделке, контакту, компании
$lead_name = 'Заявка с сайта'; //Название добавляемой сделки
$lead_status_id = '11331793'; //id этапа продаж, куда помещать сделку
$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=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_POST,true);
curl_setopt($curl,CURLOPT_POSTFIELDS,http_build_query($user));
curl_setopt($curl,CURLOPT_HEADER,false);
curl_setopt($curl,CURLOPT_COOKIEFILE,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
curl_setopt($curl,CURLOPT_COOKIEJAR,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
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
$Response=json_decode($out,true);
//echo '<b>Авторизация:</b>'; echo '<pre>'; print_r($Response); echo '</pre>';
//ПОЛУЧАЕМ ДАННЫЕ АККАУНТА
$link='https://'.$subdomain.'.amocrm.ru/private/api/v2/json/accounts/current'; #$subdomain уже объявляли выше
$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,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
curl_setopt($curl,CURLOPT_COOKIEJAR,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
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);
$Response=json_decode($out,true);
$account=$Response['response']['account'];
//echo '<b>Данные аккаунта:</b>'; echo '<pre>'; print_r($Response); echo '</pre>';
//ПОЛУЧАЕМ СУЩЕСТВУЮЩИЕ ПОЛЯ
$amoAllFields = $account['custom_fields']; //Все поля
$amoConactsFields = $account['custom_fields']['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['request']['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' => 'Important, USA', #Теги
//'custom_fields'=>array()
)
);
$link='https://'.$subdomain.'.amocrm.ru/private/api/v2/json/leads/set';
$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,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
curl_setopt($curl,CURLOPT_COOKIEJAR,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
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['response']['leads']['add']))
foreach($Response['response']['leads']['add'] as $lead) {
$lead_id = $lead["id"]; //id новой сделки
};
//ДОБАВЛЯЕМ СДЕЛКУ - КОНЕЦ
//ДОБАВЛЕНИЕ КОНТАКТА
$contact = array(
'name' => $contact_name,
'linked_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' => 'MOB'
)
)
),
array(
'id' => $sFields['EMAIL'],
'values' => array(
array(
'value' => $contact_email,
'enum' => 'WORK'
)
)
)
)
);
$set['request']['contacts']['add'][]=$contact;
#Формируем ссылку для запроса
$link='https://'.$subdomain.'.amocrm.ru/private/api/v2/json/contacts/set';
$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($set));
curl_setopt($curl,CURLOPT_HTTPHEADER,array('Content-Type: application/json'));
curl_setopt($curl,CURLOPT_HEADER,false);
curl_setopt($curl,CURLOPT_COOKIEFILE,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
curl_setopt($curl,CURLOPT_COOKIEJAR,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
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);
CheckCurlResponse($code);
$Response=json_decode($out,true);
//ДОБАВЛЕНИЕ КОНТАКТА - КОНЕЦ
//amo
?>
@rustamgaliev
Copy link

а как добавлять сделку в неразобранное?

@jackillman
Copy link

Можешь подсказать, как сюда добавить переменную "город"?

@jackillman
Copy link

Очень нужно, помоги пож

@webag
Copy link
Author

webag commented Apr 11, 2018

Если раскомментить 68 строку, то в ответ в консоли получим все кастомные поля контакта. отсюда узнаем id нужного поля.
Затем когда формируем массив на создание контакта добавляем новое значение типа того:
'custom_fields'=>array( array( 'id' => $sFields['PHONE'], 'values' => array( array( 'value' => $contact_phone, 'enum' => 'MOB' ) ) ), array( 'id' => $sFields['EMAIL'], 'values' => array( array( 'value' => $contact_email, 'enum' => 'WORK' ) ) ) , array( 'id' => ****ID_НУЖНОГО_ПОЛЯ****, 'values' => array( array( 'value' => ***Значение из вашей формы или откуда-то еще***, ) ) ) )

@ikulakov
Copy link

ikulakov commented Oct 4, 2018

Жить тебе долго и счастливо добрый человек :)

@wild-tiger1990
Copy link

Спасибо тебе огромное!) Очень выручил.

@glebsneg
Copy link

glebsneg commented Jan 4, 2019

О боже, ты лучший, даже не представляешь как выручил. Спасибо большое!!!

@nexakasaki
Copy link

Работает. Люблю, целую, обнимаю!
Спасибо

@sashabeep
Copy link

Кто-то придумал, как бороться с дубликатами на основе этого скрипта? Каждый раз создается новый контакт

@ocupay
Copy link

ocupay commented Sep 19, 2019

Кто-то придумал, как бороться с дубликатами на основе этого скрипта? Каждый раз создается новый контакт

в респонсе приходит id клиента. сохраняешь его, потом когда клиент добавляет сделку, проверяешь сохранен ли id клиента. если сохранен, то просто линкуешь соответствуещего клиента иначе создаешь нового.

@sashabeep
Copy link

в респонсе приходит id клиента. сохраняешь его, потом когда клиент добавляет сделку, проверяешь сохранен ли id клиента. если сохранен, то просто линкуешь соответствуещего клиента иначе создаешь нового.

Так если его запускать каждый раз всё равно будет новый id клиента каждый раз

@ocupay
Copy link

ocupay commented Sep 20, 2019

в респонсе приходит id клиента. сохраняешь его, потом когда клиент добавляет сделку, проверяешь сохранен ли id клиента. если сохранен, то просто линкуешь соответствуещего клиента иначе создаешь нового.

Так если его запускать каждый раз всё равно будет новый id клиента каждый раз

да если делать amocrm.ru/private/api/v2/json/contacts/set каждый раз, то будет каждый раз новый клиент. просто не надо его делать каждый раз, а использовать уже созданного клиента

@sashabeep
Copy link

да если делать amocrm.ru/private/api/v2/json/contacts/set каждый раз, то будет каждый раз новый клиент. просто не надо его делать каждый раз, а использовать уже созданного клиента

Да для тех же форм обратного звонка или заказа в один клик так не сделать. Человек может несколько раз открыть разные формы и вписать один и тот же номер

@sashabeep
Copy link

Перестало работать. $amoConactsFields пустой, далее
Warning: Invalid argument supplied for foreach()

Я так понимаю не может раздать полям ID.

@xynobo
Copy link

xynobo commented Apr 29, 2020

Перестало работать. $amoConactsFields пустой, далее
Warning: Invalid argument supplied for foreach()

Я так понимаю не может раздать полям ID.

А $account тоже пустой? Может у вас с коннектом что-то

@sashabeep
Copy link

@xynobo
Техподдержка упорно говорит что используется устаревшие методы в account.
Даже когда авторизовывается нормально - массив пустой. Черт знает, может, не там он теперь.

@sashabeep
Copy link

Данные аккаунта поменялись
https://www.amocrm.ru/developers/content/api/account

URL сменился и json с ответом

//ПОЛУЧАЕМ ДАННЫЕ АККАУНТА
$link = 'https://' . $subdomain . '.amocrm.ru/api/v2/account?with=pipelines,groups,note_types,task_types,custom_fields';
...
//ПОЛУЧАЕМ СУЩЕСТВУЮЩИЕ ПОЛЯ
$amoAllFields = $Response['_embedded']['custom_fields']; //Все поля
$amoConactsFields = $amoAllFields['contacts']; //Поля контактов

@sashabeep
Copy link

с LEAD то же самое похоже. И с Note

@marievka
Copy link

Добрый день. Можешь подсказать как при переходе на определенный этап сделки сделать чтобы к контакту сделки добавлялись теги из сделки?

@lagodina-anastasia
Copy link

Добрый день! А как добавить в неразобранное?

@sashabeep
Copy link

@lagodina-anastasia оно и так добавляется в неразобранное. Суть только в том, что этот пример давно не работает, они обновили API и этот скрипт работать не будет

@lagodina-anastasia
Copy link

Поняла, спасибо

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