К содержанию

[msTelegram] Уведомления о заказе в telegram

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

Сделано на основе гайда от Михаила.
Как получить токен, узнать айди чата и тд так же отлично расписано в гайде.




Плагин вешается на событие msOnCreateOrder.

if($modx->event->name != 'msOnCreateOrder') return;

$token = '<token>';
$contacts = $modx->getObject('msOrderAddress', array('id'=> $msOrder->address));
$_products = $msOrder->getMany('Products');

// Список получателей, у меня их много, если будет один можно обойтись одной переменной и убрать foreach
$recipients = array(
    '<chat id>'
);

// Список товаров в заказе
$i = 0;
$products = '';
foreach ($_products as $product) {
    $i++;
    $products .= "{$i}. {$product->name} ({$product->count} шт.)";
}

// Текст сообщения
$message = "
Новый заказ #{$msOrder->num}
на сумму {$msOrder->cost} р.
-----
{$products}
-----
Телефон: {$contacts->phone}";

$message = urlencode($message);
foreach($recipients as $id){
    $url = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$id}&text={$message}";
    $ch = curl_init();
    curl_setopt_array($ch, array(CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true));
    $result = curl_exec($ch);
    curl_close($ch);
}
p.s. fopen заменил на curl т.к. на некоторых устройствах получал сообщение в виде urlencode().
but1head
but1head
18 сентября 2016, 23:26
modx.pro
14 244
Реклама

Комментарии: 72

but1head
but1head Проверенный
20 сентября 2016, 19:08
Опубликовали в modstore
    Александр
    Александр Старожил
    21 сентября 2016, 03:04
    Спасибо! пригодится)
    Александр
    Александр Старожил
    26 сентября 2016, 14:12
    Добрый день.
    Помогите настроить плагин на работу с Shopkeeper 3? Кто нибудь знает как это сделать?
      Константин
      Константин Старожил
      02 июля 2017, 12:44
      День добрый.
      Подскажите почему может не отображаться почта в сообщении, которую указывает клиент?
      // Текст сообщения
      $message = "
      Новый заказ #{$msOrder->num}
      на сумму {$msOrder->cost} р.
      -----
      {$products}
      -----
      Клиент: {$contacts->receiver}
      -----
      Телефон: {$contacts->phone}
      -----
      Почта: {$contacts->email}
      -----
      Комментарий: {$contacts->comment}";
        Володя
        Володя Эксперт
        02 июля 2017, 12:51
        если посмотреть сюда github.com/bezumkin/miniShop2/blob/master/core/components/minishop2/model/schema/minishop2.mysql.schema.xml#L337-L352
        то видно что там нет поля email.

        нужно получить профиль пользователя и оттуда взять email
        $profile = $msOrder->getOne('UserProfile')
        {$profile->email}
          Константин
          Константин Старожил
          02 июля 2017, 13:11
          Теперь знаю куда смотреть) Спасибо за помощь
            Алексей
            Алексей Старожил
            17 октября 2020, 22:40
            А как получить варианты доставки и оплаты?
            Подскажите пожалуйста, что-то не разберусь.
              Александр
              Александр Старожил
              18 ноября 2020, 12:17
              if ($msOrder->delivery == '1') {
                  $deli = "Способ доставки: Самовывоз";
                  } else {
                    
                 $deli = "Способ доставки: Доставка";
              }
              
              if ($msOrder->payment == '1') {
                  $pay = "Способ оплаты: Оплата в магазине";
                  } else {
                      
                 $pay = "Способ оплаты: Онлайн картой";
              }
              Сделал так, кривовато конечно, но логика такая — подстроите под себя
                Денис Мижеревич
                21 апреля 2021, 19:16
                Можете подсказать, как правильно это логику написать? Где она пишется?

                Вот, если сюда эту логику добавить, то как это сделать?
                // Текст сообщения
                $message = "
                Новый заказ #{$msOrder->num}
                на сумму {$msOrder->cost} р.
                Оплата: {$msOrder->payment}
                — {$products}
                — Имя: {$contacts->receiver}
                Телефон: {$contacts->phone}
                Email: {$profile->email}
                Улица: {$contacts->street}
                Дом: {$contacts->building}
                Квартира: {$contacts->room}
                Комментарий: {$contacts->comment}";
                  Sergey
                  Sergey Старожил
                  21 апреля 2021, 19:20
                  if ($msOrder->delivery == '1') {
                      $deli = 'Способ доставки: Самовывоз';
                      } else if ($msOrder->delivery == '2') {
                          $deli = 'Курьерская доставка Деливери';
                      } else {
                     $deli = 'Самовывоз из Новой Почты';
                  }
                  
                  if ($msOrder->payment == '2') {
                      $pay = 'Способ оплаты: Оплата на карту ПриватБанка';
                      } else {
                     $pay = 'Способ оплаты: Оплата при получении';
                  }
                  // Текст сообщения
                  $message = "
                  Новый заказ #{$msOrder->num}
                  на сумму {$msOrder->cost} грн.
                  --------------------------------------
                  {$pay}
                  {$deli}
                    Sergey
                    Sergey Старожил
                    21 апреля 2021, 19:25
                    $msOrder->delivery == '1' — смотрите в настройках минишопа

                    https://prnt.sc/11t6d3m
                      Денис Мижеревич
                      21 апреля 2021, 20:05
                      Огромнейшее спасибо. Получилось, все работает
                Александр
                Александр Старожил
                30 ноября 2020, 11:12
                А изображение продукта можно как-то получить? Не подскажете?
              Александр
              Александр Старожил
              19 июня 2018, 08:05
              Приветствую! Плагин работает отлично! Не подскажете, как добавить адрес доставки?
                Александр
                Александр Старожил
                23 июля 2018, 12:25
                Вопрос про добавление адреса доставки решен.
                  Александр
                  Александр Старожил
                  18 ноября 2020, 11:40
                  Добрый день, а не поделитесь решением?
                    Александр
                    Александр Старожил
                    18 ноября 2020, 11:50
                    // Текст сообщения
                    $message = "
                    Новый заказ #{$msOrder->num}
                    на сумму {$msOrder->cost} р.
                    Оплата: {$msOrder->payment}
                    -----
                    {$products}
                    -----
                    Имя: {$contacts->receiver}
                    Телефон: {$contacts->phone}
                    Email: {$profile->email}
                    Улица: {$contacts->street}
                    Дом: {$contacts->building}
                    Квартира: {$contacts->room}
                    Комментарий: {$contacts->comment}";
                      Александр
                      Александр Старожил
                      18 ноября 2020, 11:52
                      Простите, что отвлёк, не туда комментарий оставил. Искал варианты оплаты и доставки. Спасибо!
                Sergey
                Sergey Старожил
                10 сентября 2019, 09:39
                Как изменить текст сообщения? Создал сниппет, хотел изменить текст сообщения, сохраняю, но в телеграмму приходит старый
                  Ishvan
                  Ishvan Старожил
                  11 сентября 2019, 11:17
                    Sergey
                    Sergey Старожил
                    11 сентября 2019, 11:21
                    Спасибо большое
                  Rodion
                  Rodion Старожил
                  21 октября 2019, 12:47
                  Добрый день! Все настроил по инструкции. Но при заказе отправка в телегу не идет.
                  Как можно отладить? и проверить?
                    Влад
                    Влад Старожил
                    30 декабря 2020, 13:28
                    Добрый день! Может кто подсказать, как еще достать артикул товара?
                    $product->article
                    не проходит
                    При этом
                    $product->product_id
                    работает, но это не является решением
                      Николай Савин
                      Николай Савин Администратор
                      30 декабря 2020, 15:03
                      $product->Product->get('article')
                        Влад
                        Влад Старожил
                        30 декабря 2020, 15:57
                        Был близок пробуя что-то подобное :D
                        $product->get('article')
                        Спасибо за Ваш ответ, Николай! Всё работает
                      PlanB
                      PlanB Старожил
                      21 апреля 2021, 22:55
                      Всем привет!
                      Может кто-нибудь подскажет, как можно в телеграм отправлять в том числе опции товара, которые заданы через msOptionsPrice2?
                        Sergey
                        Sergey Старожил
                        22 апреля 2021, 20:06
                        Добрый вечер! Нужна помощь.

                        Как получить значение (https://prnt.sc/11vqy4a) size из заказа в формате:Размер: AirPods 1/2

                        Пробовал {$product['size']}, {$product->size}, $product->Product->get('size')} ничего не работает (

                        <?php
                        if($modx->event->name != 'msOnCreateOrder') return;
                        
                        $token = $modx->getOption('mstelegram_token', null, false);
                        $recipients = explode(',', $modx->getOption('mstelegram_recipients', null, ''));
                        
                        $contacts = $modx->getObject('msOrderAddress', array('id'=> $msOrder->address));
                        $_products = $msOrder->getMany('Products');
                        $profile = $msOrder->getOne('UserProfile');
                        $properties = $msOrder->get('properties');
                        
                        // Список товаров в заказе
                        $i = 0;
                        $products = '';
                        foreach ($_products as $product) {
                            $i++;
                            $products .= "{$i}. {$product->name} ({$product->count} шт.) - {$product->Product->get('price')} грн";
                        }
                        
                        if ($msOrder->delivery == '1') {
                            $deli = 'Способ доставки: Самовывоз';
                            } else if ($msOrder->delivery == '2') {
                                $deli = 'Курьерская доставка Деливери';
                            } else {
                           $deli = 'Самовывоз из Новой Почты';
                        }
                        
                        if ($msOrder->payment == '2') {
                            $pay = 'Способ оплаты: Оплата на карту ПриватБанка';
                            } else {
                           $pay = 'Способ оплаты: Оплата при получении';
                        }
                        // Текст сообщения
                        $message = "
                        Новый заказ #{$msOrder->num}
                        на сумму {$msOrder->cost} грн.
                        --------------------------------------
                        {$pay}
                        {$deli}
                        --------------------------------------
                        Данные доставки:
                        
                        Имя: {$contacts->receiver}
                        Телефон: {$contacts->phone}
                        --------------------------------------
                        Товары:
                        
                        {$products}
                        --------------------------------------
                        Email: {$profile->email}";
                        
                        
                        
                        $message = urlencode($message);
                        foreach($recipients as $id){
                        	$id = trim($id);
                        	if(!$id) continue;
                            $url = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$id}&text={$message}";
                            $ch = curl_init();
                            curl_setopt_array($ch, array(CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true));
                            $result = curl_exec($ch);
                            curl_close($ch);
                        }
                          Николай Савин
                          Николай Савин Администратор
                          22 апреля 2021, 21:04
                          В вашем случае size из заказа нужно вытаскивать примерно так
                          $options = $product->get('options');
                          $size = $options['size'];
                            Sergey
                            Sergey Старожил
                            22 апреля 2021, 21:54
                            Спасибо, работает ))

                            Еще не подскажете пожалуйста как получить и отправить доп. значения из заказа минишоп. Поля созданы как тут https://modx.pro/solutions/10040
                              Николай Савин
                              Николай Савин Администратор
                              23 апреля 2021, 08:12
                              Ровно так же как и родные поля таблицы адреса, через get
                              $properties = $msOrder->get('properties');
                                Sergey
                                Sergey Старожил
                                23 апреля 2021, 12:13
                                У меня в msOrder поле для самовывоза
                                select id=«delivery_shop» name=«extfld_delivery_shop» value="{$form['extfld_delivery_shop']}" class=«form-control»

                                Нужно вот так?
                                $properties = $msOrder->get('properties');
                                $delshop = $properties['extfld_delivery_shop'];


                                И просто вывод {$delshop} )?
                                  Николай Савин
                                  Николай Савин Администратор
                                  23 апреля 2021, 12:15
                                  Да нет же
                                  $extfld_delivery_shop = $msOrder->get('extfld_delivery_shop');
                                    Sergey
                                    Sergey Старожил
                                    23 апреля 2021, 12:17
                                    Спасибо огромное, чет затупил )))
                                      Николай Савин
                                      Николай Савин Администратор
                                      23 апреля 2021, 12:19
                                      Нет, я тоже затупил. Неверно подсказал. У вас данные хранятся не в заказе, а в адресе, это другая таблица. Нужно добавить ссылку.
                                      $extfld_delivery_shop = $msOrder->Address->get('extfld_delivery_shop');
                                        Sergey
                                        Sergey Старожил
                                        23 апреля 2021, 12:20
                                        Спасибо большое ))
                                          Sergey
                                          Sergey Старожил
                                          26 апреля 2021, 12:05
                                          Не подскажете еще как получить цену именно из Модификации (msOptionsPrice2)?

                                          $sizePrice = $options['price'];
                                          Выводит цену минишопа, а нужно цену модификации. И сумма тоже считается с минишопа а не с модификации

                                          https://prnt.sc/12331c2
                                            Николай Савин
                                            Николай Савин Администратор
                                            26 апреля 2021, 12:09
                                            Примерно вот так
                                            $mod = $modx->getObject('msopModification', array(
                                                'rid' => $product->product_id,
                                                'id' => $option['modification_id'],
                                            ));
                                            
                                            $price = $mod->get('price')
                                              Sergey
                                              Sergey Старожил
                                              26 апреля 2021, 12:17
                                              Чего то не работает, пишет в консоле 500 ошибку у action.php когда пытаешься сделать заказ(
                                              Николай Савин
                                              Николай Савин Администратор
                                              26 апреля 2021, 12:20
                                              Возможно у вас в данном месте переменная $product не определена. Там должен быть объект товара из заказа.
                                              Sergey
                                              Sergey Старожил
                                              26 апреля 2021, 12:22
                                              Так пробовал

                                              foreach ($_products as $product) {
                                              $i++;
                                              $mod = $modx->getObject('msopModification', array(
                                              'rid' => $product->product_id,
                                              'id' => $option['modification_id'],
                                              ));
                                              $price = $mod->get('price');
                                              $products .= "{$i}. {$product->name} ({$product->count} шт.) — {price} грн";
                                              }
                                              Николай Савин
                                              Николай Савин Администратор
                                              26 апреля 2021, 12:27
                                              Ну чтобы ошибки не было нужно написать вот так
                                              $price = 0;
                                              if($mod) {
                                              $price = $mod->get('price');
                                              }
                                              У вас почему то запрос к модификации не происходит. Ошибки не будет, но и цену не получите.
                                              Скорее всего неверно $option['modification_id'] написал.
                                              Навскидку не помню как номер модификации в заказе хранится.
                                              Распечатайте посмотрите — и скорректируйте этот момент.
                                              Sergey
                                              Sergey Старожил
                                              27 апреля 2021, 14:08
                                              Чего то не получается никак получить (((
                                              Николай Савин
                                              Николай Савин Администратор
                                              27 апреля 2021, 14:10
                                              Печально (
                          pobnpolk
                          pobnpolk Старожил
                          18 мая 2021, 09:32
                          У меня проблема. добавляю руками в опции: mstelegram_recipients — id пользователей. и при отправке все пользователи перечисленные в настройках видят уведомления. Это ведь явно не должно быть.
                          И очень неудобно добавлять постоянно в mstelegram_recipients пользователей. можно ведь как-то автоматизировать процесс.
                          Кто-то решал такую задачу?
                            Дмитрий
                            Дмитрий Старожил
                            08 октября 2021, 09:33
                            Я добавляю через запятую всех, но уведомление приходит только первому из списка. Это только у меня так?
                            Петр
                            Петр Старожил
                            26 ноября 2021, 05:25
                            Добрый день. Подскажите пожалуйста (сам совсем не разбираюсь). Настроил уведомления о заказе в телеграмм. приходит в таком формате:
                            Новый заказ #2111/95
                            на сумму 560 р.
                            Оплата: 1
                            — 1. Товар (1 шт.)2. Товар (1 шт.)
                            — Телефон: 000000000000
                            Улица: xxxxxxxxxx
                            Дом: xxxxxx
                            Квартира: xxxxxx
                            Комментарий:
                            1. Способ оплаты пишет не как надо (например оплата картой), а id.
                            2. И как добавить что бы показывал вариант доставки.
                            Вот так у меня:
                            <?php
                            if($modx->event->name != 'msOnCreateOrder') return;
                            
                            $token = $modx->getOption('mstelegram_token', null, false);
                            $recipients = explode(',', $modx->getOption('mstelegram_recipients', null, ''));
                            
                            $contacts = $modx->getObject('msOrderAddress', array('id'=> $msOrder->address));
                            $_products = $msOrder->getMany('Products');
                            
                            // Список товаров в заказе
                            $i = 0;
                            $products = '';
                            foreach ($_products as $product) {
                                $i++;
                                $products .= "{$i}. {$product->name} ({$product->count} шт.)";
                            }
                            
                            // Текст сообщения
                            $message = "
                            Новый заказ #{$msOrder->num}
                            на сумму {$msOrder->cost} р.
                            Оплата: {$msOrder->payment}
                            -----
                            {$products}
                            -----
                            Телефон: {$contacts->phone}
                            Улица: {$contacts->street}
                            Дом: {$contacts->building}
                            Квартира: {$contacts->room}
                            Комментарий: {$contacts->comment}";
                            
                            $message = urlencode($message);
                            foreach($recipients as $id){
                            	$id = trim($id);
                            	if(!$id) continue;
                                $url = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$id}&text={$message}";
                                $ch = curl_init();
                                curl_setopt_array($ch, array(CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true));
                                $result = curl_exec($ch);
                                curl_close($ch);
                            }
                              Николай Савин
                              Николай Савин Администратор
                              26 ноября 2021, 10:03
                              Попробуйте заменить
                              {$msOrder->payment}
                              На
                              {$msOrder->Payment->name}
                              Обратите внимание, что Payment теперь с большой буквы.
                              Та же история с доставкой
                              {$msOrder->Delivery->name}
                                Sergey
                                Sergey Старожил
                                26 ноября 2021, 10:06
                                if ($msOrder->delivery == '1') {
                                    $deli = 'Способ доставки: Самовывоз';
                                    } else if ($msOrder->delivery == '2') {
                                        $deli = 'Курьерская доставка Деливери';
                                    } else {
                                   $deli = 'Самовывоз из Новой Почты';
                                }
                                
                                if ($msOrder->payment == '2') {
                                    $pay = 'Способ оплаты: Оплата на карту ПриватБанка';
                                    } else {
                                   $pay = 'Способ оплаты: Оплата при получении';
                                }
                                // Текст сообщения
                                $message = "
                                Новый заказ #{$msOrder->num}
                                на сумму {$msOrder->cost} грн.

                                Я делал так, id можно посмотреть в настройках доставки и оплаты
                                  Николай Савин
                                  Николай Савин Администратор
                                  26 ноября 2021, 15:44
                                  Это некорректно — к объекту заказа через связи привязаны и доставка и оплата и другие связные объекты. Я выше показал как можно обращаться к ним.
                                  Кроме того у вас ошибка еще и в написании — там не строка, а число. И работало у вас вся эта конструкция только потому что нестрогое сравнение. Корректное написание будет такое:
                                  if ($msOrder->delivery === 1) {
                                    Петр
                                    Петр Старожил
                                    03 декабря 2021, 08:49
                                    Спасибо большое! Все заработало!
                                    Петр
                                    Петр Старожил
                                    03 декабря 2021, 08:50
                                    Спасибо)
                                  Oleg
                                  Oleg Старожил
                                  05 января 2023, 15:31
                                  Приветствую. У кого-то получилось вывести отделение из msNovaPoshta в сообщение телеграм?

                                  Остальные поля (область, город, улица, дом, квартира) выводятся по стандарту.
                                    Sergey
                                    Sergey Старожил
                                    05 января 2023, 15:40
                                    До обновы дополнения работало так, после обновы у меня так не работает ( поэтому закомментировал

                                    <?php
                                    if($modx->event->name != 'msOnCreateOrder') return;
                                    
                                    $token = $modx->getOption('mstelegram_token', null, false);
                                    $recipients = explode(',', $modx->getOption('mstelegram_recipients', null, ''));
                                    
                                    $contacts = $modx->getObject('msOrderAddress', array('id'=> $msOrder->address));
                                    $_products = $msOrder->getMany('Products');
                                    $profile = $msOrder->getOne('UserProfile');
                                    // $properties = $msOrder->get('properties');
                                    
                                    
                                    // if (isset($properties['msnovaposhta']) && isset($properties['msnovaposhta']['warehouse_ref'])) {
                                    //  $np = $modx->getService('msnovaposhta', 'MsNovaPoshta'); 
                                    //  $warehouse = $np->getWarehouse($properties['msnovaposhta']['city_ref'], $properties['msnovaposhta']['warehouse_ref']);
                                    //   if($warehouse) {
                                    //      $officeNumber = $warehouse['Description'];
                                    //      $officeNumberOblast = $warehouse['SettlementAreaDescription'];
                                    //      $officeNumberRayon = $warehouse['SettlementRegionsDescription'];
                                    //      $officeNumberGorod = $warehouse['SettlementDescription'];
                                    //   }
                                    // }
                                    // Список товаров в заказе
                                      Oleg
                                      Oleg Старожил
                                      06 января 2023, 10:17
                                      Вот так получил отделение

                                      $properties = $msOrder->get('properties');
                                      
                                      Отделение: {$properties['msnovaposhta']['warehouse']['Description']}
                                      Александр
                                      Александр Старожил
                                      10 января 2023, 17:54
                                      Добрый, подскажите, в новой версии минишоп не приходит телефон в сообщение телеграма. не подскажите, на что нужно теперь заменить {$contacts->phone}?
                                        Николай Савин
                                        Николай Савин Администратор
                                        11 января 2023, 08:24
                                        Откройте плагин msTelegram и попробуйте заменить строчку

                                        $contacts = $modx->getObject('msOrderAddress', array('id'=> $msOrder->address));
                                        на следующий код

                                        $contacts = $msOrder->Address;
                                          Александр
                                          Александр Старожил
                                          17 января 2023, 11:07
                                          Спасибо, в 4 минишопе поменялось. Сам не разобрался
                                            Николай Савин
                                            Николай Савин Администратор
                                            17 января 2023, 11:22
                                            Тот код, что я вам написал — был всегда. Он не поменялся и является более корректным.
                                            А вот старый код более не работает, начиная с 4 да. По идее его вообще не нужно было использовать в компоненте, так как мой вариант проще, быстрее в написании и до сих пор работает.
                                        Александр
                                        Александр Старожил
                                        02 февраля 2023, 10:31
                                        Друзья, а не подскажете как в уведомление в Телеграм запихнуть ссылку на оплату payment_link?
                                          Игорь
                                          Игорь Старожил
                                          26 сентября 2023, 08:28
                                          Здрвсвуйте.
                                          Подскажите как сделать перенос строк в сообщении.
                                          Т.е., например, я хочу что бы каждый товар в заказе отображался с новой строки (сейчас все в одну строчку).
                                          Пробовал добавлять br, r/n — что-то не получается.
                                            Sergey
                                            Sergey Старожил
                                            26 сентября 2023, 10:21
                                            в продуктс в конце \n

                                            foreach ($_products as $product) {
                                                $i++;
                                                $options = $product->get('options');
                                                $size = $options['size'];
                                                $products .= "{$i}. {$product->name} ({$product->count} шт.) за {$product->Product->get('price')} грн \n Модель: {$size} \n \n";
                                            }
                                              Игорь
                                              Игорь Старожил
                                              26 сентября 2023, 13:52
                                              Спасибо, разобрался
                                            YanaShine
                                            YanaShine Старожил
                                            22 октября 2023, 13:09
                                            В Телеграм приходят сообщения в таком виде (без адреса и контактных данных) и все попытки тщетны

                                            Новый заказ #2310/22
                                            на сумму 24650 ₽.
                                            Оплата: Оплата наличными
                                            Доставка: Доставка до подъезда

                                            1. Кровать Рондо (1 шт.)

                                            Имя:
                                            Телефон:
                                            Email:
                                            Улица:
                                            Дом:
                                            Квартира:
                                            Комментарий:
                                            Плагин настроен так:
                                            <?php
                                            if($modx->event->name != 'msOnCreateOrder') return;
                                            
                                            $token = $modx->getOption('mstelegram_token', null, false);
                                            $recipients = explode(',', $modx->getOption('mstelegram_recipients', null, ''));
                                            
                                            $contacts = $modx->getObject('msOrderAddress', array('id'=> $msOrder->address));
                                            $_products = $msOrder->getMany('Products');
                                            $delivery = $msOrder->getOne('Delivery');
                                            $payment = $msOrder->getOne('Payment');
                                            
                                            // Список товаров в заказе
                                            $i = 0;
                                            $products = '';
                                            foreach ($_products as $product) {
                                                $i++;
                                                $products .= "{$i}. {$product->name} ({$product->count} шт.)";
                                            }
                                            
                                            // Текст сообщения
                                            $message = "
                                            Новый заказ #{$msOrder->num}
                                            на сумму {$msOrder->cost} ₽.
                                            Оплата: {$payment->name}
                                            Доставка: {$delivery->name}
                                            - - - - - - -
                                            {$products}
                                            - - - - - - -
                                            Имя: {$contacts->receiver}
                                            Телефон: {$contacts->phone}
                                            Email: {$contacts->email}
                                            Улица: {$contacts->street}
                                            Дом: {$contacts->building}
                                            Квартира: {$contacts->room}
                                            Комментарий: {$contacts->comment}
                                            ";
                                            
                                            $message = urlencode($message);
                                            foreach($recipients as $id){
                                            	$id = trim($id);
                                            	if(!$id) continue;
                                                $url = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$id}&text={$message}";
                                                $ch = curl_init();
                                                curl_setopt_array($ch, array(CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true));
                                                $result = curl_exec($ch);
                                                curl_close($ch);
                                            }
                                            Чанк tpl.msOrder.custom
                                            <form class="ms2_form" id="msOrder" method="post">
                                                <div class="row">
                                                    <div class="col-12 col-md-6">
                                                        <h4>{'ms2_frontend_credentials' | lexicon}:</h4>
                                                        {foreach ['email','receiver','phone'] as $field}
                                                            <div class="form-group row input-parent">
                                                                <label class="col-md-4 col-form-label" for="{$field}">
                                                                    {('ms2_frontend_' ~ $field) | lexicon} <span class="required-star">*</span>
                                                                </label>
                                                                <div class="col-md-8">
                                                                    <input type="text" id="{$field}" placeholder="{('ms2_frontend_' ~ $field) | lexicon}" name="{$field}" value="{$form[$field]}" class="form-control{($field in list $errors) ? ' error' : ''}">
                                                                </div>
                                                            </div>
                                                        {/foreach}
                                                        <div class="form-group row input-parent">
                                                            <label class="col-md-4 col-form-label" for="comment">
                                                                {'ms2_frontend_comment' | lexicon} <span class="required-star">*</span>
                                                            </label>
                                                            <div class="col-md-8">
                                                                <textarea name="comment" id="comment" placeholder="{'ms2_frontend_comment' | lexicon}"
                                                                    class="form-control{('comment' in list $errors) ? ' error' : ''}">{$form.comment}</textarea>
                                                            </div>
                                                        </div>
                                                    </div>
                                                    <div class="col-12 col-md-6" id="payments">
                                                        <h4>{'ms2_frontend_payments' | lexicon}:</h4>
                                                        <div class="form-group row">
                                                            <div class="col-12">
                                                                {foreach $payments as $payment index=$index}
                                                                    {var $checked = !($order.payment in keys $payments) && $index == 0 || $payment.id == $order.payment}
                                                                    <div class="checkbox">
                                                                        <label class="col-form-label payment input-parent">
                                                                            <input type="radio" name="payment" value="{$payment.id}" id="payment_{$payment.id}"{$checked ? 'checked' : ''}>
                                                                            {if $payment.logo?}
                                                                                <img src="{$payment.logo}" alt="{$payment.name}" title="{$payment.name}" class="mw-100"/>
                                                                            {else}
                                                                                {$payment.name}
                                                                            {/if}
                                                                            {if $payment.description?}
                                                                                <p class="small">{$payment.description}</p>
                                                                            {/if}
                                                                        </label>
                                                                    </div>
                                                                {/foreach}
                                                            </div>
                                                        </div>
                                                    </div>
                                                </div>
                                                <div class="row">
                                                    <div class="col-12 col-md-6" id="deliveries">
                                                        <h4>{'ms2_frontend_deliveries' | lexicon}:</h4>
                                                        <div class="form-group row">
                                                            <div class="col-12">
                                                                {foreach $deliveries as $delivery index=$index}
                                                                    {var $checked = !($order.delivery in keys $deliveries) && $index == 0 || $delivery.id == $order.delivery}
                                                                    <div class="checkbox">
                                                                        <label class="col-form-label delivery input-parent">
                                                                            <input type="radio" name="delivery" value="{$delivery.id}" id="delivery_{$delivery.id}"
                                                                                data-payments="{$delivery.payments | json_encode}"
                                                                                {$checked ? 'checked' : ''}>
                                                                            {if $delivery.logo?}
                                                                                <img src="{$delivery.logo}" alt="{$delivery.name}" title="{$delivery.name}"/>
                                                                            {else}
                                                                                {$delivery.name}
                                                                            {/if}
                                                                            {if $delivery.description?}
                                                                                <p class="small">
                                                                                    {$delivery.description}
                                                                                </p>
                                                                            {/if}
                                                                        </label>
                                                                    </div>
                                                                {/foreach}
                                                            </div>
                                                        </div>
                                                    </div>
                                                    <div class="col-12 col-md-6">
                                                        <h4>{'ms2_frontend_address' | lexicon}:</h4>
                                                        {foreach ['index','region','city', 'street', 'building', 'entrance','floor', 'room'] as $field}
                                                            <div class="form-group row input-parent">
                                                                <label class="col-md-4 col-form-label" for="{$field}">
                                                                    {('ms2_frontend_' ~ $field) | lexicon} <span class="required-star">*</span>
                                                                </label>
                                                                <div class="col-md-8">
                                                                    <input type="text" id="{$field}" placeholder="{('ms2_frontend_' ~ $field) | lexicon}"
                                                                        name="{$field}" value="{$form[$field]}"
                                                                        class="form-control{($field in list $errors) ? ' error' : ''}">
                                                                </div>
                                                            </div>
                                                        {/foreach}
                                                        <div class="form-group row input-parent">
                                                            <label class="col-md-4 col-form-label" for="text_address">
                                                                {'ms2_frontend_text_address' | lexicon} <span class="required-star">*</span>
                                                            </label>
                                                            <div class="col-md-8">
                                                                <textarea name="text_address" id="text_address" placeholder="{'ms2_frontend_text_address' | lexicon}"
                                                                    class="form-control{('text_address' in list $errors) ? ' error' : ''}">{$form.text_address}</textarea>
                                                            </div>
                                                        </div>
                                                    </div>
                                                </div>
                                                <button type="button" name="ms2_action" value="order/clean" class="btn btn-danger ms2_link">{'ms2_frontend_order_cancel' | lexicon} </button>
                                                <hr class="mt-4 mb-4"/>
                                                <div class="d-flex flex-column flex-md-row align-items-center justify-content-center justify-content-md-end mb-5">
                                                    <h4 class="mb-md-0">{'ms2_frontend_order_cost' | lexicon}:</h4>
                                                    <h3 class="mb-md-0 ml-md-2">
                                                        <span id="ms2_order_cart_cost">{$order.cart_cost ?: 0}</span> {'ms2_frontend_currency' | lexicon} +
                                                        <span id="ms2_order_delivery_cost">{$order.delivery_cost ?: 0}</span> {'ms2_frontend_currency' | lexicon} =
                                                        <span id="ms2_order_cost">{$order.cost ?: 0}</span> {'ms2_frontend_currency' | lexicon}
                                                    </h3>
                                                    <button type="submit" name="ms2_action" value="order/submit" class="btn btn-lg btn-primary ml-md-2 ms2_link">
                                                        {'ms2_frontend_order_submit' | lexicon}
                                                    </button>
                                                </div>
                                            </form>
                                              YanaShine
                                              YanaShine Старожил
                                              22 октября 2023, 14:20
                                              Решился вопрос

                                              $contacts = $modx->getObject('msOrderAddress', array('id'=> $msOrder->address));
                                              на следующий код
                                              $contacts = $msOrder->Address;
                                              YanaShine
                                              YanaShine Старожил
                                              22 октября 2023, 15:04
                                              Мое решение с исправлениями номера телефона, разделением суммы и проверкой на пустые формы

                                              <?php
                                              if($modx->event->name != 'msOnCreateOrder') return;
                                              
                                              $token = $modx->getOption('mstelegram_token', null, false);
                                              
                                              $recipients = explode(',', $modx->getOption('mstelegram_recipients', null, ''));
                                              $contacts = $msOrder->Address;
                                              $_products = $msOrder->getMany('Products');
                                              $delivery = $msOrder->getOne('Delivery');
                                              $payment = $msOrder->getOne('Payment');
                                              
                                              // Преобразование суммы с разделением тысяч
                                              $formattedCost = number_format($msOrder->cost, 0, '.', ' ');
                                              
                                              // Проверка и преобразование телефона
                                              $phone = $contacts->phone;
                                              if (!empty($phone) && !preg_match('/^\+7/', $phone)) {
                                                  // Заменяем "8" на "+7"
                                                  $phone = str_replace("8", "+7", $phone);
                                              }
                                              
                                              // Список товаров в заказе
                                              $i = 0;
                                              $products = '';
                                              foreach ($_products as $product) {
                                                  if (!empty($product->count)) { // Проверка, что количество товара не пустое
                                                      $i++;
                                                      if ($i > 1) {
                                                          $products .= "\n"; // Добавляем разделитель только после первого товара
                                                      }
                                                      $products .= "{$i}. {$product->name} ({$product->count} шт.)";
                                                  }
                                              }
                                              
                                              // Текст сообщения
                                              $message = "
                                              Новый заказ #{$msOrder->num}
                                              на сумму {$formattedCost} ₽.
                                              Оплата: {$payment->name}
                                              Доставка: {$delivery->name}
                                              - - - - - - -
                                              {$products}
                                              - - - - - - -
                                              Имя: {$contacts->receiver}
                                              ";
                                              if (!empty($phone)) { // Добавляем телефон только если он не пустой
                                                  $message .= "Телефон: {$phone}\n";
                                              }
                                              if (!empty($contacts->email)) { // Добавляем Email только если он не пустой
                                                  $message .= "Email: {$contacts->email}\n";
                                              }
                                              if (!empty($contacts->street)) { // Добавляем Улица только если он не пустой
                                                  $message .= "Улица: {$contacts->street}\n";
                                              }
                                              if (!empty($contacts->building)) { // Добавляем Дом только если он не пустой
                                                  $message .= "Дом: {$contacts->building}\n";
                                              }
                                              if (!empty($contacts->room)) { // Добавляем Квартиру только если она не пуста
                                                  $message .= "Квартира: {$contacts->room}\n";
                                              }
                                              if (!empty($contacts->comment)) { // Добавляем Комментарий только если он не пустой
                                                  $message .= "Комментарий: {$contacts->comment}";
                                              }
                                              
                                              $message = urlencode($message);
                                              foreach($recipients as $id){
                                                  $id = trim($id);
                                                  if(!$id) continue;
                                                  $url = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$id}&text={$message}";
                                                  $ch = curl_init();
                                                  curl_setopt_array($ch, array(CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true));
                                                  $result = curl_exec($ch);
                                                  curl_close($ch);
                                              }
                                                Кушнеров Александр
                                                30 августа 2024, 01:32
                                                Я тоже немного доработал, чтобы приходило больше полей, а также способ и вариант доставки текстом:
                                                <?php
                                                if($modx->event->name != 'msOnCreateOrder') return;
                                                
                                                $token = $modx->getOption('mstelegram_token', null, false);
                                                $recipients = explode(',', $modx->getOption('mstelegram_recipients', null, ''));
                                                
                                                $contacts = $msOrder->getOne('Address');
                                                $_products = $msOrder->getMany('Products');
                                                
                                                // Список товаров в заказе
                                                $i = 0;
                                                $products = '';
                                                foreach ($_products as $product) {
                                                    $i++;
                                                    $products .= "{$i}. {$product->name} ({$product->count} шт.)";
                                                }
                                                
                                                // Текст сообщения
                                                $message = "
                                                Новый заказ #{$msOrder->num}
                                                на сумму {$msOrder->cost} р.
                                                -----
                                                {$products}
                                                -----
                                                E-mail: {$contacts->email}
                                                Имя: {$contacts->receiver}
                                                Телефон: {$contacts->phone}
                                                Комментарий: {$contacts->comment}";
                                                
                                                $deliveryMethod = $modx->getObject('msDelivery', $msOrder->delivery);
                                                if ($deliveryMethod) {
                                                    $deliveryMethodTitle = $deliveryMethod->get('name');
                                                    $message .= "\nСпособ доставки: {$deliveryMethodTitle}";
                                                }
                                                
                                                $paymentMethod = $modx->getObject('msPayment', $msOrder->payment);
                                                if ($paymentMethod) {
                                                    $paymentMethodTitle = $paymentMethod->get('name');
                                                    $message .= "\nСпособ оплаты: {$paymentMethodTitle}";
                                                }
                                                
                                                $message = urlencode($message);
                                                foreach($recipients as $id){
                                                	$id = trim($id);
                                                	if(!$id) continue;
                                                    $url = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$id}&text={$message}";
                                                    $ch = curl_init();
                                                    curl_setopt_array($ch, array(CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true));
                                                    $result = curl_exec($ch);
                                                    curl_close($ch);
                                                }
                                                  Андрей
                                                  Андрей Старожил
                                                  22 февраля 2025, 11:06
                                                  Не приходит информация: phone, street, comment
                                                  Остальные приходят. В чём может быть причина?
                                                  <?php
                                                  if($modx->event->name != 'msOnCreateOrder') return;
                                                  $token = $modx->getOption('mstelegram_token', null, false);
                                                  $recipients = explode(',', $modx->getOption('mstelegram_recipients', null, ''));
                                                  $contacts = $modx->getObject('msOrderAddress', array('id'=> $msOrder->id));
                                                  $_products = $msOrder->getMany('Products');
                                                  $profile = $msOrder->getOne('UserProfile');
                                                  
                                                  // Список товаров в заказе
                                                  $i = 0;
                                                  $products = '';
                                                  foreach ($_products as $product) {
                                                      $i++;
                                                      $products .= "*{$i}. {$product->name}* \n    `↳ ". round($product->price) ." х {$product->count} шт. = ". round($product->price * $product->count)."` \n";
                                                  }
                                                  
                                                  if ($msOrder->delivery == '1') {
                                                      $deli = "Сами заберут \n---------- \nТелефон: {$contacts->phone} \nКомментарий: {$contacts->comment}\n";
                                                      } else if ($msOrder->delivery == '2') {
                                                          $deli = "Доставка {$contacts->city} `{$msOrder->delivery_cost} р.` \n---------- \nТелефон: {$contacts->phone} \nАдрес: {$contacts->city}, {$contacts->street} \nКомментарий: {$contacts->comment}\n";
                                                      }
                                                  
                                                  // Текст сообщения
                                                  $message = "
                                                  Новый заказ #{$msOrder->id}
                                                  на сумму: {$msOrder->cart_cost} р.
                                                  ----------
                                                  {$products}
                                                  ----------
                                                  {$deli}
                                                  _Статус заказа придёт повторно_";
                                                  
                                                  $message = urlencode($message);
                                                  foreach($recipients as $id){
                                                      $id = trim($id);
                                                      if(!$id) continue;
                                                      $url = "https://api.telegram.org/bot{$token}/sendMessage?chat_id={$id}&parse_mode=markdown&text={$message}";
                                                      $ch = curl_init();
                                                      curl_setopt_array($ch, array(CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true,));
                                                      $result = curl_exec($ch);
                                                      curl_close($ch);
                                                  }
                                                    Андрей
                                                    Андрей Старожил
                                                    22 февраля 2025, 11:08
                                                    Вопрос решён
                                                    Дмитрий
                                                    Дмитрий Старожил
                                                    07 августа 2025, 18:24
                                                    А как-то можно это реализовать, для уведомления клиента, а не менеджера?
                                                    К примеру, сменился статус у заказа, а бот в тг клиенту пишет об этом…
                                                    Буду признателен если разъясните, как такое можно реализовать!
                                                      Ivan K.
                                                      Ivan K. Эксперт
                                                      07 августа 2025, 19:53
                                                      Ваш бот не сможет написать вашему клиенту сообщение. Сначала клиент должен первым, что-то написать боту)) только после этого бот сможет писать клиенту. Так устроен телеграм, чтобы угомонить спамеров.
                                                        Дмитрий
                                                        Дмитрий Старожил
                                                        07 августа 2025, 21:26
                                                        какая досада, а может есть подобная тема с ватсапом?
                                                          Артур Шевченко
                                                          09 августа 2025, 19:27
                                                          У вацап вообще нет открытого апи
                                                      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                                      72