Боты программы лояльности: различия между версиями

Материал из Касса
Перейти к навигации Перейти к поиску
Строка 1: Строка 1:
Инструкция по настройке бота лояльности
Инструкция по подключению бота лояльности
== Оглавление ==
== Оглавление ==


* [[#1 Общие сведения|1. Общие сведения]]
* [[#1 Что нужно от вас|1. Что нужно от вас]]
* [[#2 Что нужно подготовить перед стартом|2. Что нужно подготовить перед стартом]]
* [[#2 Получение токена Telegram-бота|2. Получение токена Telegram-бота]]
* [[#3 Общие шаги настройки (для всех каналов)|3. Общие шаги настройки (для всех каналов)]]
* [[#3 Получение токена MAX-бота (необязательно)|3. Получение токена MAX-бота (необязательно)]]
* [[#4 Настройка Telegram-бота|4. Настройка Telegram-бота]]
* [[#4 Что дальше|4. Что дальше]]
* [[#5 Настройка MAX-бота|5. Настройка MAX-бота]]
* [[#5 Глоссарий|5. Глоссарий]]
* [[#6 Запуск бота|6. Запуск бота]]
* [[#7 Проверка работы бота|7. Проверка работы бота]]
* [[#8 Типовые проблемы и их решение|8. Типовые проблемы и их решение]]
* [[#9 Глоссарий|9. Глоссарий]]


== 1. Общие сведения ==
== 1. Что нужно от вас ==


Бот программы лояльности обслуживает '''покупателей''' вашего магазина (организации). Покупатель в мессенджере:
Для подключения бота лояльности вам достаточно подготовить два (или три) значения:


* делится с ботом своей контактной карточкой ('''ФИО''' и '''номер телефона''');
# '''ИНН организации''' — по нему мы самостоятельно найдём <code>organization_id</code>.
* автоматически привязывается к активной программе лояльности (например, «10% скидка» или «Накопление баллов»);
# '''Токен Telegram-бота''' — как получить, см. раздел 2.
* получает персональный '''идентификационный QR-код''' с номером карты;
# '''Токен MAX-бота''' — необязательно; как получить, см. раздел 3.
* может смотреть '''баланс''' накопительной программы и '''историю покупок'''.


Продавец считывает QR-код покупателя кассовым ПО (сканером/камерой мобильной кассы). Взаимодействие продавца с ботом через интерфейс мессенджера '''не требуется'''.
Больше от вас ничего не требуется: настройка, запуск и обслуживание выполняются на нашей стороне.
 
Один и тот же магазин может обслуживаться '''одновременно двумя ботами''': в Telegram и в MAX. Оба бота могут одновременно работать с одной организацией.


{{Note|'''Важно'''<br>
{{Note|'''Важно'''<br>
Учётная запись, от имени которой бот работает с API БИФИТ Касса, должна иметь '''максимальное количество прав''' — право создавать, редактировать и удалять документы и справочники, а также карты лояльности и клиентов.|
Учётная запись БИФИТ Касса, от имени которой будет работать бот, должна иметь максимальное количество прав — право создавать, редактировать и удалять документы, справочники, клиентов и карты лояльности.|
700}}
 
== 2. Что нужно подготовить перед стартом ==
 
Перед запуском бота у вас должны быть:
 
* '''Учётная запись''' БИФИТ Касса с логином (номер телефона в формате <code>7xxxxxxxxxx</code>) и паролем, привязанная к вашей организации.
* '''ID организации''' (Organization ID). Если Вы не знаете organization_id Вы можете запросить ее в службе технической поддержки через Личный кабинет
* '''Активная программа лояльности''' в организации (типы, с которыми работает бот: '''DISCOUNT''' — скидка, '''SCORING''' — баллы).
* '''Учётные данные Telegram-бота''' и/или '''MAX-бота''' (см. разделы 4 и 5).
* Доступ к '''базе данных PostgreSQL''', в которой хранится конфигурация ботов (таблица <code>bifit_loyalty_bots</code>).
 
{{Note|'''Обратите внимание'''<br>
Бот работает с программами лояльности только типов '''DISCOUNT''' и '''SCORING'''. Программы типов COUPON и GIFT ботом игнорируются.|
700}}
 
== 3. Общие шаги настройки (для всех каналов) ==
 
Независимо от того, какой канал вы настраиваете (Telegram или MAX), конфигурация бота хранится в таблице <code>bifit_loyalty_bots</code> базы данных PostgreSQL. '''Одна строка таблицы = один магазин = один экземпляр бота'''.
 
Параметры бэкенда (доступ к API БИФИТ Касса) — '''общие''' для обоих каналов одной организации. Различаются только токены мессенджеров и адрес Bot API.
 
Строка настраивается через следующие ключевые поля:
 
{| class="wikitable"
|+ Основные поля строки <code>bifit_loyalty_bots</code>
! Поле
! Назначение
|-
| <code>id</code>
| Служебный идентификатор строки. Используется для имени файлов хранилища (например <code>data/customers_1.json</code>).
|-
| <code>enabled</code>
| Флаг «включён». Бот запускает только строки с <code>enabled = TRUE</code>.
|-
| <code>name</code>
| Название магазина (отображается в логах).
|-
| <code>organization_id</code>
| ID организации (магазина) в БИФИТ Касса.
|-
| <code>api_base_url</code>
| Базовый адрес API БИФИТ Касса (по умолчанию <code>http://kassa.bifit.com/cashdesk-api/v1</code>).
|-
| <code>auth_username</code>
| Логин учётной записи (номер телефона). Бот сам нормализует его до формата <code>7xxxxxxxxxx</code>.
|-
| <code>auth_password</code>
| Пароль учётной записи в открытом виде. Бот сам зашифрует его: <code>SHA-256 → Base64 urlencoded</code>.
|-
| <code>auth_refresh_token</code>
| Альтернатива паролю — refresh-токен (для продления сессии без пароля).
|-
| <code>http_timeout_ms</code>
| Таймаут запросов к API (по умолчанию <code>10000</code>).
|-
| <code>retry_attempts</code>
| Количество повторов при ошибках API (по умолчанию <code>3</code>).
|}
 
{{Note|'''Секреты'''<br>
В коде бота и в репозитории не должно быть секретов. Все пароли, токены и ID организации хранятся только в базе данных. В окружении сервера находятся лишь параметры подключения к базе: <code>PGHOST</code>, <code>PGPORT</code>, <code>PGDATABASE</code>, <code>PGUSER</code>, <code>PGPASSWORD</code>.|
700}}
700}}


Порядок действий администратора:
== 2. Получение токена Telegram-бота ==
 
# Создать строку в таблице <code>bifit_loyalty_bots</code> для своего магазина.
# Заполнить общие поля (раздел 3) и поля конкретного канала (раздел 4 и/или 5).
# Установить флаг <code>enabled = TRUE</code>.
# Запустить бота (раздел 6).
 
== 4. Настройка Telegram-бота ==
 
=== 4.1 Создание бота в Telegram ===


# Откройте мессенджер '''Telegram'''.
# Откройте мессенджер '''Telegram'''.
# Найдите бота '''@BotFather''' и откройте с ним чат.
# Найдите бота '''@BotFather''' и откройте с ним чат.
# Отправьте команду <code>/newbot</code>.
# Отправьте команду <code>/newbot</code>.
# Следуйте подсказкам BotFather: введите имя бота и его уникальный username (адрес, заканчивающийся на <code>bot</code>, например <code>my_shop_loyalty_bot</code>).
# Следуйте подсказкам BotFather: введите имя бота и его уникальный адрес (username), который заканчивается на <code>bot</code>, например <code>my_shop_loyalty_bot</code>.
# После создания BotFather выдаст '''токен''' вида <code>123456:ABC-DEF123...</code>. Скопируйте и сохраните его.
# После создания BotFather выдаст '''токен''' вида <code>123456:ABC-DEF123...</code>.
# (Необязательно) задайте боту аватар, описание и команды.


Полученный токен является единственным Telegram-специфичным параметром; остальные поля строки — общие (раздел 3).
Скопируйте этот токен и передайте его нам. Это единственное, что нужно сделать в Telegram.


=== 4.2 QR-ссылка на Telegram-бота ===
{{Note|'''Обратите внимание'''<br>
 
Токен выдаётся '''только один раз''' при создании бота. Сохраните его в надёжном месте — это ключ доступа к вашему боту.|
* Прямая ссылка на бота имеет вид <code>https://t.me/имя_бота</code>.
* Эту ссылку нужно закодировать в QR-код и разместить в зоне видимости покупателя.
* При сканировании QR-кода телефон открывает чат с ботом, и покупатель нажимает '''«НАЧАТЬ РАБОТУ»'''.
 
=== 4.3 Поля таблицы для Telegram ===
 
{| class="wikitable"
|+ Telegram-специфичные поля строки <code>bifit_loyalty_bots</code>
! Поле
! Значение
|-
| <code>telegram_token</code>
| Токен, выданный '''@BotFather''' (обязателен).
|}
 
{{Note|'''Уникальность токена'''<br>
Значение <code>telegram_token</code> в таблице должно быть '''уникальным'''. Один токен не может использоваться двумя запущенными экземплярами бота одновременно.|
700}}
700}}


Telegram-канал запускается, если в строке заполнен <code>telegram_token</code>.
Дополнительно вы получите прямую ссылку на бота вида <code>https://t.me/имя_бота</code>. Её нужно будет разместить в зоне видимости покупателя в виде QR-кода (мы поможем это настроить).


== 5. Настройка MAX-бота ==
== 3. Получение токена MAX-бота (необязательно) ==


=== 5.1 Создание бота в MAX ===
Этот шаг нужен только если вы хотите, чтобы магазин обслуживался ещё и ботом в MAX. Если нет — пропустите раздел.


# Войдите на '''портал MAX''' (или API-платформу MAX) под учётной записью организации.
# Войдите на '''портал MAX''' (или API-платформу MAX) под учётной записью организации.
# Зарегистрируйте нового бота в соответствии с правилами платформы MAX.
# Зарегистрируйте нового бота в соответствии с правилами платформы MAX.
# Получите '''токен MAX-бота''' (используется как <code>max_token</code>) и, при необходимости, '''session-ключ''' и '''код подтверждения'''.
# Получите '''токен MAX-бота''' и, при необходимости, логин, пароль и другие параметры доступа, которые запросит платформа.
# Сохраните параметры доступа: логин, пароль, session-ключ, код подтверждения.
 
MAX-бот работает через библиотеку <code>maxapi</code> и требует сетевого доступа сервера к хостам платформы MAX (см. раздел 5.4).
 
=== 5.2 QR-ссылка на MAX-бота ===
 
* Для MAX используется '''прямая ссылка на бота''' платформы MAX.
* Ссылку кодируют в QR-код и размещают в зоне видимости покупателя.
 
=== 5.3 Поля таблицы для MAX ===
 
{| class="wikitable"
|+ MAX-специфичные поля строки <code>bifit_loyalty_bots</code>
! Поле
! Назначение
|-
| <code>max_token</code>
| Токен MAX-бота. '''Именно его наличие включает MAX-канал''', а не флаг <code>max_enabled</code>.
|-
| <code>max_enabled</code>
| Флаг (справочный). На запуск MAX-бота влияет наличие <code>max_token</code>.
|-
| <code>max_login</code>
| Логин для входа в MAX.
|-
| <code>max_password</code>
| Пароль для входа в MAX.
|-
| <code>max_session_key</code>
| Session-ключ MAX (при необходимости).
|-
| <code>max_confirmation_code</code>
| Код подтверждения (при необходимости).
|-
| <code>max_api_base_url</code>
| Адрес Bot API MAX (по умолчанию <code>https://api.max.ru</code>; рабочий хост — <code>platform-api2.max.ru</code>).
|}
 
{{Note|'''Включение MAX-канала'''<br>
MAX-бот запускается '''по наличию токена <code>max_token</code>''', а не по флагу <code>max_enabled</code>. Если в строке заполнен <code>max_token</code> — MAX-канал будет запущен.|
700}}


=== 5.4 Сетевые хосты MAX ===
Скопируйте полученный токен и передайте его нам.


Для работы MAX-бота сервер должен иметь доступ (в том числе исходящий по TCP 443) к следующим хостам:
{{Note|'''Примечание'''<br>
 
Если токен MAX-бота не передан магазин будет обслуживаться только ботом в Telegram. MAX-канал подключается только при наличии токена.|
* '''Bot API:''' <code>platform-api2.max.ru</code> (или адрес из <code>max_api_base_url</code>);
* '''Загрузка медиа:''' <code>iu.oneme.ru</code>;
* '''Скачивание медиа:''' <code>i.oneme.ru</code>.
 
Если сервер не может обратиться к этим хостам, MAX-канал работать не будет.
 
{{Note|'''Зависимость от библиотеки <code>maxapi</code>'''<br>
MAX-канал подключается лениво. Если библиотека <code>maxapi</code> не установлена на сервере — MAX-канал пропускается с сообщением об ошибке в лог, а Telegram-бот продолжает работать.|
700}}
700}}


== 6. Запуск бота ==
Также вы получите прямую ссылку на MAX-бота её разместят в зоне видимости покупателя в виде QR-кода.
 
# Убедитесь, что на сервере установлены зависимости (Python 3, библиотеки проекта, а для MAX — <code>maxapi</code>).
# Задайте параметры подключения к базе PostgreSQL в окружении (<code>PGHOST</code>, <code>PGPORT</code>, <code>PGDATABASE</code>, <code>PGUSER</code>, <code>PGPASSWORD</code>).
# Запустите приложение-лаунчер ботов.
# Бот на старте выполняет авторизацию OAuth2 и проверяет привязку учётной записи к вашей организации:
#* если привязка есть — бот запускает каналы (Telegram и/или MAX);
#* если привязки нет бот выводит ошибку в лог и останавливается.
 
По умолчанию развёртывание происходит в режиме '''polling''' (и для Telegram, и для MAX) — отдельные webhook-серверы не требуются.
 
== 7. Проверка работы бота ==
 
Для каждого настроенного канала выполните проверку:


# Откройте чат с ботом по QR-ссылке магазина.
== 4. Что дальше ==
# Нажмите кнопку '''«НАЧАТЬ РАБОТУ»'''.
# Нажмите кнопку '''«Поделиться контактом»''' и разрешите передачу контакта.
# Убедитесь, что бот:
#* сохранил данные и считал вас авторизованным;
#* привязал вас к активной программе лояльности;
#* показал идентификационный '''QR-код''';
#* показывает '''меню''' с кнопками «Карта покупателя», «Баланс», «Покупки».
# Проверьте повторный вход: дубли клиента и карт создаваться '''не должны'''.
# (SCORING) Проверьте отображение баланса в отдельной ячейке с названием программы.
# Проверьте отображение истории покупок.


{{{!}} class="wikitable"
После того как вы передали нам '''ИНН организации''' и токены ботов:
{{!}}+ Ключевые проверки по каналам
{{!}} Канал
{{!}} Что проверить
{{!}}-
{{!}} Telegram
{{!}} Кнопка «Поделиться контактом» (<code>request_contact</code>), отправка фото с QR, меню с кнопками.
{{!}}-
{{!}} MAX
{{!}} Кнопка «Поделиться контактом» (vCard), инлайн-меню, отправка QR без длительной паузы, меню после регистрации показывается сразу.
{{!}}}
}}}


== 8. Типовые проблемы и их решение ==
* мы найдём <code>organization_id</code> по ИНН;
* настроим и запустим бота;
* пришлём вам QR-коды для размещения в зоне продажи.


{| class="wikitable"
Ваши покупатели смогут делиться контактом, получить идентификационный QR-код, смотреть баланс и историю покупок.
|+ Диагностика
! Симптом
! Причина / решение
|-
| Бот не запускается, в логе ошибка авторизации
| Учётная запись не привязана к введённому <code>organization_id</code>. Проверьте права и привязку учётной записи к организации.
|-
| Ошибка «требуется двухфакторная авторизация» (<code>mfa_required</code>)
| MFA в БИФИТ Касса '''не поддерживается'''. Отключите MFA у учётной записи или используйте grant <code>refresh_token</code> / <code>bearer</code>.
|-
| MAX-канал не запускается
| Библиотека <code>maxapi</code> не установлена, либо нет сетевого доступа к хостам MAX (см. раздел 5.4). Telegram продолжает работать.
|-
| QR-карта в MAX отправляется с задержкой ~2 секунды
| Убедитесь, что отправка изображения использует <code>after_input_media_delay = 0.05</code> (библиотека не принимает нулевое значение).
|-
| Покупатель «не найден»
| Проверьте, что покупатель прошёл регистрацию (поделился контактом) в этом канале. Иначе бот просит «пройти регистрацию».
|-
| «Нет активной программы лояльности»
| Проверьте, что в организации есть активная ПЛ типов DISCOUNT или SCORING.
|}


== 9. Глоссарий ==
== 5. Глоссарий ==


* '''Покупатель''' — конечный участник программы лояльности; работает в боте продавца.
* '''Покупатель''' — конечный участник программы лояльности; работает в боте.
* '''Продавец''' — владелец бота, сотрудник организации; настраивает бота, но не работает в его интерфейсе.
* '''Программа лояльности (ПЛ)''' — сущность API БИФИТ Касса (типы: DISCOUNT — скидка, SCORING — баллы). Бот работает с типами DISCOUNT и SCORING.
* '''Организация (магазин)''' — точка обслуживания, владеющая программами лояльности.
* '''Программа лояльности (ПЛ)''' — сущность API <code>LoyaltyV2</code> (типы: DISCOUNT, COUPON, SCORING, GIFT). Бот работает только с <code>DISCOUNT</code> и <code>SCORING</code>.
* '''Идентификационный QR''' — QR-код со значением номера карты лояльности, который покупатель предъявляет продавцу.
* '''Идентификационный QR''' — QR-код со значением номера карты лояльности, который покупатель предъявляет продавцу.
* '''Меню бота''' — набор кнопок: «Карта покупателя», «Баланс», «Покупки», «НАЧАТЬ РАБОТУ».
* '''Токен бота''' — ключ доступа, который подтверждает право управлять ботом.

Версия 18:28, 6 августа 2026

Инструкция по подключению бота лояльности

Оглавление

1. Что нужно от вас

Для подключения бота лояльности вам достаточно подготовить два (или три) значения:

  1. ИНН организации — по нему мы самостоятельно найдём organization_id.
  2. Токен Telegram-бота — как получить, см. раздел 2.
  3. Токен MAX-бота — необязательно; как получить, см. раздел 3.

Больше от вас ничего не требуется: настройка, запуск и обслуживание выполняются на нашей стороне.

Note.svg Важно
Учётная запись БИФИТ Касса, от имени которой будет работать бот, должна иметь максимальное количество прав — право создавать, редактировать и удалять документы, справочники, клиентов и карты лояльности.

2. Получение токена Telegram-бота

  1. Откройте мессенджер Telegram.
  2. Найдите бота @BotFather и откройте с ним чат.
  3. Отправьте команду /newbot.
  4. Следуйте подсказкам BotFather: введите имя бота и его уникальный адрес (username), который заканчивается на bot, например my_shop_loyalty_bot.
  5. После создания BotFather выдаст токен вида 123456:ABC-DEF123....

Скопируйте этот токен и передайте его нам. Это единственное, что нужно сделать в Telegram.

Note.svg Обратите внимание
Токен выдаётся только один раз при создании бота. Сохраните его в надёжном месте — это ключ доступа к вашему боту.

Дополнительно вы получите прямую ссылку на бота вида https://t.me/имя_бота. Её нужно будет разместить в зоне видимости покупателя в виде QR-кода (мы поможем это настроить).

3. Получение токена MAX-бота (необязательно)

Этот шаг нужен только если вы хотите, чтобы магазин обслуживался ещё и ботом в MAX. Если нет — пропустите раздел.

  1. Войдите на портал MAX (или API-платформу MAX) под учётной записью организации.
  2. Зарегистрируйте нового бота в соответствии с правилами платформы MAX.
  3. Получите токен MAX-бота и, при необходимости, логин, пароль и другие параметры доступа, которые запросит платформа.

Скопируйте полученный токен и передайте его нам.

Note.svg Примечание
Если токен MAX-бота не передан — магазин будет обслуживаться только ботом в Telegram. MAX-канал подключается только при наличии токена.

Также вы получите прямую ссылку на MAX-бота — её разместят в зоне видимости покупателя в виде QR-кода.

4. Что дальше

После того как вы передали нам ИНН организации и токены ботов:

  • мы найдём organization_id по ИНН;
  • настроим и запустим бота;
  • пришлём вам QR-коды для размещения в зоне продажи.

Ваши покупатели смогут делиться контактом, получить идентификационный QR-код, смотреть баланс и историю покупок.

5. Глоссарий

  • Покупатель — конечный участник программы лояльности; работает в боте.
  • Программа лояльности (ПЛ) — сущность API БИФИТ Касса (типы: DISCOUNT — скидка, SCORING — баллы). Бот работает с типами DISCOUNT и SCORING.
  • Идентификационный QR — QR-код со значением номера карты лояльности, который покупатель предъявляет продавцу.
  • Токен бота — ключ доступа, который подтверждает право управлять ботом.