Андрей Создатель
Андрей Создатель

Входящий вебхук

01.05.2021
02:58
Создал входящий вебхук 

В настройках сайта указал данные


Департамент тоже прописал


Код обработчика тоже нормальный:

class Service_Bitrix
{
    const VOLKOV_ANTON_BITRIX_ID = 11;
    const VOLKOV_ANTON_ID = 9;

    private function doRequest($method, $params = null)
    {
        require_once 'Zend/Http/Client.php';
        require_once 'Zend/Http/Cookie.php';

        $key          = config('bitrix.webhook_key');
        $company_name = config('bitrix.company_name');
        $hookid       = config('bitrix.hook_id');
        $url          = "https://$company_name.bitrix24.ru/rest/$hookid/$key/$method/";

        $http_client = new Zend_Http_Client($url, [
            'strictredirects' => true,
            'timeout'         => 30,
            'keepalive'       => true,
        ]);

        if ($params) {
            $http_client->setParameterPost($params);
        }

        $request = $http_client->request('POST');
        $body    = json_decode($request->getBody());
        if ($request->getStatus() == 200) {
            return $body;
        } else {
            if ($body->error == 'QUERY_LIMIT_EXCEEDED') {
                sleep(1);
            }
            echo $method . ' ' . $body->error_description . '
';
            var_dump($params);
            var_dump($request->getBody());
            return false;
        }
    }

    /**
     * Вернуть сделки
     */
    public function getDeals()
    {
        $result = $this->doRequest('crm.deal.list');
        var_dump($result);
    }

    /**
     * Вернуть продукты
     */
    public function getProducts()
    {
        $result = $this->doRequest('crm.product.list');
        var_dump($result);
    }

    /**
     * Добаить категорию
     * @param array $data
     * @return boolean
     */
    public function addCategory($data)
    {
        $result = $this->doRequest('crm.productsection.add', [
            'fields' => [
                'NAME'       => $data['name'],
                'SECTION_ID' => $data['parent_id'],
            ],
        ]);
        if ($result) {
            $bitrix_id = (int)$result->result;
            Mel_db::update('category', ['bitrix_id' => $bitrix_id], ['id' => $data['id']]);
            return $bitrix_id;
        } else {
            return false;
        }
    }

    /**
     * Добавить категории
     */
    public function addCategories()
    {
        $categories = Mel_Db::select('category', 'id,name,parent_id', 'bitrix_id is null', 'parent_id,id');
        $id_trans   = Mel_db::getPair("SELECT id,bitrix_id FROM category");
        foreach ($categories as $category) {
            if ($category['parent_id'] and !isset($id_trans[$category['parent_id']])) {
                continue;
            }
            $bitrix_id                 = $this->addCategory([
                'id'        => $category['id'],
                'name'      => $category['name'],
                'parent_id' => $category['parent_id'] ? $id_trans[$category['parent_id']] : 0,
            ]);
            $id_trans[$category['id']] = $bitrix_id;
            sleep(1);
        }
    }

    /**
     * Вернуть категории
     */
    public function getCategories()
    {
        $result = $this->doRequest('crm.productsection.list');
        var_dump($result);
    }

    /**
     * Вернуть контакт
     * @param string $user_email
     */
    public function getContactId($user_email)
    {
        $result = $this->doRequest('crm.contact.list', [
            'order'  => ["DATE_CREATE" => "ASC"],
            'filter' => ["TYPE_ID" => "CLIENT", "EMAIL" => $user_email],
            'select' => ["ID"],
        ]);
        if ($result->result) {
            return $result->result[0]->ID;
        } else {
            return false;
        }
    }

    /**
     * Добавить контакт
     * @param array $contact_data
     * @param int $bitrix_manager_id
     * @return boolean
     */
    public function addContact(array $contact_data, int $bitrix_manager_id=null)
    {
        $result = $this->doRequest('crm.contact.add', [
            'fields' => [
                "LAST_NAME"      => $contact_data['user_surname'],
                "NAME"           => $contact_data['user_firstname'],
                "SECOND_NAME"    => $contact_data['user_patronymic'],
                "ASSIGNED_BY_ID" => $bitrix_manager_id,
                "OPENED"         => "Y",
                "TYPE_ID"        => "CLIENT",
                "SOURCE_ID"      => "SELF",
                "EMAIL"          => [
                    [
                        "VALUE"      => $contact_data['user_email'],
                        "VALUE_TYPE" => "HOME",
                    ],
                ],
                "ADDRESS"        => $contact_data['delivery_address'],
                "PHONE"          => [
                    [
                        "VALUE"      => $contact_data['user_phone'],
                        "VALUE_TYPE" => "WORK",
                    ],
                ],
            ],
            'params' => ["REGISTER_SONET_EVENT" => "N"],
        ]);
        if ($result) {
            return (int)$result->result;
        } else {
            return false;
        }
    }

    /**
     * Обновить контакт в битриксе
     * @param $bitrix_contact_id
     * @param array $data
     * @param int $bitrix_manager_id
     * @return false|int
     */
    public function updateContact($bitrix_contact_id, array $data, int $bitrix_manager_id)
    {
        $request_params = [
            'id'     => $bitrix_contact_id,
            'fields' => [
                "LAST_NAME"   => $data['user_surname'],
                "NAME"        => $data['user_firstname'],
                "SECOND_NAME" => $data['user_patronymic'],
                "OPENED"      => "Y",
                "ASSIGNED_BY_ID" => $bitrix_manager_id,
                "TYPE_ID"     => "CLIENT",
                "SOURCE_ID"   => "SELF",
                "EMAIL"       => [
                    [
                        "VALUE"      => $data['user_email'],
                        "VALUE_TYPE" => "HOME",
                    ],
                ],
                "PHONE"       => [
                    [
                        "VALUE"      => $data['user_phone'],
                        "VALUE_TYPE" => "WORK",
                    ],
                ],
            ],
            'params' => ["REGISTER_SONET_EVENT" => "N"],
        ];
        if (isset($data['delivery_address']) and $data['delivery_address']) {
            $request_params['fields']['ADDRESS'] = $data['delivery_address'];
        }
        $result = $this->doRequest('crm.contact.update', $request_params);
        if ($result) {
            return (int)$result->result;
        } else {
            return false;
        }
    }

    /**
     * Добавить продукт
     * @param Model_Order_Item $item
     * @return boolean
     */
    public function addProductItem(Model_Order_Item $item)
    {
        include_once 'simple_html_dom.php';
        $poster = $item->poster;

        $product_name        = 'арт. ' . $poster->getArticul() . ', ' . $poster->getName();
        $product_info_arr    = [];
        $poster_view         = View::factory('content/studio/poster/info');
        $poster_view->poster = $poster;
        $dom                 = str_get_html($poster_view);
        foreach ($dom->find('.rows .row') as $row) {
            $rub       = '';
            $value_dom = $row->find('.value');
            $label_dom = $row->find('.label');

            if ($value_dom and isset($value_dom[0]) and $value_dom[0]->getAttribute('data-price')) {
                $rub = ' руб.';
            }
            $d = [];

            if ($label_dom and isset($label_dom[0])) {
                $d[] = trim($label_dom[0]->outertext());
            }

            if ($value_dom and isset($value_dom[0])) {
                $d[] = '' . trim($value_dom[0]->outertext()) . $rub . '';
            }
            $product_info_arr[] = preg_replace('/\s+/', ' ', implode("\n", $d));
        }
        $product_info = "
               
                    https://tvoyposter.ru&;quot; . $poster->getShareUrl() . "' target='_blank'>
                        " . $product_name . "
                   
                ";

        if ($poster instanceof Model_Poster and isset($poster->image->ext_link) and $poster->image->ext_link) {
        }
        $product_info .= "
                Количество: {$item->amount} шт.
               
" .
            implode("
", $product_info_arr);
        return $product_info;
    }

    /**
     * Добавить заказ
     * @param Model_Order $order
     * @return bool
     * @throws Exception_500
     */
    public function addOrder(Model_Order $order)
    {
        if (!$order->bitrix_manager_id) {
            $this->attachManager($order);
        }
        $comment = [];

        //данные для JSON
        $order_json = [
            'origin'           => 'tvoyposter',
            'number'           => $order->order_id,
            'datetime'         => date('Y-m-dTH:i:s+03:00', $order->add_time),
            'comments'         => $order->comments,
            'discount_percent' => $order->getDiscount(),
            'discount_value'   => $order->getDiscountValue($order->getDiscount()),
            'total'            => (int)$order->sum_final,

            'delivery'     => [
                'type'    => $order->delivery->name,
                'address' => $order->delivery_address,
            ],
            'payment_type' => $order->payment->name,
            'contact'      => [
                'name'  => $order->getUserName(),
                'phone' => $order->user_phone,
                'email' => $order->user_email,
            ],
            'products'     => [],
        ];

        $items_proccess  = 0;
        $items_sum_total = 0;
        /** @var Model_Order_Item $item */
        foreach ($order->items as $item) {
            $product_data = [
                'amount' => $item->amount,
                'price'  => $item->price,
                'sum'    => $item->sum,
                'type'   => $item->type,
                'name'   => $item->poster->getName(),
                'width'  => $item->poster->getFullWidth(),
                'height' => $item->poster->getFullHeight(),
                'params' => $item->poster->getParamsFor1C(),
            ];
            if ($item->poster instanceof Model_Poster
                and isset($item->poster->image->ext_link)
                and $item->poster->image->ext_link) {
                $product_data['ext_link'] = $item->poster->image->ext_link;
            }
            $order_json['products'][] = $product_data;
            $items_sum_total          += $item->sum;
            $comment[]                = $this->addProductItem($item);
            $items_proccess++;
        }

        $order_item_count = (int)Mel_Db::getOne("SELECT count(*) as c FROM order_item where order_id={$order->id}");
        if ($items_proccess != $order_item_count) {
            Helper_Log::log('bitrix', "$order->id количество не совпадает $order_item_count / $items_proccess");
            return false;
        }

        Helper_Log::log('bitrix', $order->id . ' ' . count($order->getItems()) . '/' . $items_proccess);

        $comment = $order->comments . '
' .
            '
  1. ' .
            implode('
  • ', $comment) .
  •             '';

            $add_comment = '';
            if ($order->used_points) {
                $add_comment .= 'Использовано баллов : ' . $order->used_points;
            }
            $discount_value = $order->getDiscountValue($order->getDiscount());
            if ($discount_value) {
                $add_comment .= '
    Размер скидки: ' . $discount_value . ' руб';
            }

            $STANDART_TIME_ID = 3; //стандартное время изготовления
            if ($order->time and $order->time->id !== $STANDART_TIME_ID) {
                $add_comment .= '
    ' . $order->time->name . ' ' . $order->time_price . ' руб';
            }

            if ($add_comment) {
                $comment .= '
    ' . $add_comment;
            }

            //получаем ID контакта
            $contact_id = $this->getContactId($order->user_email);
            if ($contact_id) {
                $this->updateContact($contact_id, $order->getParams(), $order->bitrix_manager_id);
            } else {
                $contact_id = $this->addContact($order->getParams(), $order->bitrix_manager_id);
            }

            $pdf_rand_path = uniqid() . '.pdf';
            $command       = '/usr/bin/wkhtmltopdf https://tvoyposter.ru/order/list_products?order_id=' . $order->id . ' ' . realpath(Treebika::docroot()) . '/temp/pdf/' . $pdf_rand_path;
            exec(escapeshellcmd($command), $output, $exit_code);
            $pdf_link = "https://tvoyposter.ru/temp/pdf/$pdf_rand_path'>PDF
    ";


            $files_list = '';
            if ($order->files) {
                $files = unserialize($order->files);
                if ($files and is_array($files)) {
                    $files_list = 'Загруженные файлы:
      ';
                    foreach ($files as $file) {
                        $files_list .= "
  • $file
  • ";
                    }
                    $files_list .= '
    ';
                }
            }

            $comment = $pdf_link . $files_list . $comment;

            $result = $this->doRequest('crm.deal.add', [
                'fields' => [
                    "ASSIGNED_BY_ID"    => $order->bitrix_manager_id,
                    "TITLE"             => "Заказ №" . $order->order_id,
                    "TYPE_ID"           => "GOODS",
                    "STAGE_ID"          => "NEW",
                    "CONTACT_ID"        => $contact_id,
                    "OPENED"            => "Y",
                    "PROBABILITY"       => 100,
                    "CURRENCY_ID"       => "RUB",
                    "OPPORTUNITY"       => $order->sum_final,
                    "BEGINDATE"         => date('Y-m-dTH:i:s+03:00', $order->add_time),
                    "CLOSEDATE"         => date('Y-m-dTH:i:s+03:00', $order->add_time),
                    "COMMENTS"          => $comment,
                    //скидка
                    "UF_CRM_1495396920" => $order->getDiscount(),
                    //доставка
                    "UF_CRM_1495396944" => $order->delivery->name,
                    //итого
                    "UF_CRM_1496345886" => number_format($order->getFinalPrice(true, $order->getDiscount()), 0, '.', ' '),
                    "UF_CRM_1507733012" => $order->delivery_address,
                    "UF_CRM_1507893389" => json_encode($order_json),
                    "UF_CRM_1509029611" => $order->time ? $order->time->name : '',
                    "UF_CRM_1510661912" => $order->delivery_cdek,
                    "UF_CRM_1533293178" => date('Y-m-dTH:i:s+03:00', $order->add_time),
                ],
                'params' => ["REGISTER_SONET_EVENT" => "N"],
            ]);

            $bitrix_order_id = (int)$result->result;

            $order->bitrix_sended = 1;
            $order->save();
            $this->sendMessage($order->bitrix_manager_id,
                'Новый https://tvoy-portret.bitrix24.ru/crm/deal/show/' . $bitrix_order_id . '/">заказ №' . $order->order_id . '');
            return true;
        }

        /**
         * Добавить заявку с сайта в заказы
         * @param $data
         * @return bool
         */
        public function addRequestFromSite($data)
        {
            $contact_id = $this->getContactId($data['user_email']);
            if (!$contact_id) {
                $contact_id = $this->addContact($data);
            }

            //определяем ID ответственного менеджера в Битриксе
            //для заказов "Вызов дизайнера" или "Заказ визуализации" всегда ставим ответственного Волкова Антона
            if (in_array($data['type'], ['Вызов дизайнера', 'Заказ визуализации'])) {
                $manager_bitrix_id = Service_Bitrix::VOLKOV_ANTON_BITRIX_ID;
            } else {
                $manager_bitrix_id = 0;
                $managers          = $this->getSavedManagers();
                if (!$managers or count($managers) == 0) {
                    return false;
                }

                $request_last_manager_id = Helper_Params::get('request_last_manager_id'); //ID последнего менеджера
                $request_last_manager_id = $request_last_manager_id ? $request_last_manager_id : 0;
                foreach ($managers as $n => $manager) {
                    if ($manager->bitrix_id > $request_last_manager_id) {
                        $manager_bitrix_id = $manager->bitrix_id;
                        break;
                    }
                }
                if (!$manager_bitrix_id) {
                    $manager_bitrix_id = $managers[0]->bitrix_id;
                }
                Helper_Params::save('request_last_manager_id', $manager_bitrix_id);
            }

            $result = $this->doRequest('crm.deal.add', [
                'fields' => [
                    "ASSIGNED_BY_ID" => $manager_bitrix_id,
                    "TITLE"          => $data['type'],
                    "TYPE_ID"        => "GOODS",
                    "STAGE_ID"       => "NEW",
                    "CONTACT_ID"     => $contact_id,
                    "OPENED"         => "Y",
                    "PROBABILITY"    => 100,
                    "CURRENCY_ID"    => "RUB",
                    "BEGINDATE"      => date('Y-m-dTH:i:s+03:00'),
                    "COMMENTS"       => $data['commentary'],
                ],
                'params' => ["REGISTER_SONET_EVENT" => "N"],
            ]);
        }

        public function checkOrder()
        {

        }

        /**
         * Вернуть заказ
         * @param int $order_id
         */
        public function getOrder($order_id)
        {
            $result = $this->doRequest('crm.deal.get', ['id' => $order_id]);
            var_dump($result);
        }

        /**
         * Добавить лид
         * type - тип лида
         * name - имя
         * commentary - комментарий
         * email - емейл
         * phone - телефон
         * address - адрес
         * @param array $data
         */
        public function addLead($data, $manager_bitrix_id = 0)
        {
            if (!$manager_bitrix_id) {
                $managers = $this->getSavedManagers();
            }
            $result = $this->doRequest('crm.lead.add', [
                'fields' => [
                    'ASSIGNED_BY_ID'     => $manager_bitrix_id,
                    'TITLE'              => $data['type'],
                    'NAME'               => $data['name'],
                    'SOURCE_ID'          => 'WEB',
                    'SOURCE_DESCRIPTION' => $data['commentary'],
                    'COMMENTS'           => $data['commentary'],
                    "EMAIL"              => [
                        [
                            "VALUE"      => $data['email'],
                            "VALUE_TYPE" => "HOME",
                        ],
                    ],
                    "ADDRESS"            => $data['address'],
                    "PHONE"              => [
                        [
                            "VALUE"      => $data['phone'],
                            "VALUE_TYPE" => "WORK",
                        ],
                    ],
                ],
                'params' => ["REGISTER_SONET_EVENT" => "N"],
            ]);
        }

        /**
         * Вернуть лида
         * @param mixed $lead_id
         */
        public function getLead($lead_id)
        {
            $result = $this->doRequest('crm.lead.get', ['id' => $lead_id]);
            var_dump($result);
        }

        /**
         * Обновить сохраненных менеджеров
         * @return mixed
         * @throws Exception_500
         */
        public function updateManagers()
        {
            $manager_departament_id = config('bitrix.manager_departament_id');
            $result                 = $this->doRequest('user.get', [
                'FILTER' => [
                    'UF_DEPARTMENT' => $manager_departament_id,
                    'ACTIVE'        => 1,
                ],
            ]);
            $managers_info          = [];
            foreach ($result->result as $m) {
                if ($m->ID == 38) {
                    continue;
                }
                $managers_info[$m->ID] = $m->NAME . ' ' . $m->LAST_NAME;
                $stored_manager        = new Model_Manager(['bitrix_id' => $m->ID]);
                if ($stored_manager->id) {
                    $stored_manager->email = $m->EMAIL;
                    $stored_manager->save();
                } else {
                    $new_manager            = new Model_Manager();
                    $new_manager->name      = $m->NAME;
                    $new_manager->surname   = $m->LAST_NAME;
                    $new_manager->email     = $m->EMAIL;
                    $new_manager->bitrix_id = $m->ID;
                    $new_manager->hidden    = 0;
                    $new_manager->save();
                }
            }
            Helper_Params::save('manager_info', $managers_info);
            return $managers_info;
        }

        /**
         * Вернуть массив сохраненных менеджеров
         * @return array
         */
        public function getSavedManagers()
        {
            return Model_Manager::get(Model_Manager::class, ['hidden' => 0], 'id');
        }

        public function getTimeManStatus($user_id)
        {
            $result = $this->doRequest('timeman.status', [
                'USER_ID' => $user_id,
            ]);
            var_dump($result);
        }

        public function sendMessage($user_bitrix_id, $message)
        {
            $result = $this->doRequest('im.notify', [
                'to'      => $user_bitrix_id,
                'message' => $message,
                'type'    => 'SYSTEM',
            ]);
        }

        /**
         * Присоединить к заказу менеджера
         * @param Model_Order $order
         * @return Model_Order|void
         * @throws Exception_500
         */
        public function attachManager(Model_Order $order)
        {
            $manager                  = $this->getNextManager($order->sum_total);
            $order->manager_id        = $manager->id;
            $order->bitrix_manager_id = $manager->bitrix_id;
            $order->save();
            return $order;
        }

        /**
         * Вернуть ID ответственного менеджера
         * @param int $sum
         * @return void|Model_Manager
         */
        public function getNextManager($sum)
        {
            $managers = $this->getSavedManagers();
            if (!$managers) {
                return;
            }

            if ($sum < 3000) {
                $range = 'sum_total < 3000';
            } else {
                if ($sum < 10000) {
                    $range = 'sum_total >= 3000 and sum_total < 10000';
                } else {
                    $range = 'sum_total >= 10000';
                }
            }

            $last_in_range_order_managers_id = Mel_Db::getColumn("
                SELECT manager_id 
                FROM `order` 
                WHERE user_name !='AUTOTEST' AND $range AND manager_id IS NOT NULL
                ORDER BY id DESC
                LIMIT 0, " . count($managers) * 2);

            $found = false;


            if ($last_in_range_order_managers_id) {
                $last_in_range_order_manager_id = $last_in_range_order_managers_id[0];

                foreach ($managers as $manager) {
                    if ($manager->id > $last_in_range_order_manager_id) {
                        //Волков
                        if ($manager->id == self::VOLKOV_ANTON_ID) {
                            //убираем с Волкова распределение заказов дороже 15000 руб.
                            if ($sum > 15000) {
                                continue;
                            }
                            //так же Волков должен "пропускать" один круг распределения
                            for ($i = 0; $i < count($last_in_range_order_managers_id); $i++) {
                                if ($last_in_range_order_managers_id[$i] == self::VOLKOV_ANTON_ID and $i < count($managers)) {
                                    continue 2;
                                }
                            }
                        }

                        $found = true;
                        break;
                    }
                }
            }
            if (!$found) {
                $manager = array_shift($managers);
            }

            return $manager;
        }

    }

    Но данные заказа с сайта все равно в Битрикс24 не уходят, можете подсказать где ту косяк?

    Для персональной подписи, участник не представляет организацию.
    Нет комментариев
    Предыдущие комментарии
    для добавления комментариев необходимо авторизоваться

    Горячие темы форума

    Форум

    Как добавить поле в контакты

    CRM
    Анастасия 12.01.2020 9 26.05.202010:55
    Форум

    Права доступа и список ролей

    CRM
    Даниил Шепелев 29.04.2016 5 01.09.202013:11
    Форум

    Отправка писем с файлами из БП

    CRM
    Артём Бредихин 29.04.2016 4 19.02.201817:47
    Форум

    Как убрать лишние поля

    CRM
    Роман Алашеев 28.04.2016 4 19.02.201817:44