微信小程序私密消息

功能介绍

微信小程序私密消息功能是这样一种能力:当分享者分享微信小程序卡片给其他用户或者微信群后,其他用户点击此微信小程序卡片时,开发者可以鉴别出点击卡片的用户是否被分享者分享过微信小程序卡片。

使用说明

1. 分享

创建业务活动后、分享微信小程序消息前,需要通过后台接口 createActivityId 创建activityId,建立一个activityId与一个业务活动id唯一关联。

然后通过 wx.updateShareMenu 接口声明本次分享的消息为私密消息,私密消息具有不可二次转发性。

声明完成后,可以通过右上角菜单、分享按钮组件、wx.shareAppMessage(仅小游戏)分享私密消息给个人、群聊。

场景一: 个人分享给个人

A –> B

场景二: 个人分享给群

A –> [B, C, D, E]

示例代码

wx.updateShareMenu({
  withShareTicket: true,
  isPrivateMessage: true,
  activityId: 'xxx',
})

2. 验证

从群聊、单聊消息卡片进入微信小程序时,通过 wx.authPrivateMessage 接口可以验证当前用户是否是私密消息的接收者,即验证这条消息是否是A直接转发给B或者A转发给B所在的群

该接口使用前,需要通过 wx.login() 接口登录微信小程序。

接口参数

参数 类型 说明
shareTicket string shareTicket

success回调

参数 类型 说明
valid Boolean 验证是否通过
iv String 加密算法的初始向量,详细见加密数据解密算法
encryptedData String 经过加密的activityId,解密后可得到原始的activityId。若解密后得到的activityId可以与开发者后台的活动id对应上则验证通过,否则表明valid字段不可靠(被篡改) 详细见加密数据解密算法

注意事项

  • 若返回的valid字段为false,表示此次验证不通过。
  • 若返回的valid字段为true,表示验证通过。但是为了安全起见,预防valid字段被篡改的可能,可以把encryptedDataiv传到开发者后台去解密。若解密后得到的activityId就是当前活动所对应的activityId 则验证通过,否则表示验证不通过。
  • 当私密消息分享给群时,是按鉴别时刻用户是否在群里作为判断。
  • activityId创建后7天内分享有效,120天内验证有效。

示例代码

wx.authPrivateMessage({
  shareTicket: 'xxxxxx',
  success(res) {
    console.log('authPrivateMessage success', res)
    // res
    // {
    //   errMsg: 'authPrivateMessage:ok'
    //   valid: true
    //   iv: 'xxxx',
    //   encryptedData: 'xxxxxx'
    // }
  },
  fail(res) {
    console.log('authPrivateMessage fail', res)
  }
})

动态消息

从基础库 2.4.0 开始,支持转发动态消息。动态消息对比普通消息,有以下特点:

  1. 消息发出去之后,开发者可以通过后台接口修改部分消息内容。
  2. 消息有对应的提醒按钮,用户点击提醒按钮可以订阅提醒,开发者可以通过后台修改消息状态并推送一次提醒消息给订阅了提醒的用户

消息属性

动态消息有状态、文字内容、文字颜色、系统消息提醒。

模板

动态消息目前有两个模板,应用于组队场景,分别以‘开始时’和‘到齐时’为状态变更和提醒节点。

变更和提醒节点 模板ID
开始时 21B034D08C5615B9889CE362BB957B1EE69A584B
到齐时 666F374D69D16C932E45D7E7D9F10CEF6177F5F5

状态

每个模板有三个状态,分别有其对应的文字内容和颜色。其中状态 0 可以转移到状态 0 和 1 和 2,状态 1 可以转移到状态 2,状态 2 不可以转移。

‘开始时’

状态 文字内容 颜色 允许转移的状态
0 “成员正在加入,当前 {member_count}/{room_limit} 人” #10AEFF 0, 1, 2
1 “已开始” #07C160 2
2 “已结束” #CCCCCC

‘成员到齐时’

状态 文字内容 颜色 允许转移的状态
0 “成员正在加入,当前 {member_count}/{room_limit} 人” #10AEFF 0, 1, 2
1 “已到齐” #07C160 2
2 “已结束” #CCCCCC

保持状态 0 无数据传入或状态 1 24h后自动进入状态 2。

状态参数

每个状态转移的时候可以携带参数,具体参数说明如下。

参数 类型 说明
member_count string 状态 0 时有效,文字内容模板中 member_count 的值
room_limit string 状态 0 时有效,文字内容模板中 room_limit 的值
path string 状态 1 时有效,点击「进入」启动微信小程序时使用的路径。对于小游戏,没有页面的概念,可以用于传递查询字符串(query),如 "?foo=bar"
version_type string 状态 1 时有效,点击「进入」启动微信小程序时使用的版本。有效参数值为:develop(开发版),trial(体验版),release(正式版)

系统消息

用户点击含动态消息的卡片退出微信小程序后会下发系统消息,状态转移的时候会变更系统消息内容或下发新的系统消息,具体的消息内容如下。

模板 内容
开始时 1.开始时,请提醒我 2.开始时,将收到提醒 3.已开始,进入“微信小程序”
到齐时 1.成员到齐时,请提醒我 2.成员到齐时,将收到提醒 3.成员已到齐,进入“微信小程序

使用方法

一、创建 activity_id

每条动态消息可以理解为一个活动,活动发起前需要通过 createActivityId 接口创建 activity_id。后续转发动态消息以及更新动态消息都需要传入这个 activity_id

二、在转发之前声明消息类型为动态消息

通过调用 wx.updateShareMenu 接口,传入 isUpdatableMessage: true,以及 templateInfoactivityId 参数。其中 activityId 从步骤一中获得。

wx.updateShareMenu({
  withShareTicket: true,
  isUpdatableMessage: true,
  activityId: '', // 活动 ID
  templateInfo: {
    parameterList: [{
      name: 'member_count',
      value: '1'
    }, {
      name: 'room_limit',
      value: '3'
    }]
    templateId: '21B034D08C5615B9889CE362BB957B1EE69A584B'
  }
})

三、修改动态消息内容

动态消息发出去之后,可以通过 setUpdatableMsg 修改消息内容。

低版本兼容

对于不支持动态消息的客户端版本,收到动态消息后会展示成普通消息

转发

获取更多转发信息

通常开发者希望转发出去的微信小程序被二次打开的时候能够获取到一些信息,例如群的标识。现在通过调用 wx.showShareMenu 并且设置 withShareTickettrue ,当用户将微信小程序转发到任一群聊之后,此转发卡片在群聊中被其他用户打开时,可以在 App.onLaunch 或 App.onShow 获取到一个 shareTicket。通过调用 wx.getShareInfo 接口传入此 shareTicket 可以获取到转发信息。

页面内发起转发

基础库 1.2.0 开始支持,低版本需做兼容处理。

通过给 button 组件设置属性 open-type="share",可以在用户点击按钮后触发 Page.onShareAppMessage 事件,相关组件:button。

使用指引

转发按钮,旨在帮助用户更流畅地与好友分享内容和服务。转发,应是用户自发的行为,且在需要时触手可及。开发者在使用时若遵从以下指引,会得到更佳的用户体验。

  1. 含义清晰:明确、一目了然的图形按钮,将为用户减少理解的时间。在我们的资源下载中心,你可以找到这样的按钮素材并直接使用。或者你可以根据自己业务的设计风格,灵活设计含义清晰的按钮的样式。当然,你也可以直接使用带文案的按钮,“转发给好友”,它也足够明确。
  2. 方便点击:按钮点击热区不宜过小,亦不宜过大。同时,转发按钮与其他按钮一样,热区也不宜过密,以免用户误操作。
  3. 按需出现:并非所有页面都适合放置转发按钮,涉及用户隐私的非公开内容,或可能打断用户完成当前操作体验的场景,该功能并不推荐使用。同时,由于转发过程中,我们将截取用户屏幕图像作为配图,因此,需要注意帮助用户屏蔽个人信息。
  4. 尊重意愿:理所当然,并非所有的用户,都喜欢与朋友分享你的微信小程序。因此,它不应该成为一个诱导或强制行为,如转发后才能解锁某项功能等。请注意,这类做法不仅不被推荐,还可能违反我们的《运营规范》,我们强烈建议你在使用前阅读这部分内容。

以上,我们陈列了最重要的几点,如果你有时间,可以完整浏览《设计指南》,相信会有更多的收获。

注意事项

  1. 不自定义转发图片的情况下,默认会取当前页面,从顶部开始,高度为 80% 屏幕宽度的图像作为转发图片。
  2. 转发的调试支持请查看 普通转发的调试支持 和 带 shareTicket 的转发
  3. 转发非私密消息时,只有转发到群聊中打开才可以获取到 shareTicket 返回值,单聊没有 shareTicket。转发私密消息时,群聊和单聊都可获取到 shareTicket。私密消息详见 私密消息使用指南
  4. shareTicket 仅在当前微信小程序生命周期内有效
  5. 由于策略变动,微信小程序群相关能力进行调整,开发者可先使用 wx.getShareInfo 接口中的群 ID 进行功能开发。
  6. 微信7.0.12开始,支持群主转发微信小程序时同时把消息设为该群的群待办消息,群待办消息会以气泡形式出现在聊天窗口底部。默认每次转发一个群待办消息,都会生成一个待办消息气泡。通过 wx.updateShareMenu 接口修改toDoActivityId属性可以把多个待办消息聚合为同一个,即转发相同toDoActivityId的群待办消息,只会出现一个待办消息气泡。toDoActivityId需要在转发前通过 updatableMessage.createActivityId 接口创建。