Caribasius
9/17/2018 - 11:27 AM

b24 rest api send lead

<?
use Bitrix\Main\Diag\Debug;

/**
 * Класс предназначен для подготовки данных и отправки их в Б24 (создание лидов и проч.)
 */	
class SendDataToB24 
{
	/**
	 * @var $fieldsMap - массив, описывающий связывание полей для различных источников на сайте с полями Битрикс24
	 */	
	protected static $fieldsMap = array(
		'form' => array(
			'form-1' => array(
				'name' => 'NAME',
				'tell' => 'PHONE_WORK',
			),
			'form-2' => array(
				'name' => 'NAME',
				'tell' => 'PHONE_WORK',
				'message' => 'COMMENTS',
			),	
			'form-3' => array(
				'name' => 'NAME',
				'phone' => 'PHONE_WORK',
				'message' => 'COMMENTS',
			),	
			'form-4' => array(
				'name' => 'NAME',
				'phone' => 'PHONE_WORK',
			),				
			'form-5' => array(
				'name' => 'NAME',
				'tell' => 'PHONE_WORK',
				'titles' => 'UF_CRM_1530099864860',
				'links' => 'UF_CRM_1530099961043',
				'summ' => 'UF_CRM_1530102501986', 
			),				
		),
		'ticket' => array()
	);
	
	/**
	 * @var $additionalValues - постоянные значения доп. полей, которые нужно передавать
	 */		
	protected static $additionalValues = array(
		'form' => array(
			'form-1' => array(
				'TITLE' => "Обратный звонок",
				'SOURCE_ID' => '1',
				'ASSIGNED_BY_ID' => '14',
				'STATUS_ID' => 'NEW',
				'OPENED' => 'Y'
			),
			'form-2' => array(
				'TITLE' => "Не нашли нужную информацию?",
				'SOURCE_ID' => '4',
				'ASSIGNED_BY_ID' => '14',
				'STATUS_ID' => 'NEW',
				'OPENED' => 'Y'
			),	
			'form-3' => array(
				'TITLE' => "Напишите нам",
				'SOURCE_ID' => '3',
				'ASSIGNED_BY_ID' => '14',
				'STATUS_ID' => 'NEW',
				'OPENED' => 'Y'
			),	
			'form-4' => array(
				'TITLE' => "Сложности с выбором? Мы поможем!",
				'SOURCE_ID' => '2',
				'ASSIGNED_BY_ID' => '14',
				'STATUS_ID' => 'NEW',
				'OPENED' => 'Y'
			),	
			'form-5' => array(
				'TITLE' => "Быстрый заказ",
				'SOURCE_ID' => '5',
				'ASSIGNED_BY_ID' => '14',
				'STATUS_ID' => 'NEW',
				'OPENED' => 'Y'
			),				
		)
	);
	
	/**
	 * @var $connection - данные подключения для отправки данных
	 */	
	protected static $connection = array(
		'leads' => array(
			//'url' => 'https://crm.rf01.ru/crm/configs/import/lead.php', 
			'url' => 'https://crm.rf01.ru/rest/#dser_id#/#rest_key#/crm.lead.add.json', 
			//'auth' => array(
			//	'login' => '*****',
			//	'password' => '*****'
			//)
		),
		'test' => array(
			'url' => '', 
		)
	);
	
	protected $data, $portalId;	
	
	function __construct($portalId, $data)
	{
		$this->portalId = $portalId;
		$this->data = $data;
	}
	
	public function send()
	{
		$portal = self::$connection[$this->portalId];
		
		$o = new \Bitrix\Main\Web\HttpClient();
		
		//$this->data['LOGIN'] = $portal['auth']['login'];
		//$this->data['PASSWORD'] = $portal['auth']['password'];
		
		//AddMessage2Log($this->data, '$this->data - SendDataToB24');
		
		//smv($this->data);
		

		// обертвываем $this->data для отправки запроса с rest api
		$this->data = http_build_query(
			array(
				'fields' => $this->data
			)
		);
		
		
		$response = $o->post($portal['url'], $this->data);
		
		/**
		 * Вообще подразумевается, что ответ должен быть в формате json, однако после осмотра компонента bitrix:crm.lead.rest
		 * стало понятно, что некорректный json формат (на первый взгляд) - не что иное, как js-объект, напечатанный на страницу (бред, конечно).
		 * Поэтому расшифровывать его придется функцией, обратной той, которой строка была сформирована.
		 * Но теплится надежда, что когда-нибудь там будет отдаваться json, поэтому сначала пробуем расшифровать его.
		 */	
		try
		{
			$result = \Bitrix\Main\Web\Json::decode($response);
		}
		catch (Exception $e)
		{
			$result = \CUtil::JsObjectToPhp($response);
		}
		
		AddMessage2Log($result, 'SendDataToB24');
		
		/** Еще один прикол от разработчиков: в ответе ожидаются ключи code и error_message, однако вместо код приходит error */
		
		return $result;
	}
	
	/**
	 * Метод возвращает массив, подготовленный для отправки в Б24
	 *
	 * @param string $type - тип данных form|ticket, используется для обработки массива $data
	 * @param array $map - массив полей соответствия
	 * @param array $data - массив полей со значениями
	 * @param array $additional - массив доп. значений
	 * @return array
	 */
	public function getResultArray($type, $map, $data, $additional)
	{	
		$fields = array();
		

		
		
		/** Формируем массив значений для передачи используя массив соответствия */
		foreach($map as $sourceField => $destField)
		{
			$fields[$destField] = self::getFieldValue($sourceField, $data, $type);
		}
		
	
		
		/** Добавляем к массиву доп. поля */
		if(is_array($additional))
			$fields = self::extendData($fields, $additional);

		//smv($fields);
		//die();	
		
		return $fields;
	}
	
	/**
	 * Метод в зависимости от типа данных $type получает значение поля $sourceField из массива $data
	 *
	 * @param string $sourceField - ключ поля, значение которого нужно получить
	 * @param array $data - массив данных
	 * @param string $type - тип массива данных, например form (если это результат веб-формы) или ticket (если это массив тикета)
	 * @return mixed
	 */
	public function getFieldValue($sourceField, $data, $type = 'form')
	{
		$value = '';

		
		switch ($type)
		{
			case 'form': 
				$value = $data[$sourceField];
			break;
		}
		
		return $value;
	}
	
	public function extendData($data, $additional)
	{
		return array_merge($data, $additional);
	}
	
	/**
	 * Обработчик события модуля веб-формы после успешного добавления результата
	 *
	 * @param int $formId - идентификатор веб-формы
	 * @param int $resultId - идентификатор результата
	 * @return 
	 */
	public static function onAfterResultAdd($formId, $result)
	{

		try
		{

			if (!array_key_exists($formId, self::$fieldsMap['form']))
				return;
			
			
			$fields = self::getResultArray('form', self::$fieldsMap['form'][$formId], $result, self::$additionalValues['form'][$formId]);
			
			/** Отправляем сформированный массив в Б24 */
			$o = new self('leads', $fields);
			$res = $o->send();
			
			//smv($res);
			
		}
		catch (Exception $e) { }
	}
}