为其他公司开发一个小程序,这个小程序要只能在企业微信里面访问,不能通过普通微信访问。
企业微信里只有授权的用户可以使用该小程序。
之所以要整理这样一个流程,是因为微信那边的文档太分散了,乱七八糟的,我也是花了很长时间才把这个流程理顺。
首先,这里面需要解决几个问题:
1、只在企业微信里使用,不能在普通小程序使用
判断当前运行环境
2、只有授权的用户可以使用该小程序
权限校验
1:普通微信,使用账号+密码登陆,审核专用,可限制账号权限
2:企业微信,校验企业id,校验用户id,有权限的才允许使用
3、控制搜索
在小程序管理后台设置「不允许被搜索」
4、控制分享
小程序里面关闭分享
OK,做到以上几点,就实现了只有企业微信里授权的用户,才能够在企业微信的 工作台
看到该小程序。
好,既然问题已经明确了,那我们就搞起。
对,没看错,先提交审核,因为只有审核通过的小程序才能被企业微信绑定。所以,先把小程序的基础功能做出来,可以限制一部分功能,总之,就是先让这个小程序上架。同时,在小程序的管理后台设置「不允许被搜索」,避免不必要的麻烦。
进入企业微信后台 -> 应用管理 -> 小程序 -> 关联小程序,然后使用小程序管理员的微信扫码,按照指引操作即可。
上一步的小程序页面会出现刚才关联的小程序,点击进入,然后就看到 secret 及可见范围。
这个 secret 相当于该小程序访问该企业微信数据的令牌,请妥善保存。
可见范围就是授权,哪些用户能看到这个小程序,被设置可见的人将会在自己企业微信的工作台看到该小程序。
好了,到重头戏了。
小程序需要判断当前的运行环境(普通微信 or 企业微信),需要判断使用当前小程序的用户是否有权限使用。
var isWxWork = false;
wx.getSystemInfo({
success(res) {
console.log(res.environment);
isWxWork = res.environment == 'wxwork';
if (!isWxWork) {
// 当前环境不是企业微信,怎么处理你随便
return;
}
// 当前环境是企业微信,执行登陆,获取用户 code,用于后面的权限校验
wx.qy.login({
success: function (res) {
if (res.code) {
console.log(res.code);
// 这里可以将 res.code 通过请求发送给后台,让后台做权限校验
} else {
console.log('登录失败!' + res.errMsg);
}
}
});
}
})
后台需要调用以下几个接口来进行权限校验。
1、获取 access_token
https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=xxxx&corpsecret=xxxx
请求方式:GET
这个接口和普通微信获取 token 的方法类似。
其中,corpid
在企业微信管理后台->我的企业->企业信息->企业ID;corpsecret
就是我们上一步关联小程序后获取的 secret。
返回内容如下:
{
"errcode": 0,
"errmsg": "ok",
"access_token": "xxxxxx",
"expires_in": 7200
}
2、获取 userid
https://qyapi.weixin.qq.com/cgi-bin/miniprogram/jscode2session?access_token=xxx&js_code=xxx&grant_type=authorization_code
请求方式:GET
其中,access_token
是我们前一步 gettoken 获取到的;js_code
是前面判断运行环境时获取到的 res.code
;grant_type
固定传 authorization_code
返回内容如下:
{
"userid": "bottle",
"session_key": "xxxxx",
"corpid": "xxxxxx",
"deviceid": "xxxxxx",
"errcode": 0,
"errmsg": "ok"
}
这里的 corpid
可以用来初步校验当前用户是否有权限,因为无论哪个公司的人,只要他用企业微信,使用这个小程序,都会返回这样的结果,你需要根据 corpid
是否是你授权的企业的ID来校验,如果不是,直接返回无权限就可以,不用进行下一步。
当然 corpid
也可以用于处理一个小程序关联多家公司的情况,不过这是另一个问题了。这里简单提一嘴,因为是给其他公司开发的小程序,所以我们这个小程序也关联了两个企业,一个我们公司,一个对方公司,这样也方便我们测试,只需要给我们自己的测试人员授权就可以让他们使用完全相同的环境进行测试了。
3、获取用户信息(判断权限)
https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=xxx&userid=xxx
请求方式:GET
其中,access_token
是我们前一步 gettoken 获取到的;userid
就是我们上一步获取到的 userid
。
返回内容如下:
{
"errcode": 0,
"errmsg": "ok",
"userid": "xxx",
"name": "xxx",
"department": [],
"position": "",
"mobile": "xxx",
"gender": "2",
"email": "",
"avatar": "http://p.qlogo.cn/bizmail/xxx/0",
"status": 1,
"isleader": 0,
"extattr": {
"attrs": []
},
"telephone": "",
"enable": 1,
"hide_mobile": 0,
"order": [],
"qr_code": "https://open.work.weixin.qq.com/wwopen/userQRCode?vcode=xxx",
"alias": "",
"is_leader_in_dept": []
}
{
"errcode": 60011,
"errmsg": "no privilege to access/modify contact/party/agent , hint: [1564556097_7_8d45297bd21be3702ff430560e1f0652], from ip: 118.113.1.217, more info at https://open.work.weixin.qq.com/devtool/query?e=60011",
"department": [],
"order": [],
"is_leader_in_dept": []
}
OK,后面根据有权限还是无权限,执行不同的操作就可以了,这里不再赘述。
企业微信API(小程序):https://work.weixin.qq.com/api/doc#90000/90136/90289
企业微信接口调试工具:https://work.weixin.qq.com/api/devtools/devtool.php
错误码查询工具:https://open.work.weixin.qq.com/devtool/query