Как реализовать пользовательскую кнопку действия в LINE MINI App
Пользовательская кнопка действия в LINE MINI App размещается внутри приложения и открывает окно выбора получателей. Пользователь выбирает друзей, группы или чаты, после чего liff.shareTargetPicker() отправляет подготовленную разработчиком карточку от имени пользователя. Для корректной реализации нужны формат Flex Message по правилам LINE, постоянные ссылки и отдельная обработка успешной отправки, отмены и ошибки.
Главное
- Встроенная кнопка в заголовке автоматически делится текущей страницей; кнопка в теле MINI App позволяет управлять содержимым карточки.
- Кнопка доступна как непроверенным, так и проверенным LINE MINI Apps. Это не разрешение на production Service Messages.
- Пользователь должен войти в LINE, а share target picker нужно включить в LINE Developers Console.
- Для пользовательской карточки нужен один Flex Message
bubble;carouselне допускается. - Только
{ status: "success" }означает отправку. Resolve без объекта результата означает отмену пользователем.
Чем кнопка отличается от других способов отправки LINE
Официальное руководство по custom action button разделяет два элемента. Встроенная кнопка в заголовке управляется LINE, делится открытой страницей и не позволяет менять сообщение. Пользовательская кнопка находится в теле приложения и передаёт в окно выбора получателей сформированную приложением карточку.
| Критерий | Custom action button | Service Message | Messaging API |
|---|---|---|---|
| Инициатор | Пользователь нажимает кнопку и выбирает получателей | Сервер отправляет уведомление после допустимого действия в MINI App | Official Account отвечает или отправляет сообщение |
| API | liff.shareTargetPicker() в MINI App | Service Message API на сервере | Messaging API на сервере |
| Отправитель для получателя | Пользователь, который делится | Региональный чат уведомлений MINI App | LINE Official Account |
| Проверка MINI App | Доступно обоим статусам | Для production нужна проверенная MINI App | Действуют правила Official Account |
Границы статусов описаны в сравнении проверенных и непроверенных MINI Apps, а выбор между уведомлениями — в сравнении Service Messages и Messaging API. Пользовательская кнопка не предоставляет права этих API.
Чек-лист реализации custom action button
1. Включите share target picker
Инициализируйте LIFF, убедитесь, что пользователь вошёл в систему, и включите share target picker в LINE Developers Console. Эти условия перечислены в LIFF API Reference.
Перед показом кнопки проверьте liff.isApiAvailable("shareTargetPicker"). Во внешнем мобильном браузере нужен сеанс SSO; одного auto login может быть недостаточно, и вместо picker появится форма входа по email. Отдельно протестируйте LIFF browser и реальный внешний маршрут.
2. Соберите Flex Message по заданному формату
LINE требует один контейнер bubble и запрещает carousel для этой карточки. Нужны заголовок, подзаголовок или список деталей, блок кнопок и фирменный footer. Следуйте свойствам компонентов из официального примера, а не воспринимайте его как свободный шаблон.
Допускается до трёх кнопок. Как минимум одна должна открывать страницу с подробностями. Footer показывает значок и название MINI App и ведёт на главную страницу.
3. Используйте постоянные ссылки для внутренних страниц
Для возврата на конкретный экран MINI App не подставляйте обычный endpoint URL сайта. Официальное руководство по permanent links даёт формулу:
LIFF URL + (URL страницы MINI App - Endpoint URL) = permanent link
Если LIFF URL — https://miniapp.line.me/123456-abcdefg, а страница — https://example.com/orders/42?from=share, результат будет таким:
https://miniapp.line.me/123456-abcdefg/orders/42?from=share
Ссылка может содержать path, query и hash. Проверьте её внутри LINE для состояния без авторизации, истёкшего заказа и удалённого объекта. Встроенная кнопка создаёт ссылку текущей страницы автоматически; для пользовательской карточки это делает приложение.
4. Вызывайте API по явному нажатию
Данные карточки должны поступать из проверенной сервером бизнес-записи, а не напрямую из параметров URL.
async function shareItem(messages) {
if (!liff.isApiAvailable("shareTargetPicker")) {
return { outcome: "unavailable" };
}
try {
const result = await liff.shareTargetPicker(messages);
return result?.status === "success"
? { outcome: "shared" }
: { outcome: "cancelled" };
} catch (error) {
return { outcome: "failed", error };
}
}
Массив messages должен содержать Flex Message bubble, соответствующий актуальному руководству LINE.
5. Разделяйте успех, отмену и ошибку
| Результат | Поведение API | Реакция интерфейса |
|---|---|---|
| Отправлено | Resolve с { status: "success" } | Сообщить о завершении действия, не о просмотре получателем |
| Отменено | Resolve без объекта | Вернуться без сообщения об ошибке |
| Ошибка до показа picker | Reject с LiffError | Записать безопасный код и предложить повторить |
LINE не предоставляет число получателей. Нельзя превращать успешный результат в метрику доставки, просмотров или конверсий.
6. Проведите проверку на устройствах
Проверьте вход и отсутствие входа, LIFF browser и внешний мобильный браузер, включённый и выключенный picker, одного и нескольких получателей, отмену, рабочую и устаревшую deep link, длинный локализованный текст. OpenChat не входит в список доступных получателей.
Где подходит UnifyPort
UnifyPort не реализует liff.shareTargetPicker(), интерфейс выбора получателей, формат карточки или аналитику адресатов. Это официальные функции LINE MINI App и LIFF.
UnifyPort решает другую задачу: получение обычного сообщения клиентом на подключённый LINE-аккаунт. Поддерживаемые сообщения приходят как нормализованные события message.received. При наличии signing_secret доставка содержит X-Device-Timestamp и X-Device-Signature для проверки HMAC-SHA256.
Если общая страница позже приводит к обращению в поддержку, храните действие share, ID заказа или кампании и входящий диалог отдельно, связывая их в своей системе. Перед интеграцией изучите авторизацию LINE и матрицу поддержки сообщений.
Ограничения и компромиссы
- Для простого обмена текущей страницей лучше встроенная кнопка заголовка.
- Пользовательская кнопка нужна для направляемой карточки, но требует больше проверок layout, ссылок, входа и устройств.
- Она не отправляет без действия пользователя, не выбирает получателей автоматически и не доказывает доставку.
- Она не заменяет Service Messages, Messaging API, Official Account или входящую поддержку.
FAQ
Может ли непроверенная LINE MINI App использовать custom action button?
Да. Текущая матрица LINE разрешает эту функцию обоим статусам. Production Service Messages остаются отдельной функцией только для проверенных MINI Apps.
Чем встроенная кнопка отличается от пользовательской?
Встроенная кнопка делится текущей страницей без настройки содержания. Пользовательская передаёт подготовленную карточку в liff.shareTargetPicker().
Можно ли получить число получателей?
Нет. LINE не собирает и не предоставляет это число для share target picker.
Почему Promise завершился без status?
Пользователь закрыл окно до отправки. API завершает Promise без объекта результата; это отмена, а не ошибка.
Какую ссылку использовать для страницы деталей?
Для любой страницы кроме главной используйте permanent link с нужными path, query или hash.
Следующий шаг
Сверьте карточку и тесты с официальным руководством LINE. Если отдельно нужно получать обычные сообщения LINE, начните с руководства авторизации UnifyPort.
Источники
Официальные материалы LINE проверены 8 августа 2026 года: