dotzero / amocrm-php

:sparkles: Удобный и быстрый клиент для работы с API amoCRM
https://dotzero.github.io/amocrm-php/
MIT License
221 stars 109 forks source link

Работа с чатами #99

Open TLTHades opened 4 years ago

TLTHades commented 4 years ago

Подскажите пожалуйста, 3 года назад заказывал хук для публикации уведомлений при переходе на статус воронки. Стандартный SalesBot постил во все чаты подряд и в него нельзя было подставлять название сделки. Поэтому мы заказали как доработку и получили хук, который активируется во воронке на этапах сделки. В хуке функция постинга реализована с помощью

$link='https://amojo.amocrm.ru/chats/'.$amojo_id.'/'.$data_ids['chat_id'].'/messages';
...
curl_setopt($curl,CURLOPT_CUSTOMREQUEST,'POST');
curl_setopt($curl,CURLOPT_POSTFIELDS,json_encode($messages));
curl_setopt($curl,CURLOPT_HTTPHEADER,array('Content-Type: application/json', 'X-Auth-Token: '.$token));

Токен можно получить через консоль с помощью localStorage.getItem("amojo_token") В скрипте мы его получали через $link='https://'.$subdomain.'.amocrm.ru/ajax/v1/chats/session'; но этот способ перестал работать с 21 февраля и теперь мы можем получить amojo_token только вручную.

Что бы решить проблему попробовал переписать весь хук на основе библиотеки, создал интеграцию в CRM, все запросы переписал с помощью инструкции "Пример по шагам", все необходимые данные от CRM получить удалось, но вот отправить сообщение по прежнему не удаётся.

function sendMessage($ids, $data_ids, $contactname='Клиент', $token){
    $messages_array = array(
        '0',
        '1',
        '3',
        '4'
    );
  file_put_contents('log.txt', "GET: ".json_encode($_GET)."\n", FILE_APPEND);
    $messages = array(
        'text' => $messages_array[$_GET['id']],
        'recipient_id'=> $data_ids[0]->amojo_id,
        'crm_contact_id'=> $data_ids[0]->id, // User ID
        'crm_account_id'=> 16323070, // Telegram Bot ID
    );
  file_put_contents('log.txt', "Сообщение: ".json_encode($messages)."\n", FILE_APPEND);
  $amojo_id = '4eb9569a-41b0-4624-86bb-0ec99cfe317c';
    $link='https://amojo.amocrm.ru/chats/'.$amojo_id.'/'.$data_ids['chat_id'].'/messages';
  $headers = [
    'Authorization: Bearer ' . $token
  ];
    $curl=curl_init();
  curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);
  curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-oAuth-client/1.0');
  curl_setopt($curl,CURLOPT_URL, $link);
    curl_setopt($curl,CURLOPT_CUSTOMREQUEST,'POST');
    curl_setopt($curl,CURLOPT_POSTFIELDS,json_encode($messages));
  curl_setopt($curl,CURLOPT_HTTPHEADER, $headers);
  curl_setopt($curl,CURLOPT_HEADER, false);
  curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, 1);
  curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, 2);
  $out = curl_exec($curl);
  $code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
  curl_close($curl);
  $code = (int)$code;
  $errors = [
    400 => 'Bad request',
    401 => 'Unauthorized',
    403 => 'Forbidden',
    404 => 'Not found',
    500 => 'Internal server error',
    502 => 'Bad gateway',
    503 => 'Service unavailable',
  ];
  try
  {
    if ($code < 200 && $code > 204) {
      throw new Exception(isset($errors[$code]) ? $errors[$code] : 'Undefined error', $code);
      file_put_contents('log.txt', "code: ".$code."\n", FILE_APPEND);
    }
  }
  catch(\Exception $e)
  {
    die('Ошибка: ' . $e->getMessage() . PHP_EOL . 'Код ошибки: ' . $e->getCode());
    file_put_contents('log.txt', "Ошибка: ".$e."\n", FILE_APPEND);
  }
    $Response=json_decode($out,true);
  file_put_contents('log.txt', "Response: ".json_encode($Response)."\n", FILE_APPEND);
}
TLTHades commented 4 years ago

Если снова добавить amojo_token и заменить метод авторизации, то всё работает

$curl=curl_init();
  $token = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
  curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);
  curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-oAuth-client/1.0');
  curl_setopt($curl,CURLOPT_URL, $link);
    curl_setopt($curl,CURLOPT_CUSTOMREQUEST,'POST');
    curl_setopt($curl,CURLOPT_POSTFIELDS,json_encode($messages));
curl_setopt($curl,CURLOPT_HTTPHEADER,array('Content-Type: application/json', 'X-Auth-Token: '.$token));
  curl_setopt($curl,CURLOPT_HEADER, false);
  curl_setopt($curl,CURLOPT_SSL_VERIFYPEER, 1);
  curl_setopt($curl,CURLOPT_SSL_VERIFYHOST, 2);

Помогите пожалуйста разобраться

vladkolotvin commented 6 months ago

@TLTHades

Помогите пожалуйста разобраться

получилось разобраться?