← 所有文章
指南

LINE MINI App 自定义操作按钮实现指南

LINE MINI App 自定义操作按钮是放在应用正文里的主动分享入口。用户点击后选择好友、群组或聊天,liff.shareTargetPicker() 再以用户身份发送开发者准备的分享卡片。实现时应遵循 LINE 指定的 Flex Message 格式,为详情页使用永久链接,并把成功、取消和调用失败当作三种不同结果。

核心结论

  • 顶部内置操作按钮自动分享当前页面;正文里的自定义操作按钮可以控制分享卡片内容。
  • 未认证和已认证的 LINE MINI App 都可使用自定义操作按钮,它与生产环境 Service Message 资格无关。
  • 用户必须已登录,并且需要在 LINE Developers Console 启用 share target picker。
  • 自定义分享卡片使用一个 Flex Message bubble,不能使用 carousel
  • 只有 { status: "success" } 表示完成分享;Promise 成功结束但没有结果对象表示用户取消。

自定义操作按钮解决什么问题

LINE 官方的自定义操作按钮指南区分了两种入口。Header 里的内置按钮由 LINE 展示,只分享当前页面,行为和内容不可定制。应用正文里的自定义按钮则可将开发者构造的消息交给目标选择器。

维度自定义操作按钮Service MessageMessaging API
触发者用户点击并选择接收人用户完成合资格操作后由服务端通知Official Account 回复或主动发送
主要 APIMINI App 内的 liff.shareTargetPicker()服务端 Service Message API服务端 Messaging API
接收方看到的发送者分享的用户地区对应的 MINI App 通知聊天LINE Official Account
认证边界未认证和已认证均可用生产环境需要已认证 MINI App遵循 Official Account 条件

如果要判断未认证功能边界,请看未认证与已认证 MINI App 对比;如果要选择通知方案,请看Service Message 与 Messaging API 对比。自定义按钮不会获得这两类消息的发送权限。

LINE MINI App 自定义操作按钮实现清单

1. 启用 share target picker

先正常初始化 LIFF,确认用户已登录,再在 LINE Developers Console 启用 share target picker。官方 LIFF API Reference明确列出这两个条件。

显示按钮前调用 liff.isApiAvailable("shareTargetPicker")。在手机外部浏览器里,目标选择器还依赖 SSO 登录会话;仅有 auto login 时可能出现邮箱登录界面。应分别测试 LIFF browser 和真实用户会走的外部浏览器路径。

2. 按 LINE 规则构造 Flex Message

自定义分享必须使用单个 Flex Message bubble,不能使用 carousel。卡片需要标题、subtitle 或 detail、按钮区以及品牌 footer。不要把示例当成可任意修改的 Flex 画布,应逐项遵循官方指定的组件属性。

按钮最多三个,至少一个要打开被分享内容的详情页。Footer 展示 MINI App 图标和名称,并通过 URI action 返回应用首页。

3. 详情页使用永久链接

需要重新打开 MINI App 内具体页面时,不应直接放普通网站的 endpoint URL。LINE 的永久链接文档给出的公式是:

LIFF URL +(MINI App 页面 URL - Endpoint URL)= 永久链接

假设 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 内测试未登录、订单过期和内容被删除等状态。Header 内置按钮会自动生成当前页面的永久链接,自定义卡片里的按钮则要自行生成。

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 仍需使用当前 LINE 指南规定的 Flex Message bubble

5. 区分成功、取消和错误

结果API 行为产品处理
已分享返回 { status: "success" }只提示分享操作完成,不宣称对方已查看
用户取消Promise resolve,但没有结果对象安静返回原页面,不弹错误
选择器显示前失败Promise reject 并返回 LiffError记录安全错误码,提供重试或内置分享入口

LINE 不提供目标选择器的接收人数。不要把成功结果包装成送达人数、浏览量或转化数据。

6. 做真机验收

至少覆盖:已登录/未登录、LIFF browser/手机外部浏览器、配置开启/关闭、单人/多人目标、取消、有效/过期深层链接,以及较长的中文内容。可选目标包括好友、群组和聊天,不包括 OpenChat。

UnifyPort 适合哪一段

UnifyPort 不实现 liff.shareTargetPicker(),也不创建 LINE 的目标选择器、校验 Flex Message 布局或提供分享对象分析。这些都属于 LINE MINI App 与 LIFF 官方能力。

UnifyPort 承接的是另一种动作:客户向已连接的普通 LINE 账号发送消息。支持的消息可作为标准化 message.received 事件到达;Webhook endpoint 配置 signing_secret 后,可用 X-Device-TimestampX-Device-Signature 验证 HMAC-SHA256 签名。

当分享页面后续产生客服对话时,建议把分享动作、订单或活动 ID、入站会话保存为独立记录,再由业务系统关联。实施前查看 LINE 授权指南消息支持矩阵

局限与取舍

  • 只需分享当前页面时,优先使用自动生成永久链接的 Header 内置按钮。
  • 只有需要引导式分享卡片时再使用自定义按钮,因为它增加布局、链接、登录和设备测试工作。
  • 不能静默发送、自动选择接收人、确认送达或获取接收人数。
  • 它不是 Service Message、Messaging API、Official Account 或客服入站的替代方案。

FAQ

未认证 LINE MINI App 可以使用自定义操作按钮吗?

可以。LINE 当前功能矩阵将自定义操作按钮列为未认证与已认证均可用。生产环境 Service Message 仍是另一项只对已认证应用开放的能力。

内置操作按钮和自定义操作按钮有什么区别?

内置 Header 按钮分享当前页面,内容不可修改;自定义正文按钮把符合指南的开发者消息传给 liff.shareTargetPicker()

能获得分享接收人数吗?

不能。LINE 出于隐私原因不收集也不提供目标选择器分享的接收人数。

为什么 Promise resolve 后没有 status

用户在发送前关闭目标选择器时,Promise 会 resolve,但没有结果对象。应当识别为取消,而不是 API 错误。

详情按钮应该用哪个 URL?

除首页外都应使用永久链接。它可以包含 path、query 或 hash,并把用户带回 MINI App 内对应页面。

下一步

先按 LINE 官方自定义操作按钮实现指南完成卡片和真机测试。如果还需要接收普通 LINE 客户消息,再从 UnifyPort LINE 授权指南开始评估独立路径。

来源

以下 LINE 官方资料核验于 2026-08-08: