目录
企业微信从3.1.8版本开始,支持将网页或小程序转发时设置为私密消息。当企业成员将网页或小程序分享给其他成员或群聊后,其他成员打开网页或小程序时,开发者可判断当前用户是否为消息的直接接收人。同时,私密消息具有不可二次转发性,即在3.1.8及以后的版本,私密消息没有转发入口。企业微信的私密消息与微信小程序私密消息类似,不过有几个差异点:
在用户分享网页或小程序前,先调用setShareAttr,将本页面的转发声明为shareticket消息。声明之后,该页面被转发之后都有shareticket属性,转发途径包括:右上角菜单、调用shareAppMessage接口、聊天附件栏页面的底部“发送”按钮、聊天附件栏或聊天工具栏调用sendChatMessage接口等。
场景一: 个人分享给个人
A --> B
场景二: 个人分享给群
A --> [B, C, D, E]
注意:分享之后,被移出群的成员将不再有该shareticket消息的访问权限,而后来进群的成员则自动拥有了访问权限。
带有shareticket的消息卡片,用户打开网页或小程序,开发者调用getContext时,可以得到shareticket。再根据shareticket调用getShareInfo,如果当前用户是消息的直接接收者,则企业微信会返回加密的encryptedData,如果不是直接接收者,则接口会返回错误。
接口定义
wx.invoke("setShareAttr", {
withShareTicket: true,
state: "STATE",
},function(res){
if (res.err_msg == "setShareAttr:ok")
{
}
}
);
1. 此接口仅在企业微信3.1.8及以后版本支持,微信端不支持(微信开发者工具也不支持)。
2. 必须先成功调用agentConfig,否则调用时会报“no permission”错误。
3. 所有应用皆可调用,包括自建应用与第三方应用。
传入参数
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
withShareTicket | Boolean | 否 | 默认为false |
state | String | 否 | 详见state的作用 |
接口定义
wx.invoke('getContext', {
}, function(res){
if(res.err_msg == "getContext:ok"){
entry = res.entry ; //返回进入H5页面的入口类型,目前有normal、contact_profile、single_chat_tools、group_chat_tools、chat_attachment
shareTicket = res.shareTicket; //可用于调用getShareInfo接口
}else {
//错误处理
}
});
详见“获取进入H5页面的入口环境”
接口定义
wx.invoke("getShareInfo", {
shareTicket: "xxxx",
},function(res){
if (res.err_msg == "getShareInfo:ok")
{
encryptedData = res.encryptedData;
iv = res.iv;
}
}
);
1. 此接口仅在企业微信3.1.8及以后版本支持,微信端不支持(微信开发者工具也不支持)。
2. 必须先成功调用agentConfig,否则调用时会报“no permission”错误。
3. 所有应用皆可调用,包括自建应用与第三方应用。
传入参数
参数名 | 类型 | 是否必须 | 说明 |
---|---|---|---|
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的。