← Вернуться к списку тем

Чат-Бот-Магазин в Телеграм

Добрый день. Далек от программирования, а бот позволяет решить несколько моих проблем. Но не полностью)))) Есть ряд вопросов.

1. Можно ли к одной БД подключить несколько ботов? Ключевой момент чтобы все платежи шли на один яндекс кошелек, не разводя мусор (товары можно показывать разные из 1 БД это уже выяснил) Нужно буквально 3 бота

2. Как правильно вырезать телефон и адрес? У меня цифровой товар и это лишнее

3. В целом упростить продажу, ни кол-во (товар всегда один по 1шт.) ни подтверждение не требуется, кнопка купить сразу без перехода в корзнину и кнопка назад

Например, хочу вставить кнопку назад в строке 2069 (строку нашел медотом тыка), но она не работает.  Кнопки назад много где не хватает

Спасибо за помощь!

Авторизуйтесь через Telegram, чтобы оставить комментарий.
Откройте по ссылке или QR бот @iMakeBot, нажмите кнопку Старт/Start.
Следуйте инструкциям бота.

  • iMakeBots [1 год назад]

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

    2. Вы можете перескочить сразу на оформление для этого достаточно сменить назначение (action) у кнопки "Оформить". Возможные проблемы при просмотре заказа, так как там есть вывод телефона и адреса, которых при такой логике не будет

    private function drawBasketButton($begin, $basketCount, $item, $sum)
        {
             // ...
             // 4 кнопка оформить заказ
             $buttons[][] = $this->buildInlineKeyBoardButton(
                 '✔ Оформить - ' . $sum . ' руб.', 
                 'setOrder_0' // замените на setReady_0
             );
             // ...
        }

    3. Вы хотите исключить корзину? То есть, чтобы товар сразу попадал в заказ и этот заказ сразу в статус оформлен? Пользователь нажал на Купить, товар попадает в Личный кабинет как оформленный заказ, выходит экран с уведомлением Оформлено и кнопка Вернуться назад?

    Это можно сделать, нужно добавить новый метод обработки кнопки Купить, повторить логику из метода setReady()

  • Дмитрий Бугаев [1 год назад → iMakeBots]

    3. Чтобы при нажатии на товар, была сразу кнопка купить (которая кидает в яндекс деньги и кнопка назад, которая не просто очищает корзину, а позволяет вернуться на шаг назад). 

  • iMakeBots [1 год назад → Дмитрий Бугаев]

    В этом случае корзина тогда вообще не нужна

  • iMakeBots [1 год назад → Дмитрий Бугаев]

    getUrl() - формирует ссылку для кнопки, нажав на которую пользователь перейдет на форму оплаты

    /** Формируем ссылку для оплаты
         * @param $sum
         * @param $user_id
         * @param $order_id
         * @return string
         */
        private function getUrl($sum, $user_id, $order_id)
        {
            return "https://money.yandex.ru/quickpay/confirm.xml?receiver=" . $this->receiver
                . "&quickpay-form=shop&targets=" . urlencode($this->nameShop)
                . "&paymentType=AC&sum=" . $sum
                . "&label=" . $user_id . ":" . $order_id . ":" . md5(rand(0, 1000))
                . "&comment=" . urlencode("Оплата заказа #" . $order_id)
                . "&successURL=" . $this->urlBot;
        }

    buildInlineKeyboardButton() - рисует эту кнопку

    /** Кнопка inline
         * @param $text
         * @param string $callback_data
         * @param string $url
         * @return array
         */
        public function buildInlineKeyboardButton($text, $callback_data = '', $url = '')
        {
            // рисуем кнопке текст
            $replyMarkup = [
                'text' => $text,
            ];
            // пишем одно из обязательных дополнений кнопке
            if ($url != '') {
                $replyMarkup['url'] = $url;
            } elseif ($callback_data != '') {
                $replyMarkup['callback_data'] = $callback_data;
            }
            // возвращаем кнопку
            return $replyMarkup;
        }

    То есть вам надо передать в кнопку готовый адрес для формы оплаты

    private function showUserProduct($data) {
        // ...
        // добавляем кнопку назад
        $buttons[] = [
            $this->buildInlineKeyBoardButton("<< Назад", "showUserCategory_" . $item['parent']),
            // вот эту кнопку надо сменить на кнопку-ссылку
            //$this->buildInlineKeyBoardButton(
            //    "В корзину" . $count, 
            //    "addBasket_" . $item['id'] . '_' . $item['parent']
            //),
            // кнопка - ссылка на форму - не проверял
            $this->buildInlineKeyBoardButton(
                "В корзину", 
                "",
                $this->getUrl($item['price'], $user_id, $item['id'])
            ),
        ];
        // ...
    }

    Подменил - третьим параметром подставил id товара вместо id заказа - это надо учесть при обработке платежа

  • Дмитрий Бугаев [1 год назад]

    А как к одному файлу платежа подключить несколько ботов?

  • iMakeBots [1 год назад → Дмитрий Бугаев]

    Если использовать несколько ботов на один файл обработчик, то необходимо чтобы определялись токены для каждого бота. Так как они уникальные.

    Для этого можно токен зашить в $_GET параметр вебхука. Нужно задать для каждого бота вебхук такого содержания:

    https://your_web_url/index.php?token=your_token_bot

    - где:

    your_web_url - это адрес вашего вебхука - который один для всех
    your_token_bot - токен бота

    И тогда в файле index.php в методе init()

    //////////////////////////////////
        // Запускаем магазин
        //////////////////////////////////
        /** Стартуем  бота
         * @return bool
         */
        public function init()
        {
            // получаем токен бота
            $this->token = $_GET['token'];
            // создаем соединение с базой данных
            
    
        }

    Также добавим токен бота в метод getUrl()

    private function getUrl($sum, $user_id, $order_id)
        {
            // получим id бота 
            $bot_token_params = explode(":", $this->token);
            // ...
            . "&label=" . $user_id . ":" . $order_id . ":" . array_shift($bot_token_params) . ":" . md5(rand(0, 1000))
            // ...

    Для файла ya_success.php 

    /**
     * Class Yandex
     */
    class Yandex
    {
        private $data;
        private $array_tokens = [
           123456 => "токен бота 1"
           123457 => "токен бота 2"
           123458 => "токен бота 3"
        ];
    
        // первичные данные
        private $token;

    Добавим еще один метод

    /** Получаем id бота
         * @return mixed
         */
        private function getIdBot()
        {
            return explode(":", $this->getLabel())[2];
        }

    Изменим метод отправки запроса

    /** Отправляем сообщение
         * @param $fields
         * @return mixed
         */
        public function sendMsg($fields)
        {
            $ch = curl_init('https://api.telegram.org/bot' . $this->array_tokens[$this->getIdBot()] . '/sendMessage');
            // ...
  • Дмитрий Бугаев [1 год назад → iMakeBots]

    А что значит @BotFather задать для каждого бота вебхук я ведь его задаю не в бот фатхер а перейдя а браузере по ссылке

  • iMakeBots [1 год назад → Дмитрий Бугаев]

    Сорри, запамятовал ))) Исправил пост