项目中有企业微信关联微信小程序的需求,记录下实现过程。
客观条件:开发者必须是该企业微信下的员工,否则在开发者工具里----企业微信小程序模式下调试授权登录相关接口时,始终是无法成功的。
注意:在企业微信后台操作关联小程序时,关联的小程序必须是已经在微信端发布过的小程序,关联成功后,会拿到关联该小程序的 secret,在企业微信后台能看到企业 corpid,这两个参数是后台需要的。
实现思路: 实际开发过程中,有单企业跟多企业关联两种情况,本项目中遇到的是多企业关联的情况。具体解决思路:
1、前端调用wx.qy.login 获取微信返回的code,再调用登录接口将code传给后端。
2、后端拿code和任意一个corpid调用code2Session,判断返回的当前企业corpid是否与入参中的corpid相同,相同则登录成功,返回手机号、用户信息等相关字段。
3、不同则返回当前企业corpid、与企业状态(非当前企业)给前端,表示不是当前企业,前端需重新调用wx.qy.login获取code,此时上一步已拿到当前企业corpid,再调用登录接口,将code、当前企业corpid传给后台。
4、后台再拿第3步获取的code、corpid调用code2Session,此时返回的当前企业corpid与入参中的corpid相同,则登录成功,返回手机号、用户信息等相关字段,开发者后续可根据手机号调用接口获取token等其他操作。
过程:在企业微信环境里,没有用户主动触发的获取用户信息、用户手机号的微信api,因此在判断是企业微信环境时,需静默调用授权登录相关接口。(wx.getSystemInfo调用后返回字段有environment:wxwork,表明当前为企业微信环境,普通微信环境下不返回该字段)
// 在App.vue文件中,onLaunch生命周期里调用wx.getSystemInfo,为企业微信环境时,保存到缓存里
let _this = this;
wx.getSystemInfo({
success(res) {
if (res["environment"]) {
// 企业微信环境
_this.$store.dispatch("isQyWeixin", res["environment"]);
}
},
});
在调用授权登录的组件中,
import { phoneByCode, tokenByPhone} from "@/api/****/index.js";
computed: {
hasPhoneNum() {
return this.$store.state.token;
},
isQyWeixin() {
return this.$store.state.isQyWeixin;
},
},
created() {
// 判断是企业微信环境,并且没有token未登录情况下,调用授权登录接口
if (this.isQyWeixin && !this.hasPhoneNum) {
this.getQyUserInfo();
}
},
methods: {
// 企业微信小程序登录
getQyUserInfo(corpId) {
let_this = this;
wx.qy.login({
success: function (res) {
console.log(res, "企业微信登录");
if (res.code) {
_this.phoneByCode(res.code, corpId);
} else {
console.log("登录失败!" + res.errMsg);
}
},
fail: function (res) {
console.log(res, "企业微信登录失败");
},
});
},
async phoneByCode(code, corpId) {
let data = {
code: code,
corpId: corpId,
environment: this.$store.state.isQyWeixin,
};
try {
const resp = await phoneByCode(data);
if (resp["data"]["corpStatus"] && resp["data"]["corpStatus"] == 1) {
// 非当前企业
this.getQyUserInfo(resp["data"]["corpId"]);
} else {
const obj = resp;
const userPhone = obj["data"]["mobile"];
const getTokenData = {
mobile: userPhone,
};
try {
const getToken = await tokenByPhone(getTokenData);
const token = getToken["access_token"];
if (token) {
// this.$BusEvent.$emit("auth.success");
}
} catch (e) {}
}
} catch (e) {
uni.showToast({
title: e["msg"],
icon: "none",
});
}
},
}
另外特别注意:企业微信里关联的小程序是有缓存的,并且在小程序上新版本后,缓存无法被删除,切换企业微信账号,删除企业微信设置里的缓存空间,缓存也无法被删除。最后通过卸载、重装企业微信app的方式,成功删除了原有缓存。