企业微信自建应用手动授权,获取用户详细信息

news2024/9/23 21:31:17

开始开发

最后更新:2022/10/11

企业微信提供了OAuth的授权登录方式,可以让从企业微信终端打开的网页获取成员的身份信息,从而免去登录的环节。
企业应用中的URL链接(包括自定义菜单或者消息中的链接),均可通过OAuth2.0验证接口来获取成员的UserId身份信息。

OAuth2简介

OAuth2的设计背景,在于允许用户在不告知第三方自己的帐号密码情况下,通过授权方式,让第三方服务可以获取自己的资源信息。
详细的协议介绍,开发者可以参考RFC 6749。

下面简单说明OAuth2中最经典的Authorization Code模式,流程如下:

流程图中,包含四个角色。

  • ResourceOwner为资源所有者,即为用户
  • User-Agent为浏览器
  • AuthorizationServer为认证服务器,可以理解为用户资源托管方,比如企业微信服务端
  • Client为第三方服务

调用流程为:
A) 用户访问第三方服务,第三方服务通过构造OAuth2链接(参数包括当前第三方服务的身份ID,以及重定向URI),将用户引导到认证服务器的授权页
B) 用户选择是否同意授权
C) 若用户同意授权,则认证服务器将用户重定向到第一步指定的重定向URI,同时附上一个授权码。
D) 第三方服务收到授权码,带上授权码来源的重定向URI,向认证服务器申请凭证。
E) 认证服务器检查授权码和重定向URI的有效性,通过后颁发AccessToken(调用凭证)

D)与E)的调用为后台调用,不通过浏览器进行

获取访问用户身份

最后更新:2022/09/23

该接口用于根据code获取成员信息,适用于自建应用与代开发应用

请求方式:GET(HTTPS
请求地址:https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token=ACCESS_TOKEN&code=CODE
参数说明:

参数必须说明
access_token调用接口凭证
code通过成员授权获取到的code,最大为512字节。每次成员授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。

权限说明:
跳转的域名须完全匹配access_token对应应用的可信域名,否则会返回50001错误。
返回结果:
a) 当用户为企业成员时(无论是否在应用可见范围之内)返回示例如下:

{
   "errcode": 0,
   "errmsg": "ok",
   "userid":"USERID",
   "user_ticket": "USER_TICKET"
}

获取访问用户敏感信息

最后更新:2022/09/19

自建应用与代开发应用可通过该接口获取成员授权的敏感字段

请求方式:POST(HTTPS
请求地址:https://qyapi.weixin.qq.com/cgi-bin/auth/getuserdetail?access_token=ACCESS_TOKEN

请求包体:

{
   "user_ticket": "USER_TICKET"
}

参数说明:

参数必须说明
access_token调用接口凭证
user_ticket成员票据

权限说明:
成员必须在应用的可见范围内。

返回结果:

{
   "errcode": 0,
   "errmsg": "ok",
   "userid":"lisi",
   "gender":"1",
   "avatar":"http://shp.qpic.cn/bizmp/xxxxxxxxxxx/0",
   "qr_code":"https://open.work.weixin.qq.com/wwopen/userQRCode?vcode=vcfc13b01dfs78e981c",
   "mobile": "13800000000",
   "email": "zhangsan@gzdev.com",
   "biz_mail":"zhangsan@qyycs2.wecom.work",
   "address": "广州市海珠区新港中路"
}

参数说明:

参数说明
errcode返回码
errmsg对返回码的文本描述内容
userid成员UserID
gender性别。0表示未定义,1表示男性,2表示女性。仅在用户同意snsapi_privateinfo授权时返回真实值,否则返回0.
avatar头像url。仅在用户同意snsapi_privateinfo授权时返回
qr_code员工个人二维码(扫描可添加为外部联系人),仅在用户同意snsapi_privateinfo授权时返回
mobile手机,仅在用户同意snsapi_privateinfo授权时返回,第三方应用不可获取
email邮箱,仅在用户同意snsapi_privateinfo授权时返回,第三方应用不可获取
biz_mail企业邮箱,仅在用户同意snsapi_privateinfo授权时返回,第三方应用不可获取
address仅在用户同意snsapi_privateinfo授权时返回,第三方应用不可获取

注:对于自建应用与代开发应用,敏感字段需要管理员在应用详情里选择,且成员oauth2授权时确认后才返回。敏感字段包括:性别、头像、员工个人二维码、手机、邮箱、企业邮箱、地址。

上一篇

 


 

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwd70ee88af370290f&redirect_uri=http://yuying-api.xutongbao.top/index1.html&response_type=code&scope=snsapi_privateinfo&agentid=1000004&state=STATE#wechat_redirect

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wwd70ee88af370290f&redirect_uri=http://yuying-api.xutongbao.top/index1.html&response_type=code&scope=snsapi_privateinfo&agentid=1000004&state=STATE#wechat_redirect

 

https://developer.work.weixin.qq.com/document/path/91022

接口:

const toolsQiWeUserInfo = async (req, res) => {
  const { code } = req.body
  axios({
    url: 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=wwd70e*****290f&corpsecret=JrPSfOHlNzPiF******CV4VPwUuuHwAxyUdUDu8',
  }).then((resData) => {
    let access_token = resData.data.access_token

    axios({
      url: `https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo`,
      params: {
        access_token,
        code,
        debug: 1,
      },
    }).then((resData) => {
      console.log(res)
      let userInfo = resData.data

      axios({
        url: `https://qyapi.weixin.qq.com/cgi-bin/auth/getuserdetail?access_token=${access_token}&debug=1`,
        data: {
          user_ticket: userInfo.user_ticket
        },
        method: 'post'
      }).then((resData) => {
        console.log(res)
        res.send({
          code: 200,
          data: {
            userInfo,
            userDetail: resData.data
          },
          message: '成功',
        })
      })
    })
  })
}

前端:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
    <script
      src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js"
      referrerpolicy="origin"
      ref
    ></script>
    <script src="lib/axios.min.js"></script>
    <style>
      .m-info {
        white-space: pre;
      }
      .m-img {
        width: 200px;
        height: 200px;
      }
    </style>
  </head>
  <body>
    <div>
      <div>信息</div>
      <div><span id="m-info" class="m-info"></span></div>
      <div>群ID:<span id="m-chat-id"></span></div>
    </div>
    <script src="lib/vconsole.min.js"></script>
    <script>
      // VConsole will be exported to `window.VConsole` by default.
      var vConsole = new window.VConsole()
    </script>
    <script>
      console.log(location.href)
      axios({
        url: `http://yuying-api.xutongbao.top/api/light/tools/qiWeToken`,
        method: 'post',
        data: {
          url: location.href,
        },
      }).then((res) => {
        console.log(res)

        const agentFun = () => {
          const { timestamp, noncestr, signature } = res.data.data.agentData

          wx.agentConfig({
            corpid: 'wwd70e*****290f', // 必填,企业微信的corpid,必须与当前登录的企业一致
            agentid: '1000004', // 必填,企业微信的应用id (e.g. 1000247)
            timestamp, // 必填,生成签名的时间戳
            nonceStr: noncestr, // 必填,生成签名的随机串
            signature, // 必填,签名,见附录-JS-SDK使用权限签名算法
            jsApiList: ['getCurExternalChat'], //必填,传入需要使用的接口名称
            success: function (res) {
              console.log(666, res)

              wx.invoke('getCurExternalChat', {}, function (res) {
                console.log(777, res)
                if (res.err_msg == 'getCurExternalChat:ok') {
                  let chatId = res.chatId //返回当前外部群的群聊ID
                  document.getElementById('m-chat-id').innerHTML = chatId
                } else {
                  //错误处理
                }
              })
              // 回调
            },
            fail: function (res) {
              console.log(res)
              if (res.errMsg.indexOf('function not exist') > -1) {
                alert('版本过低请升级')
              }
            },
          })

          console.log(timestamp, noncestr, signature)
        }

        agentFun()
        getUserInfo({
          access_token: res.data.data.corpData.tokenData.access_token,
        })
      })

      const parseQueryString = (url) => {
        let params = {}
        let arr = url.split('?')
        if (arr.length <= 1) {
          return params
        }
        arr = arr[1].split('&')
        for (let i = 0, l = arr.length; i < l; i++) {
          let a = arr[i].split('=')
          params[a[0]] = a[1]
        }
        return params
      }

      const getUserInfo = ({ access_token }) => {
        let qs = parseQueryString(location.href)
        let code = qs.code
        axios({
          url: `http://yuying-api.xutongbao.top/api/light/tools/qiWeUserInfo`,
          method: 'post',
          data: {
            code,
          },
        }).then((res) => {
          console.log(res)
          if (res.data.code === 200) {
            const { mobile, userid, avatar, qr_code } = res.data.data.userDetail
            console.log(avatar)
            console.log(qr_code)

            document.getElementById('m-info').innerHTML = `
            手机号:${mobile}
            UserId: ${userid}
            <div><img src="${avatar}" class="m-img" /></div>
            <div><img src="${qr_code}" class="m-img" /></div>`
          }
        })
      }
    </script>
  </body>
</html>

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32489.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宇视高空抛物相机配置指导

宇视高空抛物相机配置指导 登录摄像机网页界面&#xff0c;进入[配置>智能监控>智能功能]页面启用<高空抛物>功能&#xff0c;并进入高空抛物配置界面&#xff1b; 添加/删除检测规则&#xff0c;根据实际高空抛物场景和规则下发要求绘制检测区域&#xff1b; (…

必看!!!客户端requests与服务端request收发请求

当使用代码进行接口访问的时候&#xff0c;请求的发送与请求的接受使用的参数应该怎么如何传输能够请求到正确的响应呢? 一、使用GET请求发送&#xff0c;客户端与服务端的参数传输与接受。 1、服务端&#xff0c;首先使用web框架写一个简单的接口&#xff0c;接收两个参数&…

FineReport常用配置和方法

目录 1、隐藏参数面板的小箭头&#xff1a; 1、隐藏参数面板的小箭头&#xff1a; 查看小箭头的class&#xff0c;css设置如下属性&#xff1a; 隐藏按钮&#xff1a; // 旧版 $(.parameter-container-collapseimg-up).hide(); // 新版 $(.report-main-parameter-container-…

浙大MBA考研经验分享:名校梦不可负~

上大学的时候考研失败&#xff0c;对于没能进入浙大求学一直是我心里的遗憾&#xff01;但是毕业以来至今工作三年&#xff0c;职场上的经历让我意识到持续学习提升的重要性。一边工作一边备考&#xff0c;对于基础普通的我来说&#xff0c;一年备战能够以211分的成绩成功上岸浙…

Collection体系集合

一、Collection体系结构 Collection体系结构的根接口&#xff0c;代表一组对象&#xff0c;称为“集合”。 List接口的特点&#xff1a;有序、有下标、元素可重复。 Set 接口的特点&#xff1a;无序、无下标、元素不能重复。 二、Collection父接口 特点&#xff1a;代表一组…

分布式计算模型Mapreduce实践与原理剖析(一)

第一章 MapReduce核心理论 1.1 什么是MapReduce MapReduce 是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于 Hadoop 的数据应用” 的核心框架 。 MapReduce 核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c;并行运…

[短的文章] Spring Boot 日志创建使用、日志级别、@Slf4j、日志持久化——Spring Boot 系列

前言&#xff1a; 想必日志大家伙在项目开发调试过程中常会使用&#xff0c;这篇文章我们来一起探讨一下 Spring Boot 项目中日志的定义与使用&#xff0c;主要针对以下几个方面重点叙述 日志级别 日志框架进行日志定义 日志持久化 1 日志简述 1.1 为什么使用日志 日志大家在…

机器学习-逻辑回归

机器学习-基础知识 机器学习-线性回归 机器学习-逻辑回归 机器学习-聚类算法 机器学习-决策树算法 机器学习-集成算法 机器学习-SVM算法 文章目录逻辑回归1. 线性逻辑回归1.1. 理论基础1.2. 逻辑回归模拟步骤1.2.1. 数据集1.2.2. 模拟逻辑回归类模块1.2.3. 测试模块1.2.4. 数据…

PN532开发指南(uart)

开发环境 STM32F103C8T6 STM32f103c8t6最小系统板&#xff08;typec接口&#xff09; STM32CUBEMX PN532模块 一、NFC简介 NFC(Near Field Communication)近场通信&#xff0c;是一种短距高频的无线电技术&#xff0c;在13.56MHz频率运行于20厘米距离内。其传输速度有106Kb…

懒人福利:只需一行代码,导入所有的 Python 库

前言 今天给大家介绍一个懒人 Python 库—— Pyforest 。 使用一行代码&#xff0c;就能导入所有的 Python 库(本地已经安装的)。 GitHub 地址 https://github.com/8080labs/pyforest &#xff08;文末送读者福利&#xff09; / 01 / 介绍 Python 因为有着成千上万个功能…

paper 阅读: An introduction to ROC analysis

发布于2005年&#xff0c;附论文链接如下&#xff1a; https://ccrma.stanford.edu/workshops/mir2009/references/ROCintro.pdf 之前一直都是从各种博客上了解ROC的&#xff0c;最近才看到这一篇paper。 写在前面 用 True&#xff08;T&#xff09;和 False&#xff08;F&…

BGP进阶:BGP 基础实验配置

实验拓扑 实验需求 R1、R2、R3属于AS123&#xff0c;R4属于AS 400&#xff1b;AS123内的R1、R2、R3运行OSPF&#xff0c;通告各自直连接口&#xff0c;注意OSPF域的工作范围&#xff1b;R3-R4之间建立eBGP邻居关系&#xff0c;R2暂时不运行BGP&#xff0c;R1-R3之间建立iBGP邻…

MCE | D-萤光素 Protocol 在手,生物发光检测无忧!

■ Q: D-萤光素的作用原理 D-萤光素 (D-Luciferin) 是萤火虫萤光素酶 (Firefly Luciferase) 的化学发光底物。在ATP 和萤光素酶存在下&#xff0c;萤光素能够被氧化发光 (图 1)。当萤光素过量时&#xff0c;发光亮度与萤光素酶浓度呈正相关。通过萤光素/萤光素酶生物发光体系&…

小程序容器技术加快推动国产操作系统“上车”

计算机是当前乃至未来的基础工具&#xff0c;而负责管理计算机硬件与软件资源、提供必须的人机交互机制的操作系统无疑是整个计算机的核心系统软件。 可以说&#xff0c;操作系统是当前一个国家提升综合实力过程中必须要攻克、掌握的核心技术之一。 国产操作系统多为以Linux为…

猫狗肠道菌群—“主子们”的健康新领域

随着生活水平提升&#xff0c;我国养宠人士逐年增多。数据显示&#xff0c;我国城镇养宠人士达到6844万多人&#xff0c;且仍在不断增长。 其中养猫人群数占比59.5%&#xff0c;养狗人群数占比51.7%&#xff0c;养水族类占比8.3%&#xff0c;养爬行类宠物的占比为5.8%&#xff…

Linux 文件操作(三) —— 获取并打印某个文件的属性(文件类型、执行权限、文件大小)

目录 1、获取文件属性 stat / lstat / fstat (1) 参数 path (2) 参数 buf (3) 返回值 2、获取并打印某个文件的属性 (1) 获取文件类型 (2) 获取文件权限 (3) 获取文件大小 (4) 获取上一次的访问时间 (5) 最终代码 1、获取文件属性 stat / lstat / fstat stat / lsta…

[附源码]java毕业设计疫情防控期间网上教学管理

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

数据分析可视化之模型介绍

一 前言 “数据分析可视化”这条术语实现了成熟的科学可视化领域与较年轻的信息可视化领域的统一。 数据分析可视化&#xff1a;是指将大型数据集中的数据以图形图像形式表示&#xff0c;并利用数据分析和开发工具发现其中未知信息的处理过程。 数据可视化已经提出了许多方法&…

【软件工程导论】1.软件过程模型

软件过程模型什么是软件过程模型包括瀑布模型特点演化模型特点增量模型特点原型模型类型使用策略废弃策略追加策略螺旋模型特点什么是软件过程模型 又叫作软件开发模型、软件生存周期模型 包括 瀑布模型 每一阶段都会生成文档 特点 缺乏灵活性在交互使用时才能发现问题&…

用HTML+CSS仿网易云音乐网站(6个页面)_实训素材

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 音乐网页设计 | 仿网易云音乐 | 各大音乐官网网页 | 明星音乐演唱会主题 | 爵士乐音乐 | 民族音乐 | 等网站的设计与制作 | HTML期末大学生网页设计作…