目录
企业微信从3.1.8版本开始,支持将网页或小程序转发时设置为私密消息。当企业成员将网页或小程序分享给其他成员或群聊后,其他成员打开网页或小程序时,开发者可判断当前用户是否为消息的直接接收人。同时,私密消息具有不可二次转发性,即在3.1.8及以后的版本,私密消息没有转发入口。企业微信的私密消息与微信小程序私密消息类似,不过有几个差异点:
在用户分享网页或小程序前,先调用setShareAttr,将本页面的转发声明为shareticket消息。声明之后,该页面被转发之后都有shareticket属性,转发途径包括:右上角菜单、聊天附件栏页面的底部“发送”按钮、聊天附件栏或聊天工具栏调用sendChatMessage接口等。
场景一: 个人分享给个人
A --> B
场景二: 个人分享给群
A --> [B, C, D, E]
注意:分享之后,被移出群的成员将不再有该shareticket消息的访问权限,而后来进群的成员则自动拥有了访问权限。
带有shareticket的消息卡片,用户打开网页或小程序,开发者调用getContext时,可以得到shareticket。再根据shareticket调用getShareInfo,如果当前用户是消息的直接接收者,则企业微信会返回加密的encryptedData,如果不是直接接收者,则接口会返回错误。
接口定义
wx.qy.setShareAttr ({
withShareTicket:true,
state: "STATE",
success: function(res) {
}
})
必须先调用过wx.qy.login,且session_key未过期,开发者可调用checkSession 检查当前登录态
当前成员必须在应用的可见范围
传入参数
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
withShareTicket | Boolean | 否 | 默认为false |
state | String | 否 | 详见state的作用 |
接口定义详见“wx.qy.getContext”,以下是示例代码:
wx.qy.getContext ({
success: function(res) {
var entry = res.entry; //返回进入小程序的入口类型
var shareTicket = res.shareTicket;
}
})
接口定义
wx.qy.getShareInfo ({
shareTicket:"xxxx",
success: function(res) {
var encryptedData = res.encryptedData; //转发信息的加密数据
var iv = res.iv; //加密算法的初始向量
}
})
需要wx.qy.login,且session_key未过期,开发者可调用checkSession 检查当前登录态
当前成员必须在应用的可见范围
传入参数
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
shareTicket | String | 是 | 调用getContext时获取到的shareTicket |
返回结果
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
encryptedData | String | 是 | 转发信息的加密数据 |
iv | String | 是 | 加密算法的初始向量 |
将encryptedData解密得到的开放数据为以下 json 结构(解密算法详见“加密数据encryptedData解密算法”):
{
"chatId": "CHATID",
"state": "STATE",
"curReceiver": "CURRECEIVER",
}
json结构说明:
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
chatId | String | 否 | 群聊时返回,群id,单聊时返回空字符串 |
state | String | 否 | setShareAttr时传入的state参数,详见state的作用 |
curReceiver | String | 否 | 当前接收者的userid,对于自建应用返回的是明文userid,对于第三方应用返回的是加密的open_userid。详见curReceiver的作用 |
调用setShareAttr时,可以传一个state参数,该参数值由开发者自由指定。shareticket消息分享之后,当接收者打开消息的H5页面或小程序时,开发者调用getShareInfo,企业微信会将state值加密返回,开发者可在后台解密并加以校验。
用户进入网页时,网页通过oauth2可获得用户的userid(第三方应用可获得open_userid)。调用getShareInfo时,企业微信会将当前用户的userid或open_userid通过curReceiver加密在encryptedData里返回。
为了避免encryptedData被重放攻击,我们建议开发者检查curReceiver与oauth2获得的userid(或open_userid)是否一致。
在企业微信的旧版本里,shareticket消息是可以长按转发到其他会话里的,所以开发者一定要通过getShareInfo的返回值来检查当前用户是否消息的直接接收者。
企业微信的shareticket属性不支持同步到微信,当shareticket消息分享到包含微信用户的会话中,用户在微信打开时是没法获取到shareticket的。