Примеры. Форма добавления

Специально для Вас мы подготовили обучающие уроки для работы с механизмами amoCRM. Эти примеры помогут Вам в максимально быстрые сроки познакомиться с нашей системой и использовать её на полную катушку.

Мы уже описывали процесс создания виджета, добавляющего контакт в amoCRM, используя обычную html-форму. Попробуем сделать тоже самое, используя REST API

Создание собственной Web-странички

На примере ниже мы продемонстрируем создание простой html-формы для добавления контакта.

Создадим файл с html-формой и назовём его index.php

  1. <!DOCTYPE html>
  2.   <meta charset="utf-8">
  3.   <title>Добавление контакта</title>
  4. </head>
  5.   <div id="wrapper">
  6.     <header>
  7.       <h1>Создание контакта</h1>
  8.     </header>
  9.     <div id="contact_form">
  10.       <form action="handler.php" method="post">
  11.         <div class="field">
  12.           <label for="contact_name">Имя</label><input id="contact_name" type="text" name="name">
  13.         </div>
  14.         <div class="field">
  15.           <label for="contact_company">Компания</label><input id="contact_company" type="text" name="company">
  16.         </div>
  17.         <div class="field">
  18.           <label for="contact_position">Должность</label><input id="contact_position" type="text" name="position">
  19.         </div>
  20.         <div class="field">
  21.           <label for="contact_phone">Телефон</label><input id="contact_phone" type="tel" name="phone">
  22.         </div>
  23.         <div class="field">
  24.           <label for="contact_email">E-mail</label><input id="contact_email" type="email" name="email">
  25.         </div>
  26.         <div class="field">
  27.           <label for="contact_scope">Сфера деятельности</label>
  28.           <select id="contact_scope" name="scope[]" size="5" multiple>
  29.             <option value="it">IT, телекоммуникации, связь, электроника</option>
  30.             <option value="auto">Автосервис, автобизнес</option>
  31.             <option value="bookkeeping">Бухгалтерия, аудит</option>
  32.             <option value="restaurants">Рестораны, фастфуд</option>
  33.             <option value="economy">Экономика, финансы</option>
  34.           </select>
  35.         </div>
  36.         <div>
  37.           <button type="submit">Создать контакт</button>
  38.           <button type="reset">Очистить форму</button>
  39.         </div>
  40.       </form>
  41.     </div>
  42.   </div>
  43. </body>
  44. </html>

Для того чтобы форма выглядела более или менее прилично, добавим стили для неё. Создадим файл main.css со следующим содержимым:

  1. label
  2. {
  3.   float: left;
  4.   padding-right: 10px;
  5. }
  6.  
  7. #contact_form
  8. {
  9.   float: left;
  10.   margin: 6px 10px;
  11. }
  12.  
  13. .field
  14. {
  15.   clear: both;
  16.   text-align: right;
  17.   line-height: 2em;
  18. }

И подключим стили в html-файле, описанном выше. Для этого в теге <head>, сразу за тегом </title>, вставим следующую строку:

<link rel="stylesheet" type="text/css" href="main.css" media="all">

Программирование логики

Для наглядности примера, мы будем выносить отдельные логические блоки в разные файлы и последовательно подключать последние. Вы можете сами разработать архитектуру вашего приложения, взаимодействующего с нашим API.

Контроллер

Создадим файл handler.php. В нём будут подключаться несколько файлов, каждый из которых будет выполнять отдельную задачу.

  1. <?php
  2. $root=__DIR__.DIRECTORY_SEPARATOR;
  3. require $root.'prepare.php'; #Здесь будут производиться подготовительные действия, объявления функций и т.д.
  4. require $root.'auth.php'; #Здесь будет происходить авторизация пользователя
  5. require $root.'account_current.php'; #Здесь мы будем получать информацию об аккаунте
  6. require $root.'fields_info.php'; #Получим информацию о полях
  7. require $root.'contacts_list.php'; #Получим информацию о контактах
  8. require $root.'contact_add.php'; #Здесь будет происходить добавление контакта
  9. ?>

Подготовка

Создадим файл prepare.php, в котором будут производиться подготовительные действия: объявление необходимых в дальнейшем функций и разбор входных данных.

  1. function CheckCurlResponse($code)
  2. {
  3.   $code=(int)$code;
  4.   $errors=array(
  5.     301=>'Moved permanently',
  6.     400=>'Bad request',
  7.     401=>'Unauthorized',
  8.     403=>'Forbidden',
  9.     404=>'Not found',
  10.     500=>'Internal server error',
  11.     502=>'Bad gateway',
  12.     503=>'Service unavailable'
  13.   );
  14.   try
  15.   {
  16.     #Если код ответа не равен 200 или 204 - возвращаем сообщение об ошибке
  17.     if($code!=200 && $code!=204)
  18.       throw new Exception(isset($errors[$code]) ? $errors[$code] : 'Undescribed error',$code);
  19.   }
  20.   catch(Exception $E)
  21.   {
  22.     die('Ошибка: '.$E->getMessage().PHP_EOL.'Код ошибки: '.$E->getCode());
  23.   }
  24. }
  25.  
  26. $data=array(
  27.   'name'=>isset($_POST['name']) ? $_POST['name'] : 'ss',
  28.   'company'=>isset($_POST['company']) ? $_POST['company'] : '',
  29.   'position'=>isset($_POST['position']) ? $_POST['position'] : '',
  30.   'phone'=>isset($_POST['phone']) ? $_POST['phone'] : '',
  31.   'email'=>isset($_POST['email']) ? $_POST['email'] : 'sd',
  32.   'web'=>isset($_POST['web']) ? $_POST['web'] : '',
  33.   'jabber'=>isset($_POST['jabber']) ? $_POST['jabber'] : '',
  34.   'scope'=>isset($_POST['scope']) && is_array($_POST['scope']) ? $_POST['scope'] : array()
  35. );
  36.  
  37. $scope_info=array(
  38.   'it'=>'IT, телекоммуникации, связь, электроника',
  39.   'auto'=>'Автосервис, автобизнес',
  40.   'bookkeeping'=>'Бухгалтерия, аудит',
  41.   'restaurants'=>'Рестораны, фастфуд',
  42.   'economy'=>'Экономика, финансы'
  43. );
  44.  
  45. #Если не указано имя или e-mail контакта - уведомляем
  46. if(empty($data['name']))
  47.   die('Не заполнено имя контакта');
  48. if(empty($data['email']))
  49.   die('Не заполнен E-mail контакта');

Процесс авторизации

Процесс авторизации подробно описан в документации. Вам достаточно просто создать файл auth.php и скопировать туда код, изменив данные авторизации на свои. Должно получиться что-то вроде:

  1. #Массив с параметрами, которые нужно передать методом POST к API системы
  2. $user=array(
  3.   'USER_LOGIN'=>'test@testmail.com', #Ваш логин (электронная почта)
  4.   'USER_HASH'=>'7ebefd1d4741106a4daa0e0a673bba2e4dc16054' #Хэш для доступа к API (смотрите в профиле пользователя)
  5. );
  6.  
  7. $subdomain='test'; #Наш аккаунт - поддомен
  8. #Формируем ссылку для запроса
  9. $link='https://'.$subdomain.'.amocrm.ru/private/api/auth.php?type=json';
  10. $curl=curl_init(); #Сохраняем дескриптор сеанса cURL
  11. #Устанавливаем необходимые опции для сеанса cURL
  12. curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
  13. curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-API-client/1.0');
  14. curl_setopt($curl,CURLOPT_URL,$link);
  15. curl_setopt($curl,CURLOPT_POST,true);
  16. curl_setopt($curl,CURLOPT_POSTFIELDS,http_build_query($user));
  17. curl_setopt($curl,CURLOPT_HEADER,false);
  18. curl_setopt($curl,CURLOPT_COOKIEFILE,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
  19. curl_setopt($curl,CURLOPT_COOKIEJAR,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
  20. curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,0);
  21. curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,0);
  22.  
  23. $out=curl_exec($curl); #Инициируем запрос к API и сохраняем ответ в переменную
  24. $code=curl_getinfo($curl,CURLINFO_HTTP_CODE); #Получим HTTP-код ответа сервера
  25. curl_close($curl); #Завершаем сеанс cURL
  26. CheckCurlResponse($code);
  27. /**
  28.  * Данные получаем в формате JSON, поэтому, для получения читаемых данных,
  29.  * нам придётся перевести ответ в формат, понятный PHP
  30.  */
  31. $Response=json_decode($out,true);
  32. $Response=$Response['response'];
  33. if(isset($Response['auth'])) #Флаг авторизации доступен в свойстве "auth"
  34.   return 'Авторизация прошла успешно';
  35. return 'Авторизация не удалась';

Получение информации о текущем аккаунте

Процесс получения информации о текущем аккаунте подробно описан в документации. Вам достаточно просто создать файл account_current.php и скопировать туда код. Должно получиться что-то вроде:

  1. $link='https://'.$subdomain.'.amocrm.ru/private/api/v2/json/accounts/current'; #$subdomain уже объявляли выше
  2. $curl=curl_init(); #Сохраняем дескриптор сеанса cURL
  3. #Устанавливаем необходимые опции для сеанса cURL
  4. curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
  5. curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-API-client/1.0');
  6. curl_setopt($curl,CURLOPT_URL,$link);
  7. curl_setopt($curl,CURLOPT_HEADER,false);
  8. curl_setopt($curl,CURLOPT_COOKIEFILE,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
  9. curl_setopt($curl,CURLOPT_COOKIEJAR,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
  10. curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,0);
  11. curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,0);
  12.  
  13. $out=curl_exec($curl); #Инициируем запрос к API и сохраняем ответ в переменную
  14. $code=curl_getinfo($curl,CURLINFO_HTTP_CODE);
  15. curl_close($curl);
  16. CheckCurlResponse($code);
  17. /**
  18.  * Данные получаем в формате JSON, поэтому, для получения читаемых данных,
  19.  * нам придётся перевести ответ в формат, понятный PHP
  20.  */
  21. $Response=json_decode($out,true);
  22. $account=$Response['response']['account'];

Получение отфильтрованного списка контактов

Процесс получения списка контактов подробно описан в документации. Вам достаточно просто создать файл contacts_list.php и скопировать туда код. Должно получиться что-то вроде:

  1. $link='https://'.$subdomain.'.amocrm.ru/private/api/v2/json/contacts/list?query='.$data['email'];
  2. $curl=curl_init(); #Сохраняем дескриптор сеанса cURL
  3. #Устанавливаем необходимые опции для сеанса cURL
  4. curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
  5. curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-API-client/1.0');
  6. curl_setopt($curl,CURLOPT_URL,$link);
  7. curl_setopt($curl,CURLOPT_HEADER,false);
  8. curl_setopt($curl,CURLOPT_COOKIEFILE,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
  9. curl_setopt($curl,CURLOPT_COOKIEJAR,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
  10. curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,0);
  11. curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,0);
  12.  
  13. $out=curl_exec($curl); #Инициируем запрос к API и сохраняем ответ в переменную
  14. $code=curl_getinfo($curl,CURLINFO_HTTP_CODE);
  15. curl_close($curl);
  16. CheckCurlResponse($code);
  17. if($out)
  18.   die('Такой контакт уже существует в amoCRM');

Получение информации о полях

Создадим файл fields_info.php. Обработаем информацию об аккаунте (получена выше) с целью получения информации о полях.

  1. $need=array_flip(array('POSITION','PHONE','EMAIL'));
  2. if(isset($account['custom_fields'],$account['custom_fields']['contacts']))
  3.   do
  4.   {
  5.     foreach($account['custom_fields']['contacts'] as $field)
  6.       if(is_array($field) && isset($field['id']))
  7.       {
  8.         if(isset($field['code']) && isset($need[$field['code']]))
  9.           $fields[$field['code']]=(int)$field['id'];
  10.         #SCOPE - нестандартное поле, поэтому обрабатываем его отдельно
  11.         elseif(isset($field['name']) && $field['name']=='Сфера деятельности')
  12.           $fields['SCOPE']=$field;
  13.        
  14.         $diff=array_diff_key($need,$fields);
  15.         if(empty($diff))
  16.           break 2;
  17.       }
  18.       if(isset($diff))
  19.         die('В amoCRM отсутствуют следующие поля'.': '.join(', ',$diff));
  20.       else
  21.         die('Невозможно получить дополнительные поля');
  22.     }
  23.   while(false);
  24. else
  25.   die('Невозможно получить дополнительные поля');
  26. $custom_fields=isset($fields) ? $fields : false;

Добавление контакта

Процесс добавления контакта/контактов подробно описан в документации. Создадим файл contact_add.php. В нём будет происходить формирование массива с собранными данными а также сам процесс добавления контакта в amoCRM.

  1. $contact=array(
  2.       'name'=>$data['name'],
  3.       'custom_fields'=>array(
  4.         array(
  5.           'id'=>$custom_fields['EMAIL'],
  6.           'values'=>array(
  7.             array(
  8.               'value'=>$data['email'],
  9.               'enum'=>'WORK'
  10.             )
  11.           )
  12.         )
  13.       )
  14.     );
  15.    
  16. if(!empty($data['company']))
  17.   $contact+=array('company_name'=>$data['company']);
  18. if(!empty($data['position']))
  19.   $contact['custom_fields'][]=array(
  20.     'id'=>$custom_fields['POSITION'],
  21.     'values'=>array(
  22.       array(
  23.         'value'=>$data['position']
  24.       )
  25.     )
  26. );
  27. if(!empty($data['phone']))
  28.   $contact['custom_fields'][]=array(
  29.     'id'=>$custom_fields['PHONE'],
  30.     'values'=>array(
  31.       array(
  32.         'value'=>$data['phone'],
  33.         'enum'=>'OTHER'
  34.       )
  35.     )
  36. );
  37. $set['request']['contacts']['add'][]=$contact;
  38.  
  39. #Формируем ссылку для запроса
  40. $link='https://'.$subdomain.'.amocrm.ru/private/api/v2/json/contacts/set';
  41. $curl=curl_init(); #Сохраняем дескриптор сеанса cURL
  42. #Устанавливаем необходимые опции для сеанса cURL
  43. curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
  44. curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-API-client/1.0');
  45. curl_setopt($curl,CURLOPT_URL,$link);
  46. curl_setopt($curl,CURLOPT_CUSTOMREQUEST,'POST');
  47. curl_setopt($curl,CURLOPT_POSTFIELDS,json_encode($set));
  48. curl_setopt($curl,CURLOPT_HTTPHEADER,array('Content-Type: application/json'));
  49. curl_setopt($curl,CURLOPT_HEADER,false);
  50. curl_setopt($curl,CURLOPT_COOKIEFILE,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
  51. curl_setopt($curl,CURLOPT_COOKIEJAR,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
  52. curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,0);
  53. curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,0);
  54.  
  55. $out=curl_exec($curl); #Инициируем запрос к API и сохраняем ответ в переменную
  56. $code=curl_getinfo($curl,CURLINFO_HTTP_CODE);
  57. CheckCurlResponse($code);
  58.  
  59. /**
  60.  * Данные получаем в формате JSON, поэтому, для получения читаемых данных,
  61.  * нам придётся перевести ответ в формат, понятный PHP
  62.  */
  63. $Response=json_decode($out,true);
  64. $Response=$Response['response']['contacts']['add'];
  65.  
  66. $output='ID добавленных контактов:'.PHP_EOL;
  67. foreach($Response as $v)
  68.   if(is_array($v))
  69.     $output.=$v['id'].PHP_EOL;
  70. return $output;

Скачать пример формы добавления

Скачать