Java企业微信对接

news2025/7/6 2:30:15


最近项目中要对接企业微信,实现通讯录数据同步,即在企业端添加编辑删除用户,部门数据要同步到微信端,同时微信端添加编辑删除用户,部门数据要同步到企业端,实现数据同步功能,需要调用企业微信API和通讯录回调接口,下面就把对接过程中遇到的各种问题,各种坑记录下来分享给需要的同学

本博客属作者原创,未经允许禁止转载,请尊重原创!如有问题请联系QQ509961766

企业微信对接目录

Java企业微信对接(一)企业端同步到微信端
Java企业微信对接(二)微信端回调到企业端

开发前准备

wechat:
  # 企业Id
  appid: appidxxxxxxxxxxx
  # 查询用的API秘钥
  appsecret: appsecretxxxxxxxxxxxxx
  # 增删改用的API秘钥
  apisecret: apisecretxxxxxxxxxxxxxxxxx
  # 是否使用代理
  useProxy: false
  # 是否开启同步至企业微信
  enableToWeXin: false
  # 代理地址端口
  wechatProxy: 10.1.1.1
  # 代理地址端口
  wechatPort: 6666
  # 回调地址的token
  callback-token: tokenxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  # 回调地址的秘钥
  callback-aesKey: aesKeyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

appid获取方式登录企业微信-我的企业页面下面有企业ID就是
在这里插入图片描述

定义常量

	//添加用户接口
    private static final String HTTP_URL_CREATE_USER = "https://qyapi.weixin.qq.com/cgi-bin/user/create?access_token=";
    //修改用户接口
    private static final String HTTP_URL_UPDATE_USER = "https://qyapi.weixin.qq.com/cgi-bin/user/update?access_token=";
    //删除用户接口
    private static final String HTTP_URL_DELETE_USER = "https://qyapi.weixin.qq.com/cgi-bin/user/batchdelete?access_token=";
    //添加部门接口
    private static final String HTTP_URL_CREATE_ORG = "https://qyapi.weixin.qq.com/cgi-bin/department/create?access_token=";
    //编辑部门接口
    private static final String HTTP_URL_UPDATE_ORG = "https://qyapi.weixin.qq.com/cgi-bin/department/update?access_token=";
    //token redis key
    private static final String WEIXIN_API_TOKEN = "token:weixin_api_token";

获取access_token

corpid就是上面配置项中的appid
apiSecret就是上面配置项中的apisecret
这个access_token 是用于 用户增删改,部门增删改时需要拼到url后面的参数

    /**
     * 获取微信AccessToken
     *
     * @author: what
     */
    private String getApiAccessToken(String corpid) {
        // 获取企业微信token请求地址拼接
        String requestUrl = YzyConstants.GET_WECOM_TOKEN_URL.replace("CORPID", corpid).replace("CORPSECRET", apiSecret);
        String accessToken = null;
        try {
            HttpGet httpget = new HttpGet(requestUrl);
            // 获得Http客户端
            CloseableHttpClient client = HttpClients.createDefault();
            // 企业微信返回值
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            if (useProxy) {
                //设置代理IP、端口
                HttpHost proxy = new HttpHost(wecomProxy, Integer.parseInt(wecomPort), "http");
                RequestConfig requestConfig= RequestConfig.custom().setProxy(proxy).build();
                httpget.setConfig(requestConfig);
                log.info("使用代理-{}:{},访问接口-{}", wecomProxy, wecomPort, requestUrl);
            }
            String response = client.execute(httpget, responseHandler);
            JSONObject jsonObject = JSONUtil.parseObj(response);
            // 记录日志:企业微信返回信息
            log.info("wecom token response:{}", jsonObject);
            // 返回结果示例:
            // {
            //        "errcode": 0,
            //        "errmsg": "ok",
            //        "access_token": "accesstoken000001",
            //        "expires_in": 7200
            // }
            Integer errCode = jsonObject.getInt(YzyConstants.ERR_CODE);
            String errMsg = jsonObject.getStr(YzyConstants.ERR_MSG);
            // 判断返回值是否正确
            if (ObjectUtil.isNotNull(errCode) && 0 != errCode) {
                throw new WechatException(errCode, errMsg);
            }
            accessToken = jsonObject.getStr("access_token");
            client.close();
        } catch (Exception e) {
            throw new WechatException(e.getMessage());
        }
        return accessToken;
    }

重要内容(通讯录回调)

在这里插入图片描述
首先需要登录企业微信管理工具中,打开通讯录回调,然后还需要加入ip可信名单,例如本机IP,生产环境,测试环境ip 都需要配置,然后点击设置接受事件服务器,这里的url必须是备案域名,不能使用公网ip,否则会失效,然后下面Token就是对应配置项callback-token,EncodingAESKey就是对应配置项callback-aesKey,好了通讯录回调就配置好了,后面直接上代码

在这里插入图片描述

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

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

相关文章

DDD的简单落地实现

目录 概述 和微服务的联系 具体划分 遵循依赖倒置原则 其他规范 具体实现代码 总结 概述 领域式驱动&#xff08;DDD&#xff09; 这种模式的核心就是根据功能去划分领域&#xff0c;然后在这个领域内只做这个领域的事情。 和微服务的联系 和微服务有什么类似的地方&am…

PyTorch 新库 TorchMultimodal 使用说明:将多模态通用模型 FLAVA 扩展到 100 亿参数

先前的文章中&#xff0c;我们介绍了 TorchMultimodal&#xff0c;今天我们将从一个具体案例出发&#xff0c;演示如何在 Torch Distributed 技术加持下&#xff0c;在 TorchMultimodal 库中扩展多模态基础模型。 近年来&#xff0c;大模型已成为一个备受关注的研究领域。以自然…

GOM传奇引擎登录器商业版与免费版的区别

商业版与免费版登录器的区别&#xff1a; 1商业版自定义界面功能可以保存配置 2商业版登录器支持读取二次加密的Pak。需要购买Pak二次加密工具。 3商业版增加数字证书&#xff0c;防止杀毒软件误报 4商业版支持163博客远程列表&#xff0c;列表首尾需要$BEGIN $END关键字 5商业…

如何提高网站安全防护?

网站安全是网站建设后非常关键的一个问题&#xff0c;是不可以忽视的&#xff0c;一个安全性不高的网站对于网站的危害是很多的&#xff0c;网站安全性不高的网站容易被攻击、容易被挂马、容易造成网站数据泄露&#xff0c;下面安全狗小编来跟大家聊一下网站安全性该如何提高。…

Git常见操作

什么是Git 简单说&#xff0c;git就是版本管理工具。 Git解决的问题 试想一下&#xff0c;你是公司的设计人员。老板要求你设计一份海报。你花了3天时间&#xff0c;画好了&#xff0c;并命名为海报1.0.然后你给老板看&#xff0c;老板看了说“设计的很好&#xff0c;要是能…

将 Vue.js 项目部署至静态网站托管,并开启 Gzip 压缩

摘要&#xff1a;关于使用 Nginx 开启静态网站 Gzip 压缩的教程已经有很多了&#xff0c;但是好像没几个讲怎么在对象存储的静态网站中开启 Gzip 压缩。其实也不复杂&#xff0c;我们一起来看下~本文分享自华为云社区《将 Vue.js 项目部署至静态网站托管&#xff0c;并开启 Gzi…

基于模糊推理的滑膜控制

目录 前言 1.系统描述 2.控制器设计 3.模糊推理估计不确定f 3.1构造模糊系统 3.2模糊推理过程 3.3 自适应律设计 4.仿真分析 4.1仿真模型 4.2仿真结果 5.总结 前言 在一般的建模仿真中&#xff0c;我们假设模型都是可以用数学模型描述出来的是确定的&#xff0c;称…

Flink系列之Flink集群搭建

title: Flink系列 二、Flink集群搭建 2.1 Flink的Standalone模式集群安装 1、上传解压重命名 [roothadoop10 software]# tar -zxvf flink-1.14.3-bin-scala_2.12.tgz [roothadoop10 software]# mv flink-1.14.3 flink2、进入到解压之后的目录里面修改配置文件flink-conf.yam…

Hash 的定义

Hash&#xff0c;一般翻译做散列、杂凑&#xff0c;或音译为哈希。 这句话就是很多混乱的根源。 笔者还是比较时候直接使用 哈希这个翻译&#xff0c;或者干脆不翻译。 混乱来源 在查看很多资料的时候&#xff0c;经常会看到最多的一个词就是散列算法。 如果不深入追究下的…

PyQt5 数据库处理

PyQt5 数据库处理SQLite介绍连接数据库执行SQL语句创建SQLite数据库关闭窗口时断开SQLite连接数据库模型视图列表模式显示数据栅格模式分页显示数据SQLite介绍 SQLite是一个轻量级的数据库&#xff0c;实现了自给自足、无服务器、零配置、事务性的SQL数据库引擎。 下载地址 安…

深入理解ThreadLocal源码

1. 预备知识&#xff1a;强软弱虚引用 在Java中有四种引用的类型&#xff1a;强引用、软引用、弱引用、虚引用。 设计这四种引用的目的是可以用程序员通过代码的方式来决定对象的生命周期&#xff0c;方便GC。 强引用 强引用是程序代码中最广泛使用的引用&#xff0c;如下&a…

如何通过股票行情接口查询财务数据?

我们做交易&#xff0c;有时候还是需要用到一些上市公司的财务数据的&#xff0c;有什么板块可以快速获取财务数据呢&#xff1f;那肯定就是利用股票行情接口进行查询了&#xff0c;那具体要怎么做呢&#xff1f;下面这组代码可以了解一下&#xff1a; get_fundamentals - 查询…

Markdown格式表情包大全最新整理分享

Markdown表情包一、前言❤️二、Emoji表情大全&#x1f46e;People&#xff08;人物&#xff09;❄️Nature&#xff08;自然&#xff09;&#x1f514;Objects&#xff08;物体&#xff09;&#x1f3e0;Places&#xff08;地点&#xff09;&#x1f51f;Symbols&#xff08;符…

如何选择独立站ERP系统?

在选择ERP系统时所需要考虑以下几个问题&#xff0c;首先是看看ERP的操作流程是否简单明了。ERP最核心的作用就是提升工作效率&#xff0c;如果操作流程过于复杂&#xff0c;反倒是会增加学习成本&#xff0c;因此快速上手是先决条件。 其次便是需要看看功能是否符合卖家的需…

如何快速编辑图片?轻量级图片在线处理工具使用教程

不管在生活还是工作的时间里&#xff0c;图片都是经常会使用到的&#xff0c;但是可能在使用图片的时候&#xff0c;需要根据要求来做图片处理&#xff08;在线ps 图片编辑制作工具 免费照片编辑器_压缩图&#xff09;。比如我们常用的jpg、png、gif三种图片格式&#xff0c;经…

二叉树,平衡二叉树,B树,B+树,红黑树

1.普通树 A为整个树的根节点。而B&#xff0c;C&#xff0c;D可以看做子树的根节点&#xff0c;在下面分别长出三棵子树。 二、二叉树概念及结构 1.概念 一棵二叉树是结点的一个有限集合&#xff0c;该集合或者为空&#xff0c;或者是由一个根节点加上两棵别称为左子树和右子…

Python Pubg 武器自动识别与压枪 全过程记录

博文目录 文章目录环境准备压枪原理需求分析求两张图片的相似度背包检测 是否在背包界面武器识别名称识别 纯白计数法配件识别 瞄具/枪口/握把/枪托 相似对比法模式识别 全自动/半自动/单发姿态识别 站/蹲/爬余弹识别激活识别 是否持有武器/一号武器/二号武器 (未完成, 做不下去…

Qt通过ODBC连接openGauss数据库

文章目录前言一、Qt链接测试1.测试代码2.测试效果二、环境搭建1.通过ODBC连接openGauss数据库2. 环境测试三、Qt通过ODBC操作数据库1.查询数据1.插入数据3.更新数据总结前言 本文就介绍了Qt通过ODBC连接opengauss数据库的基础内容。 一、Qt链接测试 1.测试代码 在.pro文件中…

java(面向对象)的23种设计模式(11)——观察者模式

一、定义 观察者模式&#xff1a;指多个对象间存在一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 换种说法&#xff0c;定义两种对象&#xff0c;观察者和目标对象&#xff0c;多个观察者同时监听一个目标对…

高等数学基础概念的Python开发实现

一般的数学算式math函数库就可以解决了&#xff0c;如果是涉及到高等数学极限&#xff0c;微积分等知识&#xff0c;就需要用到sympy科学计算库&#xff0c;它是专门用来解决数学的运算问题的。 Sympy是一个符号计算的Python库。它的目标是成为一个全功能的计算机代数系统&…