@dreamt

При обновлении сделки поля custom_fields в amoCRM происходит регулярный вызов?

По вебхукам от амоСРМ версия api v2 получаю данные по изменениям в сделке

$data = $_POST['leads']['update'][0];

        $id = $data['id'];	
	$date_it = new DateTime();
	$date_new = strtotime($date_it->format('Y-m-d H:i:s'));	
	
	$predoplata = 1;
	$postoplata = 2;
	$oplata_poluchena = 1;
	$sale = 0;
	
			 
	$name = $data["name"]; 	
	$responsible_user_id = $data['responsible_user_id'];
	$pipeline_id = $data['pipeline_id'];
	$status_id = $data['status_id'];
 
	foreach ($data['custom_fields'] as $key => $value) { 
		foreach ($value as $sub_key => $sub_val) { 
			if (is_array($sub_val)) { 
				foreach ($sub_val as $sek_sub_key => $sek_sub_val) { 	
				  if (is_array($sek_sub_val)) { 
							foreach ($sek_sub_val as $k => $v) { 
							 
							   if($data['custom_fields'][$key]['id'] == 440965){
								   global $oplata_poluchena;
								   $oplata_poluchena = intval($v);
							   }
							   if($data['custom_fields'][$key]['id'] == 514667){
								   global $predoplata;
								   $predoplata = intval($v);
							   }
							   if($data['custom_fields'][$key]['id'] == 514669){
								   global $postoplata;
								   $postoplata = intval($v);
							   } 
							} 
						}
				} 
			}
		} 
	} 
	
		
    
    

	if ($oplata_poluchena == 1 && $predoplata != 0 && $postoplata != 0){
		global $sale;
		$sale = $predoplata + $postoplata;
		CostUpdate($id, $date_new, $name, $sale, $predoplata, $postoplata, $oplata_poluchena);
	    
	}

    #Функция CostUpdate выглядит так
    function CostUpdate($id, $date, $name, $sale, $pred, $post, $paid){
			//$this->echor("CostLead", $date.", ID: ".$id, "Name " .$name);
						
			$lead = array(
							'update' => 
									  array (
										    array(
												'id' => $id,
												'updated_at' => $date,											
												'name' => $name,
												'custom_fields' => array(
														array(
															'id'=> 440965,
															'values' => array(
															 array(
																	'value' => $paid
																),
															),
														),
														array(
															'id'=> 514667,
															'values' => array(
															 array(
																	'value' => $pred
																),
															),
														),
														array(
															'id'=> 514669,
															'values' => array(
															 array(
																	'value' => $post
																),
															),
														),	
														array(
															'id'=> 514689,
															'values' => array(
															 array(
																	'value' => $sale
																),
															),
														),	
												),
											   ), 
											),
			);
			/* Теперь подготовим данные, необходимые для запроса к серверу */
			// $subdomain='test'; #Наш аккаунт - поддомен
			#Формируем ссылку для запроса
			$link='https://'.$this->subdomain.'.amocrm.ru/api/v2/leads';
			/* Нам необходимо инициировать запрос к серверу. Воспользуемся библиотекой 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($lead));
			curl_setopt($curl,CURLOPT_HTTPHEADER,array('Content-Type: application/json'));
			curl_setopt($curl,CURLOPT_HEADER,false);
			curl_setopt($curl,CURLOPT_COOKIEFILE, dirname(__FILE__)."/cookie_".$this->USER_LOGIN.".txt"); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
			curl_setopt($curl,CURLOPT_COOKIEJAR, dirname(__FILE__)."/cookie_".$this->USER_LOGIN.".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);
			/* Теперь мы можем обработать ответ, полученный от сервера. Это пример. Вы можете обработать данные своим способом. */
			$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);
			$Response=$Response['_embedded']['items'];
			return $Response;
		}


При таком подходе, который описал выше в сделке амоСРМ запускается процесс рекурсии постоянно прилетают обновления этих полей, но если делаю такой подход ниже

/* используя статичные данные для обновления custom_fields и отключив цикл foreach ниже, обновление происходит успешно без проблем */
        $predoplata = 1;
	$postoplata = 2;
	$oplata_poluchena = 1;
	$sale = 0;

      /* комментирую переборку ассоц.массива
       foreach ($data['custom_fields'] as $key => $value) { 
		foreach ($value as $sub_key => $sub_val) { 
			if (is_array($sub_val)) { 
				foreach ($sub_val as $sek_sub_key => $sek_sub_val) { 	
				  if (is_array($sek_sub_val)) { 
							foreach ($sek_sub_val as $k => $v) { 
							 
							   if($data['custom_fields'][$key]['id'] == 440965){
								   global $oplata_poluchena;
								   $oplata_poluchena = intval($v);
							   }
							   if($data['custom_fields'][$key]['id'] == 514667){
								   global $predoplata;
								   $predoplata = intval($v);
							   }
							   if($data['custom_fields'][$key]['id'] == 514669){
								   global $postoplata;
								   $postoplata = intval($v);
							   } 
							} 
						}
				} 
			}
		} 
	}  */

может кто сталкивался с этим, с чем связана такая работа или что делаю не так ?
  • Вопрос задан
  • 566 просмотров
Решения вопроса 1
094ikis09
@094ikis09
Medium Rare
Вы получаете webhook об обновлении, а затем обновляете сделку и соответственно амо пришлет webhook повторно. Вам при получение webhook надо проверять поля на заполненность и если они и так уже имеют нужное значение то сделку не обновлять

Судя по вашему коду должно получиться нечто такое:
<?php

$data = $_POST['leads']['update'][0];
$data['custom_fields'] = isset($data['custom_fields']) ? $data['custom_fields'] : array();
$id = $data['id'];

$lead_cf = array();
foreach ($data['custom_fields'] as $custom_field) {
    $lead_cf[$custom_field['id']] = $custom_field;
}

if (!isset($lead_cf[514667]) || !isset($lead_cf[514669])) {
    exit();
}

$predoplata = intval($lead_cf[514667]['values'][0]['value']);
$postoplata = intval($lead_cf[514669]['values'][0]['value']);

if ($predoplata === 0 || $postoplata === 0) {
    exit();
}

$sale = $postoplata + $predoplata;
$prev_sale = isset($lead_cf[514689]) ? intval($lead_cf[514689]['values'][0]['value']) : null;

if ($prev_sale !== $sale) {
    $lead = array(
        'update' => array(
            array(
                'id' => $id,
                'updated_at' => time(),
                'custom_fields' => array(
                    array(
                        'id' => 514689,
                        'values' => array(
                            array(
                                'value' => $sale
                            ),
                        ),
                    ),
                ),
            ),
        ),
    );
    // TODO: SEND TO AMO
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы