钉钉获取免登用户信息

news2024/11/16 20:26:59

大家好,这里是一口八宝周👏

欢迎来到我的博客❤️一起交流学习 

文章中有需要改进的地方请大佬们多多指点 谢谢🙏

最近好像搞了个什么钉钉小程序,具体做什么咱也不知道,就让我搞一个钉钉获取免登录用户信息的接口出来,2分钟交代完的任务,是谁懵了我不说👀 没办法,只能回家面向百度了,现在来总结一下,虽然大概率以后也不会用到哈哈哈哈哈哈哈哈。

正文开始👇👇👇

钉钉获取免登录用户信息步骤

  1. 获取免登录授权码
  2. 获取accesstoken
  3. 获取userid
  4. 获取用户详情

其中1是通过h5实现的,234步骤则需要服务端支持,所以我们可以参考钉钉官方文档进行开发。

参考文档:概述 - 钉钉开放平台

下面进行实用教程⬇️

pom依赖

<dependency>
   <groupId>com.aliyun</groupId>
   <artifactId>dingtalk</artifactId>
   <version>1.1.76</version>
</dependency>
<dependency>
   <groupId>com.aliyun</groupId>
   <artifactId>alibaba-dingtalk-service-sdk</artifactId>
   <version>2.0.0</version>
</dependency>

获取accessToken 

获取企业内部应用的accessToken - 钉钉开放平台

文档说的很清晰,调用服务端API获取应用资源时,需要通过accessToken来鉴权调用者身份进行授权。所以我们需要获取企业内部的accessToken。

/**
     * 使用 Token 初始化账号Client
     * @return Client
     * @throws Exception
     * 钉钉开发者调用钉钉官方接口的时候,需要先要进行认证,
     * 企业开发者在钉钉创建应用,将应用的appKey键和appSecret传入,
     * 获取到accessToken值,通过该认证即可调用钉钉的相关接口。
     */
    public static com.aliyun.dingtalkoauth2_1_0.Client createClient() throws Exception {
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.protocol = "https";
        config.regionId = "central";
        return new com.aliyun.dingtalkoauth2_1_0.Client(config);
    }

    public String getAccessToken() throws Exception {
        java.util.List<String> args = java.util.Arrays.asList();
        com.aliyun.dingtalkoauth2_1_0.Client client = DingTalkOauthClient.createClient();
        GetAccessTokenRequest getAccessTokenRequest = new GetAccessTokenRequest()
                .setAppKey("你的应用的AppKe")
                .setAppSecret("你的应用AppSecret");
        try {
            String accessToken = null;
            int expireIn = 7200;
            //存入缓存,有效期2h。避免频率拦截。可以使用redis进行缓存,这里我使用的是tair
            //key命名不做要求,有效期内token只有一个
            if(tairOperator.get(TAIR_KEY) != null){
                accessToken = (String) tairOperator.get(TAIR_KEY);
            }else {
                GetAccessTokenResponse response=client.getAccessToken(getAccessTokenRequest);
                accessToken = response.getBody().getAccessToken();
                expireIn = response.getBody().getExpireIn().intValue();//7200
            }
            tairOperator.put(TAIR_KEY , accessToken, expireIn);
            return accessToken;
        } catch (TeaException err) {
            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                // err 中含有 code 和 message 属性,可帮助开发定位问题
                log.error("getAccessToken error", err.message);
            }

        } catch (Exception _err) {
            TeaException err = new TeaException(_err.getMessage(), _err);
            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                // err 中含有 code 和 message 属性,可帮助开发定位问题
                log.error("error while getAccessToken", err.message);
            }

        }
        return null;
    }

通过这个方法我们可以拿到accessToken,接下来就是获取用户id

获取userid 

参考文档:通过免登码获取用户信息 - 钉钉开放平台

这里通过文档可以知道我们需要 access_token和code两个参数,毫无疑问,access_token就是通过⬆️上述步骤自行获取的。code就是通过步骤1,h5得到的免登授权码。我们需要做的就是拿这两个参数去调用钉钉内部接口。

 通过下面的方法,我们可以轻松得到用户的一些信息,具体格式要不要贴一下呢?文档是有的

    public OapiV2UserGetuserinfoResponse getUserId(String accessToken, String authCode) throws Exception {
        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getuserinfo");
        OapiV2UserGetuserinfoRequest req = new OapiV2UserGetuserinfoRequest();
        req.setCode(authCode);
        OapiV2UserGetuserinfoResponse rsp = client.execute(req, accessToken);
        log.info("getUserId return rsp:{}",JSON.toJSONString(rsp.getBody()));
        return rsp;
    }

得到的用户对象

{
        "errcode": 0, 
        "result": {
                "associated_unionid": "N2o5U3axxxx", 
                "unionid": "gliiW0piiii02zBUjUxxxx", 
                "device_id": "12drtfxxxxx", 
                "sys_level": 1, 
                "name": "张xx", 
                "sys": true, 
                "userid": "userid123"
        }, 
        "errmsg": "ok"
}

OK 那么通过👆这个我们可以拿到userid。没毛病吧,那么进一步拿到用户的详细信息💻该怎么办,简简单单,go on

获取用户详细信息 

文档:查询用户详情 - 钉钉开放平台

需要的参数就是access_token、userid还有一个language,而且参考值也给你了。文档写的也挺清晰的,直接CV大法,自信回头。我这里就不重复操作了。

咱就是说,直接一个方法整合一下,一步到位跑起来

public OapiV2UserGetResponse getUserInfo(String authCode) throws Exception {
        try {
            String accessToken = getAccessToken();
            String userid = getUserId(accessToken, authCode).getResult().getUserid();
            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
            OapiV2UserGetRequest req = new OapiV2UserGetRequest();
            req.setUserid(userid);
            req.setLanguage("zh_CN");
            OapiV2UserGetResponse rsp = client.execute(req, accessToken);
            return rsp;
        } catch (ApiException e) {
            e.printStackTrace();
        }
        return null;
    }

大功告成✅ 具体返回信息可以去看文档,别问,问就是我还没见过返回类型👀我没权限5555~

这点写的还是比较完整的,来自一只菜鸟的认可🐶

添加权限这块咱没搞,毕竟应用也不是我创建的,所以只能贴出来文档供大家参考,具体操作还请自行研究🧐

参考文档:添加接口调用权限 - 钉钉开放平台

 OK,拜拜👋

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

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

相关文章

计网理论模拟

一. 单选题&#xff08;共10 题&#xff0c;20.0分&#xff09; 1. (单选题,2.0分)网络协议主要由 3 个基本要素组成&#xff0c;即&#xff08; &#xff09; A. 层次、语义和同步B. 语法、原语和同步C. 语法、语义和同步D. 语法、语义和功能 正确答案: C 2. (单选题,2.0分…

计算机毕业设计ssm+vue基本微信小程序的智能图书管理系统

项目介绍 本设计旨在研究一种社区图书管理系统设计与实现系统,以各种浏览器web页面加上云服务器后端服务系统,通过这一设计过程,进一步熟悉web前端开发技术和云服务器后端开发技术和方法,培养理论联系实际及知识的综合运用能力。 图书管理系统可以有效实现图书管理的规范化、系…

SAP Gateway 后台模型的缓存设置

/iwbep/cl_mgw_med_provider 类里的成员 mv_cache_active: 这个 cache 默认是开启状态。 调用 OData 服务的 MPC_EXT 类的 get_last_modified 方法获取最后一次修改的时间戳。这个时间戳(timestamp)也会影响到 cache 的行为&#xff0c;我们后续也会详细讨论。 第12 行 super 方…

PySpark--spark local 的环境部署

Spark环境搭建-Local 环境搭建 基本原理 本质&#xff1a;启动一个JVM Process进程(一个进程里面有多个线程)&#xff0c;执行任务Task Local模式可以限制模拟Spark集群环境的线程数量, 即Local[N] 或 Local[*]其中N代表可以使用N个线程&#xff0c;每个线程拥有一个cpu core。…

【使用Netty实现群发消息】

使用Netty实现群发消息netty简单介绍实现群发流程图代码实现NettyServer 类MyChannelInitializer 类MyServerHandler 类ChannelHandler 类Netty 依赖效果展示netAssist 工具启动Netty server打开netAssist 工具netty简单介绍 Netty是由JBOSS提供的一个java开源框架&#xff0c…

第三十一章 linux-模块的加载过程

第三十一章 linux-模块的加载过程 文章目录第三十一章 linux-模块的加载过程sys_init_modulestruct moduleload_module在用户空间&#xff0c;用insmod这样的命令来向内核空间安装一个内核模块&#xff0c;本节将详细讨论模块加载时的内核行为。当调用“insmod demodev.ko”来安…

通讯录的思路与实现(C语言)

目录 前言 程序的分装 程序的结构 函数实现 通讯录的初始化 通讯录的扩容 将数据保存到本地 增加联系人 显示通讯录所有联系人 目标联系人的检索(根据名称) 目标联系人的检索(根据号码) 检索发展来的函数 删除联系人 查询目标联系人 联系人信息的更改 按名称对通…

Python写个“点球大战”小游戏

大家好&#xff0c;欢迎来到 Crossin的编程教室 &#xff01; 看过我Python入门教程的朋友应该会看到其中有提到一个点球小游戏的作业。 在世界杯决赛即将到来之际&#xff0c;我们再来回顾一下这个小游戏。对于刚刚学习编程不久的同学&#xff0c;这是个不错的练手习题&…

(二)RT-Thread入门——线程管理

目录 线程管理 线程管理特点 线程工作机制 线程控制块 线程属性 线程栈 线程状态 线程优先级 时间片 线程入口函数 无限循环模式 顺序执行或有限次循环模式 线程错误码 线程状态切换 线程操作 创建动态线程 删除 初始化静态线程 脱离 获得当前线程 让出…

数据结构基础篇》》用c语言实现复数的八个基本运算

数据结构开讲啦&#xff01;&#xff01;&#xff01;&#x1f388;&#x1f388;&#x1f388; 本专栏包括&#xff1a; 抽象数据类型线性表及其应用栈和队列及其应用串及其应用数组和广义表树、图及其应用存储管理、查找和排序将从简单的抽象数据类型出发&#xff0c;深入浅出…

B-013 缓启动电路设计

缓启动电路设计1 简介2 案例分析2.1 电路说明2.2 原理分析3 电路参数设定说明1 简介 缓启电路的供电是由一个PMOS控制通断的&#xff0c;软启动的设计是让PMOS的导通时间变缓&#xff0c;电路上的做法是在PMOS的栅极和源极之间接一个合适的电容&#xff0c;PMOS的导通时间就会…

Arcgis中创建Python脚本工具

文章目录创建工具步骤第一步&#xff1a;第二步&#xff1a;第三步&#xff1a;定义工具工具箱Toolbox工具类1、__init__2、getParameterInfo3、isLicensed4、updateParameters5、updateMessage6、execute进度条的使用代码相比于自定义工具箱的源脚本和参数定义难以集中管理的缺…

中国专利电子申请网站系统环境配置方法

一、在线平台使用环境要求 支持的操作系统、浏览器、office的版本如下&#xff0c;必须匹配对应的版本&#xff1a; 操作系统&#xff1a;WINDOWS XP、WINDOWS 7、WINDOWS 8 浏览器&#xff1a;IE8、IE9、IE10 文档编辑软件&#xff1a;OFFICE2003、OFFICE2007 强烈推荐使用中…

1. Maven基础

1. Maven简介 Maven是专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#xff1a; 提供了一套标准化的项目结构 提供了一套标准化的构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;发布……&#xff09; 提供了一套依赖管理机制 1.1…

Allegro快速编辑丝印文字操作指导

Allegro快速编辑丝印文字操作指导 Allegro支持丝印文字的编辑,下面介绍快速编辑丝印文字的两种方法如下 以编辑下方丝印文字为例 方法一: 选择Text edit 命令 点击丝印文字,丝印会被高亮起来 输入需要更改后的文字,如下 右击选择done 文字被更改好了 方法二 选择se…

Function composition

In mathematics, function composition is an operation  ∘  that takes two functions f and g, and produces a function h g  ∘  f such that h(x) g(f(x)). In this operation, the function g is applied to the result of applying the function f to x. That is…

van-uplaoder保存文件到后端,回显后端接口返回的数据

实现功能&#xff1a;在移动端使用van-uploader组件上传图片&#xff0c;然后调用接口保存到后端数据库&#xff0c;提交保存信息成功后&#xff0c;调用另外的接口返回数据用来回显uploaded的文件&#xff0c;&#xff08;一般正常的返回数据的接口是个图片地址&#xff0c;可…

15 CPP函数重载

函数重载的细节&#xff1a; 1 使用重载函数时&#xff0c;如果数据类型不匹配&#xff0c;C尝试使用类型转换与形参进行匹配&#xff0c;如果转换后有多个函数能匹配上&#xff0c;编译将报错。 2 引用可以作为函数重载的条件&#xff0c;但是调用重载函数的 时候&#xff0…

javaSE - 认识字符串(String class),String类里面方法的使用,下半部分

一、字符, 字节与字符串 1.1、字符与字符串之间进行转换 字符串内部包含一个字符数组&#xff0c;String 可以和 char[] 相互转换 将整个字符数组转换成字符串 public static void main(String[] args) {char[] chars {a,b,c,d,e,f,g};String str new String(chars);Sys…