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

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

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