接入企业微信审批开发记录

背景
客户提了关于对接企业微信【审批】功能的需求,具体需求包括:
1、当企业微信审批流程到达某个节点后,能将审批信息推送到我们系统,或者我们系统能够拉取某个流程的信息;
2、能在审批流程中嵌套一个评价节点,跳转我们系统的评价页面。

1 调研企业微信是否支持

根据这篇博文,可知企业微信支持 审批回调 ,这个在官方文档中也可以找到。所以1中 当企业微信审批流程到达某个节点后,能将审批信息推送到我们系统是可以做到的。
对于2中的需求,经调研,发现企业微信支持定制审批流程的 模版 ,可以在 模版 中加上一个 说明文字 的控件,在控件中插入链接,然后靠用户的自觉性,在某个节点点击链接去评价,这个实现客户也是认可的。

2 流程梳理

审批回调 自然需要配置回调接口,企业微信的逻辑是先在企业微信中 自建 一个应用,然后给这个自建应用进行 接收消息服务器配置 ,这个 接收消息服务器配置 就是回调的url,然后在 审批 中配置 开启回调通知的模版可调用接口的应用 ,这样开启了企业微信审批申请状态变化回调。

2.1 自建应用

在这里先讲一下如何创建一个企业用于自己开发测试,移动端比较简单,左侧点击图标新建即可。
首先在PC端的企业微信上进入工作台

接着随便点击一个应用,比如审批,点击右上角的图标前往管理后台

然后就会打开浏览器,点击顶部的 应用管理 菜单,可以看大下面有 创建应用 的选项

点击创建,填入必填项,创建成功

接着就是配置应用中的一些信息,上面的这个 AgentId 是应用的ID,那个 Secret 是应用的凭证密钥,这个在获取企业微信access_token的时候需要

接下来往下拖,点击那个 API接收消息,我这里配置过了,显示的是已启用

可以看到这里有3个参数,下面2个是点击右边的 随机获取 按钮随机获取的,第1个参数URL,可以参考边上的获取帮助链接,这个是企业微信的验证URL,这里的实现放在2.2中

还需要配置 企业可信IP企业可信IP 是配置哪些IP可以通过API获取企业数据,比如审批流程信息

2.2 回调接口实现

这一节说明的是企业微信应用验证URL和回调接口的实现。
首先,需要下载企业微信的加解密库,选择XML版本,下面的代码依赖于这些。

点击查看代码
package com.springboot.demo.scheduled;import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.springboot.demo.aes.WXBizMsgCrypt;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringReader;/*** 企业微信审批状态变化回调** @author Lip* @since 2024-12-31*/
@Slf4j
@RestController
@RequestMapping("qy")
public class QywxCallbackController {@GetMapping(value = "/Callback")public void connect(HttpServletRequest request, HttpServletResponse response) {// 企业号将发送GET请求到填写的URL上,GET请求携带四个参数,企业在获取时需要做url_decode处理,否则会验证不成功// 微信加密签名String msgSignature = request.getParameter("msg_signature");// 时间戳String timestamp = request.getParameter("timestamp");// 随机数String nonce = request.getParameter("nonce");// 随机字符串String echoStr = request.getParameter("echostr");// 自建应用中生成的String contactsToken = "5AsIzFkiXMaa";String contactsEncodingAesKey = "GwJH5XOLPSmlTGJ2qKEcIy1k3wGg4rsFO51Df7woNsi";// 企业IDString corpId = "ww1f0eebf7e9d7c54d";// 回调key值String sEchoStr;try {PrintWriter out = response.getWriter();WXBizMsgCrypt wxCrypt = new WXBizMsgCrypt(contactsToken, contactsEncodingAesKey, corpId);sEchoStr = wxCrypt.VerifyURL(msgSignature, timestamp, nonce, echoStr);if (StringUtils.isBlank(sEchoStr)) {log.error("URL验证失败");}out.write(sEchoStr);out.flush();} catch (Exception e) {log.error("企业微信回调url验证错误", e);}}@PostMapping(value = "/Callback")public void acceptMessage(HttpServletRequest request) {System.out.println("————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————");log.info("企业微信信息交互");// 微信加密签名String sMsgSignature = request.getParameter("msg_signature");// 时间戳String sTimestamp = request.getParameter("timestamp");// 随机数String sNonce = request.getParameter("nonce");System.out.println("acceptMessage方法sMsgSignature: " + sMsgSignature);System.out.println("acceptMessage方法sTimestamp: " + sTimestamp);System.out.println("acceptMessage方法sNonce: " + sNonce);try {// 获取请求的输入流ServletInputStream inputStream = request.getInputStream();// 创建一个 StringBuilder 对象来存储请求内容StringBuilder xmlContent = new StringBuilder();// 使用 BufferedReader 读取输入流内容BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));String line;while ((line = reader.readLine()) != null) {xmlContent.append(line);}// 关闭输入流和读取器inputStream.close();reader.close();// 输出请求内容System.out.println("请求 XML 内容:" + xmlContent);String sReqData = xmlContent.toString();
//          String sReqData = "<xml><ToUserName><![CDATA[wx5823bf96d3bd56c7]]></ToUserName><Encrypt><![CDATA[RypEvHKD8QQKFhvQ6QleEB4J58tiPdvo+rtK1I9qca6aM/wvqnLSV5zEPeusUiX5L5X/0lWfrf0QADHHhGd3QczcdCUpj911L3vg3W/sYYvuJTs3TUUkSUXxaccAS0qhxchrRYt66wiSpGLYL42aM6A8dTT+6k4aSknmPj48kzJs8qLjvd4Xgpue06DOdnLxAUHzM6+kDZ+HMZfJYuR+LtwGc2hgf5gsijff0ekUNXZiqATP7PF5mZxZ3Izoun1s4zG4LUMnvw2r+KqCKIw+3IQH03v+BCA9nMELNqbSf6tiWSrXJB3LAVGUcallcrw8V2t9EL4EhzJWrQUax5wLVMNS0+rUPA3k22Ncx4XXZS9o0MBH27Bo6BpNelZpS+/uh9KsNlY6bHCmJU9p8g7m3fVKn28H3KDYA5Pl/T8Z1ptDAVe0lXdQ2YoyyH2uyPIGHBZZIs2pDBS8R07+qN+E7Q==]]></Encrypt><AgentID><![CDATA[218]]></AgentID></xml>";String contactsToken = "5AsIzFkiXMaa";String contactsEncodingAesKey = "GwJH5XOLPSmlTGJ2qKEcIy1k3wGg4rsFO51Df7woNsi";String corpId = "ww1f0eebf7e9d7c54d";WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(contactsToken, contactsEncodingAesKey, corpId);String sMsg = wxcpt.DecryptMsg(sMsgSignature, sTimestamp, sNonce, sReqData);System.out.println("after decrypt msg: " + sMsg);// TODO: 解析出明文xml标签的内容进行处理DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();StringReader sr = new StringReader(sMsg);InputSource is = new InputSource(sr);Document document = db.parse(is);Element root = document.getDocumentElement();NodeList nodelist1 = root.getElementsByTagName("SpNo");// 获取审批编号String SpNo = nodelist1.item(0).getTextContent();System.out.println("审批编号为:" + SpNo);NodeList SpStatus_Node = root.getElementsByTagName("SpStatus");// 申请单状态:1-审批中;2-已通过;3-已驳回;4-已撤销;6-通过后撤销;7-已删除;10-已支付String SpStatus = SpStatus_Node.item(0).getTextContent();NodeList SpRecord_Node = root.getElementsByTagName("SpRecord");for (int i = 0; i < SpRecord_Node.getLength(); i++) {System.out.println("审批记录第" + (i + 1) + "个节点审批状态为:" + SpRecord_Node.item(i).getFirstChild().getTextContent());}} catch (Exception e) {log.error("企业微信消息交互错误", e);}}
}

这两个接口的路径是一样的,GET方法是验证接口,POST方法是回调接口。

2.3 审批流程模板添加链接




看图,3步搞定

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

并发编程 StampedLock

StampedLock是JDK8引入的,是为了优化读的性能乐观读:tryOptimisticRead方法内没有加任何锁,在真正进行读取操作之前要进行一次查验,即validate,因为在获取stamp后,到读取操作之间,可能会有并发问题。 如果查验结果为false,就会升级为读锁

【硬件测试】基于FPGA的8PSK调制解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR

1.算法仿真效果 本文是之前写的文章:基于FPGA的8PSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR-CSDN博客的硬件测试版本。在系统在仿真版本基础上增加了ila在线数据采集模块,vio在线SNR设置模块,数据源模块。硬件ila测试结果如下:(完整代码运…

Linux 安装和配置openssl

使用python3.10版本时遇到无法加载.ssl的报错,解决方法如下: 1. 检查openssl的当前版本,如果已经是openssl-1.1.1w,则跳过下文,应该不是同一个问题。openssl version OpenSSL 1.0.2k-fips 26 Jan 2017 2. 下载openssl-1.1.1w版本的压缩包 openssl-1.1.1w.tar.gz3. 解压压…

【Java 温故而知新系列】基础知识-04 重点关键字(面试经常遇到的)

1、final 在 Java 中,final 关键字可以用于变量、方法和类,分别赋予它们不同的语义和行为。以下是 final 关键字的主要作用 修饰变量 当 final 修饰一个变量时,表示该变量的值一旦初始化后就不能再被改变。这适用于基本类型和引用类型。基本类型:对于基本类型(如 int, do…

春节不打烊,超市管理工具如何助力商家应对销售高峰

春节超市管理工具种类繁多,每种工具都有其独特的功能和优势。在选择工具时,超市应根据自身的需求和实际情况进行选择,以确保管理效率和服务质量的提升。春节期间,超市管理工具种类繁多,这些工具旨在帮助超市高效管理库存、促进销售、调度员工以及提升顾客服务质量。以下是…

vue3 在渲染md中的数学公式

常规的md转数学公式插件无法解决此问题 问题: 在渲染过程中 \t 被转义 导致渲染出错**方案为:将\t 转义为\t ** 依赖的插件及版本"katex": "^0.16.15","markdown-it": "^14.1.0","markdown-it-katex": "^2.0.3",…

重新定义电商团队协作:在线文档工具的战略作用

在当今快速发展的电商行业,团队协作效率对业务成功至关重要。尤其是跨部门沟通和信息共享,已经成为提升电商团队组织架构优化的关键因素。而一个功能强大的在线协同编辑文档工具正是提升这些关键环节的解决方案之一。 电商团队组织架构的挑战 电商企业通常面临复杂的业务流程…

基于海豚调度功能开发——推送下游系统数据库连接信息批量修改方案与实现

功能需求背景 由于信创(信息技术应用创新产业)改造要求,上个月已将从数据仓库推送下游官网系统的ORACLE数据库相关数据推送任务迁移到信创人大金仓临时数据库,整体任务完成切换上线并试运行稳定。 由于年底需要进行信创数据库的正式上线,目前需要将人大金仓临时数据库切换…

Pycharm 2024 安装激活详细使用教程(激活至2026,实测是永久,亲测!)

开发工具推荐:Pycharm 安装激活详细使用教程(激活至2026,实际上永久,亲测!)申明:本教程 Pycharm补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 ! Pycharm是JetBrains公司推出的一款功能强大的Python集…

服务器迁移中心——“工作组迁移”使用指南

简介 服务器迁移中心(Server Migration Center,简称SMC)是阿里云提供给您的迁移平台。专注于提供能力普惠、体验一致、效率至上的迁移服务,满足您在阿里云的迁移需求。 工作组迁移是SMC的一项功能,提供标准化迁移流程,可以同时管理多个迁移源的生命周期,适用于需要批量迁…

arcgis server 10.4许可过期

注册机生成注册码 10.4许可基本在2025年1月1日过期,用生成码生成一版新的许可替换即可,生成许可虽然只支持10,改成104即可。 注册机链接地址: [https://drive.google.com/file/d/1H9BXzr1tklbAPO3QH-FYl80sn1yJlB02/view?usp=drive_link](https://drive.google.com/file/d…