在聊天工具模式下通过wx.getChatToolInfo获取到到返回数据下:
{
errMsg: 'getChatToolInfo:ok',
encryptedData: '',
iv: ''
}
根据官方文档,这里我们需要使用 加密数据解密算法 对数据进行解密。
官方也很贴心的提供了相关的demo供开发者下载。
demo中的WXBizDataCrypt.js为通用函数,可以用于解密获取用户信息、获取手机号等其他加密数据。
前面一切顺利,但是恰恰坑就在这里,把demo中的数据替换成真实数据后出现错误。服务端返回的错误信息怎么看都看不出问题出在哪里,一开始还怀疑是自己获取的加密信息哪里搞错了。
TypeError: Cannot read property 'appid' of undefined
本地运行后才知道真实错误信息:
if (decoded.watermark.appid !== this.appId) {
TypeError: Cannot read properties of undefined (reading 'appid')
经过测试发现官方不同加密信息返回的解密数据格式是不一样的,比如获取用户信息和获取手机号是正常的,而聊天工具模式返回就不包含appid。
下面为对比:
{
openId: 'oGZUI0egBJY1zhBYw2KhdUfwVJJE',
nickName: 'Band',
gender: 1,
language: 'zh_CN',
city: 'Guangzhou',
province: 'Guangdong',
country: 'CN',
avatarUrl: 'http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0',
unionId: 'ocMvos6NjeKLIBqg5Mr9QjxrP1FA',
watermark: { timestamp: 1477314187, appid: 'wx4f4bc4dec97d474b' }
}
{
"opengid": "OPENGID", // 多聊群下返回的群唯一标识
"open_single_roomid": "", // 单聊群下返回的群唯一标识
"group_openid": "", // 用户在当前群的唯一标识
"chat_type": 3, // 聊天室类型
}
在官方未更新示例代码的情况下目前的解决方案是删除WXBizDataCrypt.js中的这段代码即可。
if (decoded.watermark.appid !== this.appId) {
throw new Error('Illegal Buffer')
}
由于自己使用的是Node,其他语言未测。