企业微信关联微信小程序,小程序端登录授权的改造实现

项目中有企业微信关联微信小程序的需求,记录下实现过程。
客观条件:开发者必须是该企业微信下的员工,否则在开发者工具里----企业微信小程序模式下调试授权登录相关接口时,始终是无法成功的。

注意:在企业微信后台操作关联小程序时,关联的小程序必须是已经在微信端发布过的小程序,关联成功后,会拿到关联该小程序的 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的方式,成功删除了原有缓存。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值