web端通过企业微信进行登录(获取员工信息)

 博主 [DTcode7] 带您 溺亖在知识的海洋里,嘿嘿嘿.~
🐒 个人主页—— DTcode7 的博客🐒

《微信小程序相关博客》
《Vue相关博客》
《前端开发习惯与小技巧相关博客》
《AIGC相关博客》

《photoshop相关博客》
😚 吾辈才疏学浅,摹写之作,恐有瑕疵。望诸君海涵赐教。望轻喷,嘤嘤嘤 🙈
🕍 愿斯文对汝有所裨益,纵其简陋未及渊博,亦足以略尽绵薄之力。倘若尚存阙漏,敬请不吝斧正,俾便精进!

前言

企业微信中的自建应用,除了可以关联已发布的小程序,还可以关联网站。

那么久引出了一个问题,如果这个网站需要能通过企微打开后直接自动登录。(毕竟企业里讲究效率,不想输入账号密码,需要直接通过企微中的员工架构信息来登录)

使用小程序的时候直接用 wx.qy.login就能获取到code,用来向后端请求员工数据(详情请看另一篇文章:微信小程序关联企业微信的自建应用后,静默登录)。然而,网页端是不能直接调用wx.qy.login这些API接口的,需要使用企微提供的特定接口去获取。


企微提供给网页端的授权登录方法

OAuth2授权登录

这个方法可以可通过OAuth2.0验证接口来获取成员的UserId身份信息,进而让从企业微信终端打开的网页获取成员的身份信息,从而免去登录的环节。

(官方文档:https://work.weixin.qq.com/api/doc/90000/90135/91020)

第一步:构造网页授权链接,获取code

(官方文档:https://work.weixin.qq.com/api/doc/90000/90135/91022 )

 getQywxCode () {
      console.log('===================获取企业微信用户code==========')
      const myAppid = 'xxxxx' // 企业id
      const myAgentid = 'xxxx' // 自建应用id
      // !授权成功后跳转的路径【重定向的地址】(重定向的【域名】,需要事先在企微自建应用的可信域名中添加上,否则会报错)
      const redirectUri = encodeURI('mail.qq.com/firstPage') // 应用中配置的可信域名+授权后跳转到的路径
      // state=CJSTATE 就是一个自己设置的标记字段,可以不写
      const authorUrl = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + myAppid + '&redirect_uri=' + redirectUri + '&response_type=code&agentid=' + myAgentid + '&scope=snsapi_base&state=CJSTATE#wechat_redirect'
      // 页面将跳转至 【配置的跳转后的路径url】,并且url中的格式为:redirect_uri?code='用户code信息'&state='STATE'
      // 可以在跳转后的页面中通过【this.$route.query.code】和【this.$route.query.state】来获取到这两个参数
      // 使用这种方法能够避开跨域问题造成的报错中断
      window.location.href = authorUrl
    },

 这样就能获取到code了,然后将code作为参数传给后端,获取用户信息进行登录

注意:这里有个问题,会出现跨域报错,俺不会解决,所以才参考其他博客的解决方法,直接通过window.location.href跳转页面,毕竟nginx 反向代理又不会用,学是不可能学的,这辈子不可能学的,网上朋友说话又好听,各个都是人才~

请求中详细的参数说明请看官网文档,写的很详细

特别的:要记住,重定向的url地址(上面的是-->mail.qq.com/firstPage)的域名(就是这个--->mail.qq.com)一定要先在企微的自建应用中设置可信域名


第二步:根据code获取当前访问的员工的信息

官网文档:https://work.weixin.qq.com/api/doc/90000/90135/91023

老规矩,要查信息,先要获取access_token 获取access_token - 企业微信API (qq.com)

// ==========================================调用企业微信接口,获取当前用户的信息=======================================
    // access_token是一个登录凭证,其它的业务API接口,都需要依赖于access_token来鉴权调用者身份
    // 获取access_token,用于在获取用户信息时使用
    getAccess_token () {
      /** 返回的数据格式
       * {
              "errcode": 0,
              "errmsg": "ok",
              "access_token": "wqNexxxxxbGW....",
              "expires_in": 7200   过期时间2小时
          }
        *  access_token的有效期通过返回的expires_in来传达,正常情况下为7200秒(2小时)==》2小时内重复获取到的token是一样的
           // TODO:开发者需要自己去实现access_token 在2小时快失效时重新获取的逻辑,或者每次打开都重新获取一次
       */
      const res = this.$axios({
        // corpid==>企业id
        // corpsecret===>企业自建应用的凭证密钥
        method: 'get',
        url: 'https://qyapi.weixin.qq.com/cgi-bin/gettoken',
        data: { corpid: 'xxxxx', corpsecret: 'xxxxxxxxxx' }
        // headers: {
        //   'Access-Control-Allow-Origin': '*'
        // }
      })
      console.log(res)
      // 保存当前获取到的access_token
      sessionStorage.setItem('access_token', res.access_token)
      // 如果请求成功,拿到返回数据,则调用下一个方法,进行员工信息获取
      if (res.status === 200) {
        this.getQywxUserBaseInfo()
      }
    }

        为了安全考虑,开发者请勿将access_token返回给前端,需要开发者保存在后台,所有访问企业微信api的请求由后台发起(我这里为了方便测试,就直接保存在前端了,还把密钥显式地写在前端,实际开发中,是需要写一个方法,把code传给后端,同时企业id、应用密钥全都要配置在后端,然后由后端发起请求去获取access_token,在后台拿到用户信息返回给前端,而不要在前端保存这些隐私信息!)

// 获取用户在企业微信中的基本信息(能得到userId,用来查询更详细的用户信息)
    getQywxUserBaseInfo () {
      /** 返回的数据格式
       * {
            "UserId": "Zhangsan",
            "DeviceId": "xxxxxxx",
            "errcode": 0,
            "errmsg": "ok"
        }
       */
      const res = this.$axios({
        method: 'get',
        url: 'https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo',
        data: { access_token: sessionStorage.getItem('access_token'), code: this.userCode }
      })
      console.log(res)
      // 保存当前企业微信用户的userid
      sessionStorage.setItem('UserId', res.UserId)
    },

这样能拿到的用户信息很少,只有用户id有点用 


第三步:去获取员工在企业微信中的详细信息

想要拿到详细的信息,就可以使用上面拿到的userId,去请求等多数据

// 根据获取的用户在企业微信中的userId,查询到用户详细信息
    getQywxUserInfoByUserID () {
      /** 返回的数据格式
       * {
       *  "errcode": 0,
          "errmsg": "ok",
          "userid": "ZhangSan",
          "name": "张三",
          "position": "文员",
          "mobile": "1775746941324",
          ......
       * }
       */
      const res = this.$axios({
        method: 'get',
        url: 'https://qyapi.weixin.qq.com/cgi-bin/user/get',
        data: { access_token: sessionStorage.getItem('access_token'), userid: sessionStorage.getItem('UserId') }
      })
      console.log(res)
    }

<think>好的,我现在需要帮助用户了解如何在uni-app中实现静默登录。根据用户提供的引用内容,他们可能遇到了微信授权登录的混乱教程,并且提到了存放wgt文件的路径。静默登录通常指的是用户无感知的自动登录,比如通过本地存储的token或session进行验证,而不需要用户手动输入账号密码或进行授权操作。 首先,我需要回忆一下uni-app的登录机制。uni-app支持多发布,所以静默登录的实现可能需要考虑不同平台的兼容性,尤其是微信小程序和H5。在微信小程序中,可以通过wx.login获取code,然后发送到后换取openid和session_key,这属于一种静默登录,因为用户无需授权个信息。但严格来说,这可能需要用户已使用过小程序,系统自动获取code。 接着,用户提到的引用[1]指出,关于微信授权登录的文章存在混乱,所以需要提供一个清晰的流程。静默登录的关键步骤可能包括:检测本地是否有有效token,如果有则直接登录,否则进行静默获取(如微信的code登录),失败后再转向显式授权。 然后,引用[2]提到了wgt文件的存放位置,这可能与资源更新有关,但和登录流程关系不大,可能用户误引用了相关内容,需要专注于登录部分的实现。 现在需要考虑uni-app中如何实现静默登录的具体步骤。首先,检查本地存储是否存在登录状态,比如uni.getStorageSync('token')。如果存在且未过期,则直接进入应用。如果不存在或已过期,则调用uni.login获取code,发送到后服务器,后通过code向微信服务器请求openid和session_key,生成并返回自定义的token给前保存。如果静默登录失败(比如code无效),再引导用户进行显式授权,获取用户信息。 示例代码需要展示如何调用uni.login,处理返回的code,以及与后的交互。同时,需要注意错误处理,比如网络请求失败的情况,需要捕获异常并处理。 另外,需要考虑用户是否已经授权过,如果之前已经授权,静默登录可能可以直接获取信息;否则可能需要弹出授权窗口。但静默登录应尽量避免用户交互,所以优先使用不需要用户确认的方法,如wx.login。 最后,需要生成相关问题,比如静默登录与显式授权的区别、如何处理token过期、多适配问题等。 总结步骤: 1. 检查本地token是否存在且有效。 2. 不存在则调用uni.login获取code。 3. 发送code到后换取token。 4. 处理成功或失败的情况,失败则转显式登录5. 示例代码展示这个过程。</think>### 如何在 uni-app 中实现静默登录? #### 实现原理 静默登录的核心是通过 **本地存储的登录态**(如 token)或 **平台提供的无感登录能力**(如微信小程序`uni.login`获取 code)实现自动登录,无需用户手动授权或输入账号密码。关键流程如下: 1. **检测本地登录态**:启动时检查本地缓存是否存在有效 token 2. **静默获取身份标识**:若无有效 token,调用平台接口(如微信的`uni.login`)获取临时凭证 code 3. **后验证**:将 code 发送至服务,换取用户唯一标识(如 openid)并生成 token[^1] 4. **失败降级策略**:若静默登录失败,引导用户进入显式授权流程 --- #### 示例代码 ```javascript // 1. 检查本地存储的 token let token = uni.getStorageSync('auth_token'); if (!token) { // 2. 静默获取微信 code uni.login({ provider: 'weixin', success: (loginRes) => { // 3. 发送 code 到服务 uni.request({ url: 'https://api.example.com/auth/silent', method: 'POST', data: { code: loginRes.code }, success: (res) => { if (res.data.token) { uni.setStorageSync('auth_token', res.data.token); } else { // 4. 静默失败转显式登录 this.explicitLogin(); } } }); }, fail: () => this.explicitLogin() }); } // 显式授权登录 explicitLogin() { uni.getUserProfile({ desc: '获取信息用于登录', success: (res) => { // 处理授权信息... } }); } ``` --- #### 关键配置说明 1. **微信开放平台配置**:需配置 appid 和 AppSecret,确保 code 验证流程正常 2. **token 过期策略**:服务应返回 token 有效期,前定时刷新或重新静默登录 3. **多兼容**:通过`uni.getSystemInfo`判断平台,H5 可使用 cookie 替代 code --- #### 注意事项 1. **用户首次使用**:静默登录只能获取 openid,需显式授权后才能获取昵称、头像等用户信息 2. **安全限制**:微信小程序 code 有效期 5 分钟,且只能使用一次 3. **网络容错**:弱网环境下需添加重试机制,避免直接阻塞用户
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DTcode7

客官,赏个铜板吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值