[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
18 сентября 2016, 23:26
modx.pro
21
8 688
+18

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

but1head
20 сентября 2016, 19:08
+5
Опубликовали в modstore
Александр
26 сентября 2016, 14:12
0
Добрый день.
Помогите настроить плагин на работу с Shopkeeper 3? Кто нибудь знает как это сделать?
    Константин
    02 июля 2017, 12:44
    0
    День добрый.
    Подскажите почему может не отображаться почта в сообщении, которую указывает клиент?
    // Текст сообщения
    $message = "
    Новый заказ #{$msOrder->num}
    на сумму {$msOrder->cost} р.
    -----
    {$products}
    -----
    Клиент: {$contacts->receiver}
    -----
    Телефон: {$contacts->phone}
    -----
    Почта: {$contacts->email}
    -----
    Комментарий: {$contacts->comment}";
      Володя
      02 июля 2017, 12:51
      +1
      если посмотреть сюда 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
        0
        Теперь знаю куда смотреть) Спасибо за помощь
          Алексей
          17 октября 2020, 22:40
          0
          А как получить варианты доставки и оплаты?
          Подскажите пожалуйста, что-то не разберусь.
            Александр
            18 ноября 2020, 12:17
            0
            if ($msOrder->delivery == '1') {
                $deli = "Способ доставки: Самовывоз";
                } else {
                  
               $deli = "Способ доставки: Доставка";
            }
            
            if ($msOrder->payment == '1') {
                $pay = "Способ оплаты: Оплата в магазине";
                } else {
                    
               $pay = "Способ оплаты: Онлайн картой";
            }
            Сделал так, кривовато конечно, но логика такая — подстроите под себя
              Денис Мижеревич
              21 апреля 2021, 19:16
              0
              Можете подсказать, как правильно это логику написать? Где она пишется?

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

                  Как получить значение (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
                    +1
                    В вашем случае size из заказа нужно вытаскивать примерно так
                    $options = $product->get('options');
                    $size = $options['size'];
                      Sergey
                      22 апреля 2021, 21:54
                      0
                      Спасибо, работает ))

                      Еще не подскажете пожалуйста как получить и отправить доп. значения из заказа минишоп. Поля созданы как тут https://modx.pro/solutions/10040
                        Николай Савин
                        23 апреля 2021, 08:12
                        +1
                        Ровно так же как и родные поля таблицы адреса, через get
                        $properties = $msOrder->get('properties');
                          Sergey
                          23 апреля 2021, 12:13
                          0
                          У меня в 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
                            +1
                            Да нет же
                            $extfld_delivery_shop = $msOrder->get('extfld_delivery_shop');
                              Sergey
                              23 апреля 2021, 12:17
                              0
                              Спасибо огромное, чет затупил )))
                                Николай Савин
                                23 апреля 2021, 12:19
                                +1
                                Нет, я тоже затупил. Неверно подсказал. У вас данные хранятся не в заказе, а в адресе, это другая таблица. Нужно добавить ссылку.
                                $extfld_delivery_shop = $msOrder->Address->get('extfld_delivery_shop');
                                  Sergey
                                  23 апреля 2021, 12:20
                                  0
                                  Спасибо большое ))
                                    Sergey
                                    26 апреля 2021, 12:05
                                    0
                                    Не подскажете еще как получить цену именно из Модификации (msOptionsPrice2)?

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

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

                                        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
                                        0
                                        Ну чтобы ошибки не было нужно написать вот так
                                        $price = 0;
                                        if($mod) {
                                        $price = $mod->get('price');
                                        }
                                        У вас почему то запрос к модификации не происходит. Ошибки не будет, но и цену не получите.
                                        Скорее всего неверно $option['modification_id'] написал.
                                        Навскидку не помню как номер модификации в заказе хранится.
                                        Распечатайте посмотрите — и скорректируйте этот момент.
                                        Sergey
                                        27 апреля 2021, 14:08
                                        0
                                        Чего то не получается никак получить (((
                                        Николай Савин
                                        27 апреля 2021, 14:10
                                        0
                                        Печально (
                    pobnpolk
                    18 мая 2021, 09:32
                    0
                    У меня проблема. добавляю руками в опции: mstelegram_recipients — id пользователей. и при отправке все пользователи перечисленные в настройках видят уведомления. Это ведь явно не должно быть.
                    И очень неудобно добавлять постоянно в mstelegram_recipients пользователей. можно ведь как-то автоматизировать процесс.
                    Кто-то решал такую задачу?
                      Дмитрий
                      08 октября 2021, 09:33
                      0
                      Я добавляю через запятую всех, но уведомление приходит только первому из списка. Это только у меня так?
                      Петр
                      26 ноября 2021, 05:25
                      0
                      Добрый день. Подскажите пожалуйста (сам совсем не разбираюсь). Настроил уведомления о заказе в телеграмм. приходит в таком формате:
                      Новый заказ #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
                        0
                        Попробуйте заменить
                        {$msOrder->payment}
                        На
                        {$msOrder->Payment->name}
                        Обратите внимание, что Payment теперь с большой буквы.
                        Та же история с доставкой
                        {$msOrder->Delivery->name}
                          Sergey
                          26 ноября 2021, 10:06
                          -1
                          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
                            0
                            Это некорректно — к объекту заказа через связи привязаны и доставка и оплата и другие связные объекты. Я выше показал как можно обращаться к ним.
                            Кроме того у вас ошибка еще и в написании — там не строка, а число. И работало у вас вся эта конструкция только потому что нестрогое сравнение. Корректное написание будет такое:
                            if ($msOrder->delivery === 1) {
                              Петр
                              03 декабря 2021, 08:49
                              0
                              Спасибо большое! Все заработало!
                              Петр
                              03 декабря 2021, 08:50
                              0
                              Спасибо)
                            Oleg
                            05 января 2023, 15:31
                            0
                            Приветствую. У кого-то получилось вывести отделение из msNovaPoshta в сообщение телеграм?

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

                              <?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
                                06 января 2023, 10:17
                                0
                                Вот так получил отделение

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

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

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