微信小程序加密网络通道

从基础库 2.17.3 开始支持

一、功能介绍

在前后端开发联调过程中,开发者通常会使用代理软件对自己开发的项目服务做请求转发,便于切换开发环境和进行测试。

代理软件可以在 客户端 与 真实服务器 之间进行数据传输。

这时,代理软件可以解密并查看通过 SSL 加密的数据,然后再重新加密数据发送给原始目的地。对于客户端和服务器来说,它们仍然认为自己处于一个安全的加密连接中,实际上数据的安全性已被破坏。

除了监听之外,由于代理软件可以解密 SSL 加密的通信,因此也支持修改传输中的数据,甚至插入恶意内容。上述这种中间人代理,也会被不法分子恶意使用,用于任意监听自己设备中的所有请求。

他们会在自己的设备中运行其他开发者开发的「微信小程序」、「WEB 网页」 或「原生APP」,然后通过中间代理获取和篡改正常请求的「请求包」和「响应包」,并有针对的对目标请求进行重放,用于实现恶意的目的(比如刷经验、修改游戏结果、创建 1 分钱订单等)。

为了防止中间人代理攻击,我们就需要在 SSL 加密的基础上,对请求包和响应包的明文再进行一次加密,这种方法可以提供额外的安全层次,保障数据即使在被代理软件解密后仍保持安全。

目前微信团队针对加密网络通道提供两种解决方案:

  1. API 自实现方案: 微信平台维护了一个用户维度的可靠 Key,开发者可以分别通过微信小程序前端 API 和微信后台提供的服务端接口获取到,并自己实现对请求包的加密。
  2. 微信网关方案: 微信团队结合多年安全防护经验积累推出的微信网关,具备系统化、多层级的安全防护能力。开发者接入后,就会将「微信小程序」到「开发者服务端」的通信链路自动从公网链路切换到微信专线链路,并且全程对请求内容进行二层加密,有效防止中间人代理攻击。

获取加密 key 信息需要向微信平台发送请求,产生耗时,从而对业务性能产生负担。如开发者希望安全加密的同时减少业务无关的耗时,可以使用微信网关方案。

二、API 自实现方案

为了避免微信小程序与开发者后台通信时数据被截取和篡改,微信平台维护了一个用户维度的可靠 Key,用于微信小程序和后台通信时进行加密和签名。

开发者可以分别通过微信小程序前端 API 和微信后台提供的服务端接口,获取到用户加密 key。

微信平台只提供可靠的加密 key,开发者需自行实现加密方式,对向服务端接口请求的数据进行端处加解密。

在微信小程序中开发者可以使用UserCryptoManager.getLatestUserKey获取获取用户最新的加密密钥信息。

2.1 前端调用示例

const somedata = 'xxxxx'
const userCryptoManager = wx.getUserCryptoManager()
userCryptoManager.getLatestUserKey({
    success({encryptKey, iv, version, expireTime}) {
        const encryptedData = someAESEncryptMethod(encryptKey, iv, somedata)
        wx.request({
           data: encryptedData,
           success(res) {
                const decryptedData = someAESDEcryptMethod(encryptKey, iv, res.data)
                console.log(decryptedData)
           }
        })
    }
})

someAESEncryptMethod 和 someAESDEcryptMethod 分别为加解密函数,由开发者自行引入加解密库来实现,基础库暂时不提供加解密能力。

开发者可参考开源加密库: https://github.com/flash1293/aes-wasm https://github.com/ricmoo/aes-js

根据自身业务情况,寻找合适的加密方式:

  • 非对称加密: 客户端和服务器维护两组公私加密密钥,每次接口请求时,先对明文数据进行加密,另一方收到密文后用对应的反向密钥解密。常见的非对称加密有 RSA、DSA、ECC,非对称加密安全性高,但加解密速度慢,不太适合请求体或响应体太大的情况。
  • 对称加密: 客户端和服务端维护一组密钥,每次接口请求时,对明文数据进行加密,另一方收到时用同样的密钥解密。常见的对称加密有 DES、3DES、IDEA、RC5、RC6、Blowfish,对称加密加解密速度快,适合对大数据做加解密处理,安全性有所下降。
  • 整合方案: 请求时,客户端对明文用对称加密方式加密,对称密钥随机生成,然后用非对称加密方式加密前面的对称密钥,最后将密文和加密后的对称密钥内容合并发出;服务端收到时,按照反向流程进行解密,响应包也是相同的处理流程。

在开发者服务端,可以调用getUserEncryptKey后台接口获取用户最近三次的key。在获取key的同时,接口会携带version信息,开发者可以比较version版本来选择使用对应的key对数据进行加解密。

2.2 服务端调用示例

curl -X POST "https://api.weixin.qq.com/wxa/business/getuserencryptkey?access_token=ACCESS_TOKEN&openid=OPENID&signature=SIGNATURE&sig_method=hmac_sha256"

三、微信网关方案

可以参考此文档接入微信网关:微信小程序一键接入微信网关

安全键盘

从基础库 2.18.0 开始支持

很多微信小程序业务需要输入一些敏感信息,比如密码口令,身份证,手机号等。不专业的做法是使用明文提交到业务后台,在网络传输中非常容易泄漏出去,同时也不满足合规要求。也有一些改进的做法,利用javascript对敏感信息进行加密,比如把明文的密码口令加密成为密文后再提交到业务后台。但因为微信小程序本质是基于H5技术,安全性不高,比如在H5上使用javascript比较容易能看到加密逻辑,或者加密强度不够,第三方输入法监听,内存遍历等,还是会造成口令泄露等问题。

为提高微信开放平台生态安全性,针对微信小程序内数字密码输入场景中可能存在的安全问题,微信侧在input组件开放了安全键盘类型。通过引入安全键盘,微信小程序可以在用户输入过程中对关键信息时进行加密,防止键盘窃听,内存保护,有效保障用户数据资产的安全。

安全键盘保护原理

安全键盘采用非对称加解密算法,该算法需要两个密钥,一个叫公钥,可以公开,另一个叫私钥,需要私密保管。其中公钥加密的密文,只有私钥才能解开,而且通过公钥没办法计算出私钥,这样黑客即使拿到公钥也没办法解密密文。我们一般把公钥放到客户端上(比如微信小程序环境)做加密,私钥放到业务后台,这样就只有后台才能解密。黑客比较容易攻击本地客户端,但是攻破后台则难很多,甚至有些业务把私钥存储到硬件加密机芯片里面,这种情况黑客更是没办法获取得到私钥,因此采用非对称加解密算法是安全键盘推荐的模式,安全性可以得到保障。 为了保证私钥的私密性价值,我们要求不同的微信小程序业务使用自己独有的公钥私钥对,这样就可以完美的做到业务加密的数据隔离,业务A的公钥加密数据,就只有业务A自己的私钥可以解开,业务A的责任就是负责保护好自己的独有私钥即可。 为了证明一个公钥是属于业务A的,我们会颁发一个数字证书给到业务A的开发者,数字证书由腾讯官方签名,保证了可靠性与不可篡改性,数字证书里面会绑定一个业务独有的公钥, 业务的私钥是在向腾讯申请数字证书的过程中产生的,业务负责管理好自己的私钥,这个过程中,腾讯仅能接触到公钥,没办法得到业务自己的私钥,意味着即使是腾讯也没办法去解密微信小程序业务的用户输入的密码口令。为了国家合规的要求,我们颁发的是国产密码算法的数字证书,意味着非对称加解密算法是使用sm2算法,而非rsa等国际算法。

不同微信小程序业务,可能要加密的数据的格式可能有不同的要求,比如当用户输入的口令是“123456”,有些业务直接对明文做加密即可, 有些业务可能想先做一个哈希处理再加密,比如使用md5(“123456”), 做了哈希后,能更有效的保护用户的明文密码,让业务都不好推测用户实际密码是什么, 另一些业务可能采用sha1哈希算法sha1(“123456”), 也有业务采用更合规的国产密码哈希算法sm3(“123456”),甚至有些业务希望加上一些混淆字符(密码学中叫加盐)到口令明文里面,做更好的保护,就可能会变成sm3(“123456+abc”), 这里面”+abc”就是额外加上的混淆字符示例。 所以为了能让不同的微信小程序业务有符合自己业务需求的加密格式,微信小程序安全键盘也开放了密码格式配置的能力,从而更好的跟自己的整体业务结合在一起,但是这个格式做不到万能兼容所有,所以当你应用微信小程序安全键盘的时候,可能会涉及部分后台验密服务的改造工作量,请提前评估可行性。

使用流程

1 生成证书签署请求

开发者可自行生成公钥私钥、证书签署请求,也可通过微信侧提供的工具生成证书签署请求。通过微信侧提供的工具(Windows / Mac)生成证书签署请求的步骤如下:

  1. 通过SM2 Generate Key Pair功能生成公钥私钥

  1. 通过SM Generate Cert CSR功能生成CSR

2 生成证书

在微信小程序管理后台「开发」-「开发管理」-「开发设置」-「安全键盘证书」板块填入CSR进行生成。

3 使用证书

  1. 将生成的证书放入微信小程序代码包中。
  2. 在input组件中设置type=“safe-password”,并设置相关参数(safe-password-cert-path、safe-password-time-stamp、safe-password-length、safe-password-nonce、safe-password-salt、safe-password-custom-hash)。

代码示例

<input 
  style="border: 1px solid blue;"
  type="safe-password"
  placeholder="123456"
  safe-password-cert-path="/minipro_test_cert.crt" 
  safe-password-time-stamp="1618390369" 
  safe-password-nonce="1618390369" 
  safe-password-salt="zefengwang" 
  safe-password-custom-hash="md5(sha1('foo' + sha256(sm3(password + 'bar'))))"
  bind:blur="onBlur"
  bind:input="onInput"
  value="{{value}}"
></input>
<button bind:tap="onClear">clear</button>

<view>{{detail}}</view>
Page({
  data: {
    value: '123'
  },
  onInput(res) {
    console.log('onInput', res)
    this.setData({
      value: res.detail.value,
    })
  },
  onClear() {
    this.setData({
      value: '',
    })
  },
  onConfirm() {
    console.log('confirm')
  },
  onBlur(res) {
    console.log('onBlur', res)
    this.setData({
      detail: JSON.stringify(res.detail, null, 2)
    })
  },
})

密文

密文格式

安全键盘为了保护用户口令,采用了各种密码学算法来保护用户敏感信息,这些算法是可以根据微信小程序业务的实际需要做灵活配置的,因为不同的微信小程序,采用的口令加密格式不同,所以有必要做符合自己业务的配置。

微信小程序安全键盘对用户密码口令加密后的通用格式如下:

'V02_' + sm2(header + timestamp + '\0' + pbkdf_hmac_hex(password, salt) + '\0' + nonce + '\0' + 随机数)

其中,pbkdf_hmac_hex()为安全键盘计算hash的算法表达式,可通过safe-password-custom-hash属性进行设置。 header前两个字节,用于标识密码hash算法:

  1. 0x00 0x00: custom hash
  2. 0x00 0x07: pbkdf_hmac_hex

这个格式考虑了几点安全因素:

  1. 防重放:传入正确的时间戳timestamp,每次加密nonce 保持自增,保证了即使口令相同,每次加密密文也不相同
  2. 防暴力破解:sm2非对称算法本身保证了防暴力破解的可能
  3. 防追溯原文:内置pbkdf_hmac_hex 算法,也可以自定义hash算法;
  4. 防彩虹表攻击:微信小程序开发者可以自定义动态salt;

微信小程序开发者如果打算使用安全键盘,首先在本地生成sm2 秘钥对,然后前往微信小程序管理后台申请微信小程序安全键盘数字证书。证书下发下来后,需要和微信小程序代码一起发布。 微信小程序调用安全键盘时,需要传入微信小程序安全键盘数字证书,完成证书合法性校验之后,再提取证书公钥并采用sm2 算法对用户数据进行加密。 由于采用证书公钥加密,只有用开发者自己持有的私钥才可以解密出数据明文。网络传输过程中,即使密文被恶意拦截,攻击者也无法拿到明文。

如何解密或验密

'V02_' + sm2(header + timestamp + '\0' + hash(password, salt) + '\0' + nonce + '\0' + 随机数)

后台接收到密文后,参照以上格式进行解析: 1、 移除密文4字节前缀; 2、 使用微信小程序安全键盘证书对应的sm2 私钥解密,得到明文数据; 3、 解析明文数据,可以得到时间戳、密码hash、nonce 等字段;

首先,微信小程序开发者后台只能得到脱敏后的密码hash,无法得到明文。当然,根据合规要求,后台也不应该获取到用户密码明文。 其次,微信小程序开发者后台应妥善保存密码hash,作为匹配用户密码是否一致的依据。比如在用户注册或修改密码流程中,后台SM2 私钥解密出密码hash 之后,应当在数据库中(或者其它存储技术)持久化保存该密码hash。在后续用户登录或其它需要校验密码的场景,通过对比用户请求过来的密码hash 和之前保存的密码hash 是否一致,来确定密码是否验证通过。

用工关系

一、功能简介

用工关系功能,支持与微信小程序有用工关系的用户能与对应的微信小程序进行绑定。绑定后

  1. 微信小程序可以向已绑定的用户推送用工关系消息通知
  2. 绑定用户将能在微信「微信小程序助手」中接收用工关系消息通知

通过这个功能,确保微信小程序在用工场景下的关键业务信息高效触达。 image.png

二、功能详情

支持基础库版本:3.10.0以上
支持微信版本:8.0.62以上

1、开通功能

  • 此功能只支持非个人主体下的物流服务/医疗服务/政务民生/金融业/教育服务/交通服务/房地产服务/生活服务/IT科技/餐饮服务/旅游服务/商家自营/商业服务类目下的微信小程序

  • 这些类目下的,可登录微信公众平台,符合类目要求即可在侧边栏找到「用工关系」,点击开通,填写申请内容后,等待审核(审核时长平均<24h)。

2、新增用工消息模版

在微信公众平台开通了用工关系功能后,可以新增所需要的用工消息模版,模版审核通过后即可使用。 image.png

3、用工关系管理接口

  • 绑定用工关系接口:wx.bindEmployeeRelation
    开发者可以通过接口,给与微信小程序有用工关系的用户调用订阅弹窗,允许后的用户,可以在「微信小程序助手」插件中收到绑定系统消息。

  • 解绑接口:UnbindUserB2CAuthInfo
    开发者可以通过接口,直接解绑已与微信小程序有用工关系的用户,用户可以在「微信小程序助手」插件中收到解绑的系统消息。

  • 检查关系接口:wx.checkEmployeeRelation
    开发者可以通过接口,检查微信小程序用工关系功能和用户之间的绑定关系

4、用工消息订阅

拉起用工消息订阅有两个时机

  1. 在用户确认绑定用工关系后,可直接让用户订阅消息,详细可见技术文档wx. bindEmployeeRelation。
  2. 已绑定用工关系后,可调用接口让用户订阅消息,详细可见技术文档wx.requestSubscribeEmployeeMessage。

5、发送用工消息

在用户已绑定用工关系,且订阅了对应用工消息的前提下,开发者可以通过SendEmployeeRelationMsg 向用户发送用工消息。用户将在「微信小程序助手」中接收到对应的消息。

三、注意事项

务必确保正确使用该功能

  • 此功能仅支持微信小程序在用工场景下的消息传递诉求,若在开发者其他场景滥用,则功能会被回收。
  • 绑定关系弹窗和订阅消息弹窗都为强监控行为场景,请提前告知用工关系的用户,确保绑定弹窗的通过率。请勿给无用工关系的用户滥发消息,滥发会回收该功能。

微信小程序聊天工具模式开发指南Beta

一、功能介绍

聊天工具模式是为了帮助微信小程序更好与微信聊天结合而推出的模式,可用于实现群问卷、群拼单、群任务等功能。其与微信小程序普通模式相比开放更多与聊天紧密结合的能力:

  1. 聊天成员相关能力:开发者可调用聊天成员选择器并获取成员相关id,通过开放数据域渲染聊天成员的头像昵称
  2. 发送内容到聊天能力:开发者可发送文本、提醒、图片、表情、视频等内容类型到聊天中
  3. 动态消息能力:微信小程序卡片上的辅标题可以动态更新,在用户完成或参与了活动后下发系统消息

同时,聊天工具模式需要使用独立分包基于skyline开发,该分包也可被普通模式打开。开发者可通过「微信小程序示例-接口Tab-聊天工具」入口体验平台推出的Demo:

二、开发指南

从基础库 3.7.8 开始支持

支持平台:Android:微信8.0.56及以上版本iOS:微信8.0.56及以上版本

1. 聊天工具分包配置

开发者需要在微信小程序全局配置 (app.json)中声明 subPackageschatTools

  1. subPackages 为分包的基本配置,属性说明可参考分包结构配置
  2. chatTools 为聊天工具配置,类型为 Object[] ,字段包括:
属性 类型 必填 说明
root string 分包根目录
entryPagePath string 聊天工具启动路径
desc string 聊天工具描述
scopes string[] 分包中会使用的scope权限

注意事项

  1. desc字段请按照自己的功能设计填写,不得包含虚假或营销信息;scopes 字段请如实填写;否则将影响微信小程序审核的结果
  2. 开发者需保证分包的首页路径进入后可以使用聊天工具的完整功能,否则将影响微信小程序审核的结果
  3. 每个微信小程序目前仅支持配置一个聊天工具,后续可能放开
  4. 聊天工具的分包体积需不超过 500KB
  5. 聊天工具分包页需使用 skyline 渲染,若开发者未配置,微信会在预览或上传代码包时提示出错

配置示例:

{
  "subPackages": [
    {
      "root": "packageA",
      "name": "alias",
      "pages": ["pages/cat"],
      "independent": true,
      "entry": "index.js",
      "componentFramework": "glass-easel",
      "renderer": "skyline",
    },
  ],
  "chatTools": [{
    "root": "packageA",
    "entryPagePath": "x",
    "desc": "功能描述",
    "scopes": ["scope.userLocation"]
  }],
  "rendererOptions": {
    "skyline": {
      "disableABTest": true,
      "defaultDisplayBlock": true,
      "defaultContentBox": true,
      "tagNameStyleIsolation": "legacy",
      "sdkVersionBegin": "3.7.0",
      "sdkVersionEnd": "15.255.255"
    }
  }
}

2. 聊天工具模式的进入与退出

2.1 进入聊天模式

聊天工具模式在进入时需要绑定一个微信单聊或群聊的聊天室,目前有三种进入方式:

  1. 当微信小程序处于普通模式时,开发者调用 wx.openChatTool 但不传入聊天室id,微信会拉起聊天列表让用户选择,用户选择后绑定聊天室进入聊天工具模式
  2. 当微信小程序处于普通模式时,开发者调用 wx.openChatTool 并在接口中传入聊天室id(群聊为opengid,单聊为open_single_roomid),会直接绑定该聊天室进入
  3. 用户在聊天工具模式里发送各种类型内容到绑定的聊天后,当用户从同一个聊天的这些内容入口再次回到微信小程序中,会使用聊天工具模式打开,此时绑定的聊天不变

2.2 退出聊天模式

聊天工具目前有三种退出方式:

  1. 在聊天工具中回到非聊天工具分包页面中(包括用户自己触发返回、开发者调用 wx.navigateBackwx.switchTab ),会触发退出聊天工具模式
  2. 微信小程序 reLaunch 到普通页面(包括用户点击其他非聊天工具模式入口、开发者调用 wx.reLaunch 等),会触发退出聊天工具模式

注意:在聊天工具分包页,无法通过 wx.navigateTo 或者 wx.redirectTo 跳转到非聊天工具分包页。如需跳转,先通过 wx.navigateBack 退出当前聊天工具分包,再使用路由接口进行跳转。

2.3 聊天工具模式的判定

开发者可通过 wx.getApiCategory 中的 apiCategory字段是否为 chatTool,判断当前是否处于聊天工具模式。

3. 聊天成员相关能力

3.1 获取相关id接口

聊天工具模式下有以下3种id信息:

  1. opengid:微信群的唯一标识id
  2. open_single_roomid:单聊的唯一标识id
  3. group_openid:微信用户在此聊天室下的唯一标识,同一个用户在不同的聊天室下id不同

相关接口如下:

  1. wx.getGroupEnterInfo:进入聊天工具模式前,获取群聊id信息
  2. wx.getChatToolInfo:进入聊天工具模式后,获取群聊id信息

这两个接口的区别在于,在聊天工具分包页,推荐用 wx.getChatToolInfo 获取绑定群相关信息即可。在进入聊天工具分包页之前,例如从群聊会话卡片打开微信小程序,此时希望复用卡片所在的群聊,可通过 wx.getGroupEnterInfo 获取卡片所在群的 opengid, 并在 wx.openChatTool 时传入,此时可不唤起群选择列表,直接进入。

3.2 选择聊天成员接口

开发者可调用wx.selectGroupMembers让用户选择聊天室的成员,并返回选择成员的group_openid。需要注意的是,若当前聊天室为单聊,则直接返回对方用户的group_openid,不再拉起选择器。

3.3 渲染聊天成员的头像昵称

开发者可通过 open-data-listopen-data-item 渲染聊天成员的头像昵称

4. 发送到聊天能力

可将微信小程序卡片、提醒消息、文本、图片、表情、文件发送到聊天中,相关接口如下:

  1. wx.shareAppMessageToGroup:将微信小程序卡片发送到绑定的聊天室
  2. wx.notifyGroupMembers:提醒用户完成任务,发送的内容将由微信拼接为:@的成员列表+“请完成:”或“请参与:”+打开微信小程序的文字链,如「@alex @cindy 请完成:团建报名统计」
  3. form bind:submitToGroup="onSubmitToGroup"button form-type="submitToGroup":将输入框内的文本内容发送到绑定的聊天室
  4. wx.shareImageToGroup:将图片发送到绑定的聊天室
  5. wx.shareEmojiToGroup:将表情发送到绑定的聊天室
  6. wx.shareVideoToGroup:将视频发送到绑定的聊天室
  7. wx.shareFileToGroup:将文件发送到绑定的聊天室

5. 动态消息能力

从聊天模式中发送的微信小程序卡片,可以获得动态消息能力,该能力的用户表现包括:

  1. 微信小程序卡片上的辅标题可以动态更新
  2. 可以在聊天中下发系统消息,内容为:成员A+“完成了”或“参与了”+成员B+“发布的”+打开微信小程序的文字链,如「alex 完成了 cindy 发布的 团建报名统计」

该功能的开发步骤包括:

5.1 创建activity_id

服务端通过创建activity_id接口创建activity_id

5.2 声明分享卡片为动态消息

前端通过 wx.updateShareMenu 声明要分享的卡片为动态消息,请求参数如下:

注意事项:

  1. useForChatTooltrue 时,chooseTypeparticipant 才会生效
  2. chooseType = 1,表示按指定的 participant 当作参与者
  3. chooseType = 2,表示群内所有成员均为参与者(包括后加入群)

代码示例:

wx.updateShareMenu({
        withShareTicket: true,
        isUpdatableMessage: true,
        activityId: 'xxx',
        useForChatTool: true,
        chooseType: 1,
        participant: that.data.members,
        templateInfo: {
          templateId:    '4A68CBB88A92B0A9311848DBA1E94A199B166463'
        },
)

模版区别(target_state与participator_state含义见步骤3):

templateId 4A68CBB88A92B0A9311848DBA1E94A199B166463 2A84254B945674A2F88CE4970782C402795EB607
动态消息发布者在微信小程序卡片中看到的辅标题 target_state=1或2:X人已完成;target_state=3:已结束 target_state=1或2:X人已参与;target_state=3:已结束
参与者在微信小程序卡片中看到的辅标题 participator_state=0时:target_state=1:未完成,target_state=2:即将截止,target_state=3:已结束;participator_state=1时:target_state=1或2:已完成,target_state=3:已结束。 participator_state=0时:target_state=1:未参与,target_state=2:即将截止,target_state=3:已结束;participator_state=1时:target_state=1或2:已参与,target_state=3:已结束。
非参与者在微信小程序卡片中看到的辅标题 target_state=1或2:你无需完成;target_state=3:已结束 target_state=1或2:你无需参与;target_state=3:已结束
参与者变为完成态下发的系统消息文案 aaa 已完成 bbb 发布的 XXX aaa 已参与 bbb 发布的 XXX

5.3 更新活动状态或用户完成情况

服务端通过 setChatToolMsg 接口更新活动状态或用户完成情况。

也可通过云开发调用,接口名 chattoolmsg.send

调用示例:

//变更单个成员状态
{
    "activity_id": "xxx",
    "target_state":1,
    "version_type": 0,
    "participator_info_list": [
        {
            "group_openid": "aaa",
            "state": 1
        },
        {
            "group_openid": "bbb",
            "state": 1

        }
    ]
}
//变更动态消息状态
{
    "activity_id": "xxx",
    "target_state":3,
    "version_type": 0,
}

6. 聊天工具模式内禁用的能力

以下能力暂不支持聊天工具模式下使用,请开发者做好适配。

  1. 聊天工具模式禁用普通转发能力,请使用上文「发送到聊天能力开放」中的接口实现:button open-type=share 和 微信小程序右上角「…-发送给朋友」
  2. 聊天工具模式希望服务尽可能闭环在微信小程序中,外跳类接口暂不支持使用:
    • navigateToMiniProgram;
    • openEmbeddedMiniProgram;
    • openOfficialAccountArticle;
    • openChannelsUserProfile;
    • openChannelsLive;
    • openChannelsEvent;
    • openChannelsActivity。
  3. 聊天工具模式暂不支持广告:adad-custom

微信小程序聊天工具开放模式开发指南

一、功能介绍

聊天工具模式是为了帮助微信小程序更好与微信聊天结合而推出的模式,可用于实现群问卷、群拼单、群接龙等功能。其与微信小程序普通模式区别在于:

1.  开放更多与聊天紧密结合的能力:

能力 说明 图示
聊天成员相关能力 开发者可调用聊天成员选择器并获取成员相关id,通过open-data渲染聊天成员的头像昵称
发送内容到聊天能力 开发者可发送文本、提醒、图片、表情、视频等内容类型到聊天中
动态消息能力 微信小程序卡片上的辅标题可以动态更新,在用户完成/参与了活动后下发系统消息

支持有「交易保障」标识的微信小程序,或「社交」、「金融-证券/期货」、「金融-公募基金」、「金融-银行」类目的微信小程序申请相关接口权限。开发者需要登录微信小程序管理后台 ,在「管理-开发管理-其他接口-聊天工具」中申请获得接口权限,审核通过后可使用。

二、开发指南

从基础库 3.12.0 版本开始支持

支持平台:iOS 8.0.65 及以上版本;Android 8.0.65 及以上版本

1. 进入聊天工具模式

开发者调用 wx. enterChatToolMode 后,可选择在 chatToolRooms 传入 opengid 以进入聊天模式,并获得聊天成员相关接口的调用权限;如果未传入 opengid,则将拉起群聊选择器;

开发者可通过 wx.isChatTool 判断当前是否处于聊天工具模式;

聊天工具模式下应使用 group_openid 作为用户唯一标识。

1.1 wx.getGroupEnterInfo

功能描述:进入聊天工具模式前,获取群聊 id 信息

入参:

属性 类型 说明
allowSingleChat boolean 为 true 时才会返回单聊下的 open_single_roomid
needGroupOpenID boolean 为 true 时才会返回 group_openid

返回参数(数据加密返回,解密请参考:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/group/wx.getGroupEnterInfo.html):

属性 类型 说明
opengid string 群聊唯一标识,绑定的聊天室为群聊时返回
open_single_roomid string 单聊唯一标识,绑定的聊天室为单聊时返回
group_openid string 当前微信用户在此聊天室下的唯一标识,同一个用户在不同的聊天室下id不同
chat_type number 微信聊天类型,1:微信联系人单聊;2:企业微信联系人单聊;3:普通微信群聊;4:企业微信互通群聊

1.2 wx.getChatToolInfo

功能描述:进入聊天工具模式后,获取群聊 id 信息

返回参数(数据加密返回,解密请参考:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/group/wx.getGroupEnterInfo.html):

属性 类型 说明
opengid string 群聊唯一标识,绑定的聊天室为群聊时返回
open_single_roomid string 单聊唯一标识,绑定的聊天室为单聊时返回
group_openid string 当前微信用户在此聊天室下的唯一标识,同一个用户在不同的聊天室下id不同
chat_type number 微信聊天类型,1:微信联系人单聊;2:企业微信联系人单聊;3:普通微信群聊;4:企业微信互通群聊

1.3 wx.selectGroupMembers

功能描述:选择聊天室的成员,并返回选择成员的 group-openid。若当前为群聊,则会拉起成员选择器;若当前为单聊,则直接返回对方用户的 group-openid

请求参数:

属性 类型 必填 说明
maxSelectCount number 最多可选人数

返回参数:

属性 类型 说明
members string[] 所选用户在此聊天室下的唯一标识,同一个用户在不同的聊天室下 id 不同

1.4 <open-data-list> <open-data-item>

功能描述:用于渲染聊天成员的头像昵称

属性:

<open-data-list>

属性 类型 必填 说明
type string 渲染类型,固定为groupMembers
members string[] 需要展示的用户此聊天室下的唯一标识列表

<open-data-item>

属性 类型 必填 说明
type string 开放数据类型,userNickName:用户昵称;userAvatarUrl:用户头像

代码示例:

<open-data-list type="groupMembers" members="[groupOpenID1, groupOpenID2]">
  <view class="userinfo" slot:index>
    <open-data-item class="avatar " type="userAvatar" index="{{index}}" />     <open-data-item class="" type="userNickName" index="{{index}}" />
  </view>
</open-data-list>

2. 发送到聊天能力

可支持微信小程序卡片、提醒消息、文本、图片、表情、文件的发送,如果选择了多个群聊,单次仅支持将内容发送到特定的单个群聊中。

2.1 wx.shareAppMessageToGroup

功能描述:将微信小程序卡片发送到绑定的聊天室

请求参数:

属性 类型 必填 说明 默认值
title string 微信小程序卡片标题
opengid string 通过 wx.selectGroups 选择聊天后,opengid 为必填;通过wx.selectGroupMembers 选择单个聊天后,opengid 无需填写
path string 转发路径 聊天工具的 entryPagePath
imageUrl string 自定义图片路径,可以是本地文件路径、代码包文件路径或者网络图片路径。支持 PNG 及 JPG。显示图片长宽比是 5:4 使用默认截图

返回参数:

属性 类型 说明
errMsg string 错误信息

2.2 wx.notifyGroupMembers

功能描述:提醒用户完成任务,发送的内容将由微信拼接为:@的成员列表+“请完成:”/”请参与:”+打开微信小程序的文字链,如「@alex @cindy 请完成:团建报名统计」

请求参数:

属性 类型 必填 说明 默认值
title string 文字链标题
opengid string 通过 wx.selectGroups 选择聊天后,opengid 为必填;通过wx.selectGroupMembers 选择单个聊天后,opengid 无需填写
members string[] 需要提醒的用户 group-openid 列表
entrancePath string 文字链跳转路径
type string 展示的动词:participate:“请参与”;complete:“请完成”

返回参数:

属性 类型 说明
errMsg string 错误信息

2.3 form 组件

<form bind:submitToGroup="onSubmitToGroup"> <button form-type="submitToGroup">

功能描述:将输入框内的文本内容发送到绑定的聊天室,可携带返回聊天工具模式的微信小程序的小尾巴

属性:

<form>

属性 类型 必填 说明
bind:submitToGroup string 用户触发发送文本到聊天后会触发的事件

<button>

属性 类型 必填 说明 默认值
form-type string 需填入 submitToGroup,表示将文本发送到聊天
opengid string 通过 wx.selectGroups 选择聊天后,opengid 为必填;通过wx.selectGroupMembers 选择单个聊天后,opengid 无需填写
need-show-entrance boolean 是否在文本消息下展示进入微信小程序的小尾巴 true
entrance-path string 小尾巴跳转路径 聊天工具的 entryPagePath

2.4 wx.shareImageToGroup

功能描述:将图片发送到绑定的聊天室,可携带返回聊天工具模式的微信小程序的小尾巴

请求参数:

属性 类型 必填 说明 默认值
imagePath string 图片路径,可以是本地文件路径或临时路径
opengid string 通过 wx.selectGroups 选择聊天后,opengid 为必填;通过wx.selectGroupMembers 选择单个聊天后,opengid 无需填写
needShowEntrance string 是否在图片消息下展示进入微信小程序的小尾巴 true
entrancePath string 小尾巴跳转路径 聊天工具的 entryPagePath

返回参数:

属性 类型 说明
errMsg string 错误信息

2.5 wx.shareEmojiToGroup

功能描述:将表情发送到绑定的聊天室,可携带返回聊天工具模式的微信小程序的小尾巴

请求参数:

属性 类型 必填 说明 默认值
imagePath string 表情路径,可以是本地文件路径或临时路径
opengid string 通过 wx.selectGroups 选择聊天后,opengid 为必填;通过wx.selectGroupMembers 选择单个聊天后,opengid 无需填写
needShowEntrance string 是否在表情消息下展示进入微信小程序的小尾巴 true
entrancePath string 小尾巴跳转路径 聊天工具的 entryPagePath

返回参数:

属性 类型 说明
errMsg string 错误信息

2.6 wx.shareVideoToGroup

功能描述:将视频发送到绑定的聊天室,可携带返回聊天工具模式的微信小程序的小尾巴

请求参数:

属性 类型 必填 说明 默认值
videoPath string 视频路径,可以是本地文件路径或临时路径
opengid string 通过 wx.selectGroups 选择聊天后,opengid 为必填;通过 wx.selectGroupMembers 选择单个聊天后,opengid 无需填写
thumbPath string 缩略图路径,若留空则使用视频首帧
needShowEntrance string 是否在视频消息下展示进入微信小程序的小尾巴 true
entrancePath string 小尾巴跳转路径 聊天工具的 entryPagePath

返回参数:

属性 类型 说明
errMsg string 错误信息

2.7 wx.shareFileToGroup

功能描述:将文件发送到绑定的聊天室,可携带返回聊天工具模式的微信小程序的小尾巴

请求参数:

属性 类型 必填 说明 默认值
filePath string 文件路径,可以是本地文件路径或临时路径
opengid string 通过 wx.selectGroups 选择聊天后,opengid为必填;通过 wx.selectGroupMembers 选择单个聊天后,opengid 无需填写
needShowEntrance string 是否在文件消息下展示进入微信小程序的小尾巴 true
entrancePath string 小尾巴跳转路径 聊天工具的 entryPagePath

返回参数:

属性 类型 说明
errMsg string 错误信息

3. 动态消息能力

从聊天模式中发送的微信小程序卡片,可以获得动态消息能力,该能力的用户表现包括:

1.  微信小程序卡片上的辅标题可以动态更新

2.  可以在聊天中下发系统消息,内容为:成员A+“完成了”/“参与了”+成员B+“发布的”+打开微信小程序的文字链,如「alex 完成了 cindy 发布的 团建报名统计」

该功能的开发步骤包括:

1.  服务端通过创建activity_id接口创建 activity_id

2.  前端通过 wx.updateShareMenu 声明要分享的卡片为动态消息,请求参数如下:

属性 类型 必填 说明
withShareTicket boolean 是否使用带 shareTicket 的转发,固定为 true
isUpdatableMessage boolean 是否是动态消息,固定为 true
activityId string 动态消息的 activityId,通过步骤1中的接口获取
useForChatTool boolean 聊天工具模式特殊动态消息
chooseType number 指定成员的方式
participant string[] 需参与用户此聊天室下的唯一标识列表
templateInfo Object 动态消息的模板信息,固定为 {templateId: '4A68CBB88A92B0A9311848DBA1E94A199B166463'}{templateId: '2A84254B945674A2F88CE4970782C402795EB607'}

useForChatTool 为 true 时,chooseType 和 participant 才会生效

chooseType = 1,表示按指定的 participant 当作参与者

chooseType = 2,表示群内所有成员均为参与者(包括后加入群)

代码示例:

wx.updateShareMenu({
  withShareTicket: true,
  isUpdatableMessage: true,
  activityId: 'xxx',
  useForChatTool: true,
  chooseType: 1,
  participant: that.data.members,
  templateInfo: {
    templateId:  '4A68CBB88A92B0A9311848DBA1E94A199B166463'
  }
})

模版区别(target_state 与 participator_state 含义见步骤3):

templateId 4A68CBB88A92B0A9311848DBA1E94A199B166463 2A84254B945674A2F88CE4970782C402795EB607
动态消息发布者在微信小程序卡片中看到的辅标题 target_state=1或2:X人已完成

target_state=3:已结束
target_state=1或2:X人已参与

target_state=3:已结束
参与者在微信小程序卡片中看到的辅标题 participator_state=0时:

● target_state=1:未完成

● target_state=2:即将截止

● target_state=3:已结束

participator_state=1时:

● target_state=1或2:已完成

● target_state=3:已结束
participator_state=0时:

● target_state=1:未参与

● target_state=2:即将截止

● target_state=3:已结束

participator_state=1时:

● target_state=1或2:已参与

● target_state=3:已结束
非参与者在微信小程序卡片中看到的辅标题 target_state=1或2:你无需完成

target_state=3:已结束
target_state=1或2:你无需参与

target_state=3:已结束
参与者变为完成态下发的系统消息文案 aaa 已完成 bbb 发布的 XXX aaa 已参与 bbb 发布的 XXX

1.  服务端通过 setChatToolMsg 接口更新活动状态或用户完成情况,调用方式:

POST https://api.weixin.qq.com/cgi-bin/message/wxopen/chattoolmsg/send?access_token=ACCESS_TOKEN

也可通过云开发调用,接口名 chattoolmsg.send

请求参数:

属性 类型 必填 说明
access_token string 接口调用凭证
activity_id string 动态消息的 activityId,通过步骤1中的接口获取
target_state number 活动状态,初始值为1(表示开始收集态),此处可设置为2(即将截止态)、3(已结束态)
participator_info_list array 更新后的聊天室成员状态,当target_state=1时必填,target_state=2或3时无需填写
version_type number 系统消息文字链打开的微信小程序版本,0 正式版,1 开发版,2 体验版

participator_info_list参数如下:

属性 类型 必填 说明
group_openid string 聊天室成员在此聊天室下的唯一标识
state number 用户对卡片事件的完成状态。所有参与者的初始值为0(未完成态),此处仅支持设置为1,表示完成态。

调用示例:

//变更单个成员状态
{
  "activity_id": "xxx",
  "target_state":1,
  "version_type": 0,
  "participator_info_list": [
    {
      "group_openid": "aaa",
      "state": 1
    },
    {
      "group_openid": "bbb",
      "state": 1 
    }
  ]
}

//变更动态消息状态
{
  "activity_id": "xxx",
  "target_state":3,
  "version_type": 0,
}

4. 聊天工具模式内禁用的能力

以下能力暂不支持聊天工具模式下使用,请开发者做好适配

能力项 禁用说明
<button open-type=share> 聊天工具模式禁用普通转发能力,请使用上文「发送到聊天能力开放」中的接口实现
微信小程序右上角「…-发送给朋友」
navigateToMiniProgram 聊天工具模式希望服务尽可能闭环在微信小程序中,外跳类接口暂不支持使用
openEmbeddedMiniProgram
openOfficialAccountArticle
openChannelsUserProfile
openChannelsLive
openChannelsEvent
openChannelsActivity
ad 聊天工具模式暂不支持广告
ad-custom

聊天素材支持微信小程序打开

从基础库 2.14.3 开始支持

支持平台:iOS、Android

客户端版本:通过 webview 打开微信小程序需要升级到微信 7.0.22 及以上版本,通过文件和视频打开微信小程序需要升级到微信 8.0.0 及以上版本,通过图片打开微信小程序需要升级到微信 8.0.1 及以上版本

支持类型:仅微信小程序,小游戏暂不支持

功能介绍

在微信聊天中打开素材时,增加了使用微信小程序打开的入口。用户可以通过微信小程序处理聊天中的文件、图片、视频和 webview(包括公众号文章)。例如,用微信小程序将文件存储到网盘、给图片加滤镜、进行视频剪辑,或者将 webview/公众号文章保存到笔记等。目前,只有不带二维码的图片支持直接通过微信小程序打开。

当用户在微信聊天中打开素材时,如果微信小程序配置了支持打开该类型的素材并通过审核,并且用户曾经使用过该微信小程序,那么在打开该类型素材时,就会出现使用微信小程序打开的入口。

在 PC 端基础库大于 3.7.6 的环境下,用户可以通过拖入文件的方式来触发微信小程序打开。当拖入符合规则的文件后,框架侧将会重新启动(reLaunch)微信小程序。如果拖入不符合规则的文件,框架侧会提示用户该文件不支持。

使用说明

开发者需要在微信小程序的全局配置(app.json)中声明支持打开的文件类型,并且对一种文件类型只能声明一种处理方式。

{
    "supportedMaterials": [
        {
            "materialType": "text/html",
            "name": "用${nickname}打开",
            "desc": "描述",
            "path": "pages/index/"
        },
        {
            "materialType": "video/*",
            "name": "用${nickname}播放",
            "desc": "描述",
            "path": "pages/index/"
        },
        {
            "materialType": "video/mp4",
            "name": "用${nickname}播放",
            "desc": "描述",
            "path": "pages/index/"
        }
    ]
}
属性 类型 必填 描述
materialType String 支持文件类型的MimeType,音频和视频支持二级配置的通配模式,例如:video/*。如果通配模式配置和精确类型配置同时存在,则优先使用精确类型的配置(例如,video/*video/mp4同时存在时,会优先使用video/mp4的配置)。
name String 开发者配置的标题,在素材页面会展示该标题。配置中必须包含${nickname},代码包编译后会自动替换为微信小程序名称,如果声明了简称则会优先使用简称。除去${nickname},其余字数不得超过6个。
desc String 用途描述,会在推荐列表中展示该描述,限定字数不超过22个。
path String 在该场景下打开微信小程序时跳转的页面

最新客户端版本支持的MimeType类型:

MimeType 文件后缀 说明
video/* 视频类文件
audio/* 音频类文件
image/* 图片类文件
text/html webview(包括公众号文章)
text/plain .txt
application/* 通用文件配置
application/pdf .pdf
application/msword .doc
application/vnd.openxmlformats-officedocument.wordprocessingml.document .docx
application/vnd.ms-word.document.macroEnabled.12 .docm
application/vnd.ms-excel .xls
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet .xlsx
application/vnd.ms-excel.sheet.macroEnabled.12 .xlsm
application/vnd.ms-powerpoint .ppt
application/vnd.openxmlformats-officedocument.presentationml.presentation .pptx
application/zip .zip
application/vnd.rar .rar
application/x-7z-compressed .7z
application/x-photoshop .psd
application/acad .dwg
application/x-cdr .cdr
application/dxf .dxf
application/step .stp
application/rtf .rtf
application/postscript .ai

微信小程序启动参数

微信小程序的启动参数中,场景值为1173。在该场景下,启动参数和 query 同一级有一个数组forwardMaterials,代表转发的文件信息。数组中的每一个对象包含属性{type, name, path, size},分别代表文件类型、文件名、文件路径或 URL、文件大小。

发布

微信小程序提审时,会审核声明的supportedMaterials是否合规。微信小程序发布上线后,相应文件类型的打开入口才会出现微信小程序。

如果微信小程序实现的功能价值较低,将不会通过审核,包括但不限于以下情况:

  1. 打开微信小程序后的功能与对应的素材没有任何关系:只是通过这个入口打开了微信小程序,而没有对素材做任何处理。
  2. 打开微信小程序后处理素材的方式过于简单:比如只是播放视频或只是查看.docx文件等,这些通过微信聊天就能实现的简单功能。

请开发者结合自身微信小程序的功能与用户需求进行适配。

调试

体验版

体验版微信小程序支持单独配置supportedMaterials,与正式版的微信小程序配置相互独立。上述相应的入口微信小程序列表也会单独展示体验版微信小程序。

开发者工具

开发者可以在自定义编译模式下,通过场景值1173来调试该功能。

收藏

微信小程序菜单增加了收藏功能,你可以把某个页面收藏到收藏夹里。打开微信小程序右上角的胶囊按钮,点击收藏按钮后,会触发 Page.onAddToFavorites 事件。

微信小程序私密消息

功能介绍

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

使用说明

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 接口创建。