По вебхукам от амоСРМ версия 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);
}
}
}
}
}
}
} */
может кто сталкивался с этим, с чем связана такая работа или что делаю не так ?