1.我们先是呢要做好开始项目的准备工作

如果你是企业微信管理员可以看到,或者是你弄一个企业号如下:企业ID

同样方法可以在审批找到

有啦这两个可以获取到token

二:我这边创建一个表存获取到的审批相关信息(抽取了部分数据,较为关键)

三:下面就是写我们的获取相关代码啦

相关工具类如下

1.AccessTokenDTO

@Getter
@Setter
@ToString
public class AccessTokenDTO {private Integer errcode;private String errmsg;@JsonProperty(value = "access_token")private String accessToken;@JsonProperty(value = "expires_in")private String expiresIn;
}

2.ApprovalDetailDTO

@Getter
@Setter
@ToString
public class ApprovalDetailDTO {/*** errcode : 0* errmsg : ok* info : {"sp_no":"201909270002","sp_name":"全字段","sp_status":1,"template_id":"Bs5KJ2NT4ncf4ZygaE8MB3779yUW8nsMaJd3mmE9v","apply_time":1569584428,"applyer":{"userid":"WuJunJie","partyid":"2"},"sp_record":[{"sp_status":1,"approverattr":1,"details":[{"approver":{"userid":"WuJunJie"},"speech":"","sp_status":1,"sptime":0,"media_id":[]},{"approver":{"userid":"WangXiaoMing"},"speech":"","sp_status":1,"sptime":0,"media_id":[]}]}],"notifyer":[{"userid":"LiuXiaoGang"}],"apply_data":{"contents":[{"control":"Text","id":"Text-15111111111","title":[{"text":"文本控件","lang":"zh_CN"}],"value":{"text":"文本填写的内容","tips":[],"members":[],"departments":[],"files":[],"children":[],"stat_field":[]}}]},"comments":[{"commentUserInfo":{"userid":"WuJunJie"},"commenttime":1569584111,"commentcontent":"这是备注信息","commentid":"6741314136717778040","media_id":["WWCISP_Xa1dXIyC9VC2vGTXyBjUXh4GQ31G-a7jilEjFjkYBfncSJv0kM1cZAIXULWbbtosVqA7hprZIUkl4GP0DYZKDrIay9vCzeQelmmHiczwfn80v51EtuNouzBhUBTWo9oQIIzsSftjaVmd4EC_dj5-rayfDl6yIIRdoUs1V_Gz6Pi3yH37ELOgLNAPYUSJpA6V190Xunl7b0s5K5XC9c7eX5vlJek38rB_a2K-kMFMiM1mHDqnltoPa_NT9QynXuHi"]}]}*/private Integer errcode;private String errmsg;private InfoBean info;@Getter@Setterpublic static class InfoBean {/*** sp_no : 201909270002* sp_name : 全字段* sp_status : 1* template_id : Bs5KJ2NT4ncf4ZygaE8MB3779yUW8nsMaJd3mmE9v* apply_time : 1569584428* applyer : {"userid":"WuJunJie","partyid":"2"}* sp_record : [{"sp_status":1,"approverattr":1,"details":[{"approver":{"userid":"WuJunJie"},"speech":"","sp_status":1,"sptime":0,"media_id":[]},{"approver":{"userid":"WangXiaoMing"},"speech":"","sp_status":1,"sptime":0,"media_id":[]}]}]* notifyer : [{"userid":"LiuXiaoGang"}]* apply_data : {"contents":[{"control":"Text","id":"Text-15111111111","title":[{"text":"文本控件","lang":"zh_CN"}],"value":{"text":"文本填写的内容","tips":[],"members":[],"departments":[],"files":[],"children":[],"stat_field":[]}}]}* comments : [{"commentUserInfo":{"userid":"WuJunJie"},"commenttime":1569584111,"commentcontent":"这是备注信息","commentid":"6741314136717778040","media_id":["WWCISP_Xa1dXIyC9VC2vGTXyBjUXh4GQ31G-a7jilEjFjkYBfncSJv0kM1cZAIXULWbbtosVqA7hprZIUkl4GP0DYZKDrIay9vCzeQelmmHiczwfn80v51EtuNouzBhUBTWo9oQIIzsSftjaVmd4EC_dj5-rayfDl6yIIRdoUs1V_Gz6Pi3yH37ELOgLNAPYUSJpA6V190Xunl7b0s5K5XC9c7eX5vlJek38rB_a2K-kMFMiM1mHDqnltoPa_NT9QynXuHi"]}]*/@JsonProperty(value = "sp_no")private String spNo;@JsonProperty(value = "sp_name")private String spName;@JsonProperty(value = "sp_status")private Integer spStatus;@JsonProperty(value = "template_id")private String templateId;@JsonProperty(value = "apply_time")private Long applyTime;private ApplyerBean applyer;@JsonProperty(value = "apply_data")private ApplyDataBean applyData;@JsonProperty(value = "sp_record")private List<SpRecordBean> spRecord;private List<NotifyerBean> notifyer;private List<CommentsBean> comments;@Getter@Setterpublic static class ApplyerBean {/*** userid : WuJunJie* partyid : 2*/private String userid;private String partyid;}@Getter@Setterpublic static class ApplyDataBean {private List<ContentsBean> contents;@Getter@Setterpublic static class ContentsBean {/*** control : Text* id : Text-15111111111* title : [{"text":"文本控件","lang":"zh_CN"}]* value : {"text":"文本填写的内容","tips":[],"members":[],"departments":[],"files":[],"children":[],"stat_field":[]}*/private String control;private String id;private ValueBean value;private List<TitleBean> title;@Getter@Setterpublic static class ValueBean {/*** text : 文本填写的内容* tips : []* members : []* departments : []* files : []* children : []* stat_field : []*/private String text;private List<?> tips;private List<?> members;private List<?> departments;private List<?> files;private List<?> children;private SelectorBean selector;@JsonProperty(value = "stat_field")private List<?> statField;@JsonProperty(value = "new_money")private Double newMoney;@Getter@Setterpublic static class SelectorBean {/*** type : single* options : [{"key":"option-1643070328","value":[{"text":"差旅费","lang":"zh_CN"}]}]*/private String type;private List<OptionsBean> options;@Getter@Setterpublic static class OptionsBean {/*** key : option-1643070328* value : [{"text":"差旅费","lang":"zh_CN"}]*/private String key;private List<TextBean> value;@Getter@Setterpublic static class TextBean {/*** text : 差旅费* lang : zh_CN*/private String text;private String lang;}}}}@Getter@Setterpublic static class TitleBean {/*** text : 文本控件* lang : zh_CN*/private String text;private String lang;}}}@Getter@Setterpublic static class SpRecordBean {/*** sp_status : 1* approverattr : 1* details : [{"approver":{"userid":"WuJunJie"},"speech":"","sp_status":1,"sptime":0,"media_id":[]},{"approver":{"userid":"WangXiaoMing"},"speech":"","sp_status":1,"sptime":0,"media_id":[]}]*/@JsonProperty(value = "sp_status")private Integer spStatus;private Integer approverattr;private List<DetailsBean> details;@Getter@Setterpublic static class DetailsBean {/*** approver : {"userid":"WuJunJie"}* speech :* sp_status : 1* sptime : 0* media_id : []*/private ApproverBean approver;private String speech;@JsonProperty(value = "sp_status")private Integer spStatus;private Long sptime;@JsonProperty(value = "media_id")private List<?> mediaId;@Getter@Setterpublic static class ApproverBean {/*** userid : WuJunJie*/private String userid;}}}@Getter@Setterpublic static class NotifyerBean {/*** userid : LiuXiaoGang*/private String userid;}@Getter@Setterpublic static class CommentsBean {/*** commentUserInfo : {"userid":"WuJunJie"}* commenttime : 1569584111* commentcontent : 这是备注信息* commentid : 6741314136717778040* media_id : ["WWCISP_Xa1dXIyC9VC2vGTXyBjUXh4GQ31G-a7jilEjFjkYBfncSJv0kM1cZAIXULWbbtosVqA7hprZIUkl4GP0DYZKDrIay9vCzeQelmmHiczwfn80v51EtuNouzBhUBTWo9oQIIzsSftjaVmd4EC_dj5-rayfDl6yIIRdoUs1V_Gz6Pi3yH37ELOgLNAPYUSJpA6V190Xunl7b0s5K5XC9c7eX5vlJek38rB_a2K-kMFMiM1mHDqnltoPa_NT9QynXuHi"]*/private CommentUserInfoBean commentUserInfo;@JsonProperty(value = "commenttime")private Long commentTime;@JsonProperty(value = "commentcontent")private String commentContent;@JsonProperty(value = "commentid")private String commentId;@JsonProperty(value = "media_id")private List<String> mediaId;@Getter@Setterpublic static class CommentUserInfoBean {/*** userid : WuJunJie*/private String userid;}}}
}

3.ApprovalDetailQuery

@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class ApprovalDetailQuery {@JSONField(name = "sp_no")private String spNo;
}

4.SpNoQuery

@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class SpNoQuery {private String starttime;private String endtime;private Integer cursor;private Integer size;
}

5.WechatConfig

@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "wechat")
@PropertySource("classpath:application.yml")
public class WechatConfig {private String agentId;private String secret;private String accessTokenUrl;private String spNoListUrl;private String dataUrl;
}

6.在application.yml添加相关值配置

wechat:agentId: 企业IDsecret: 审批idaccessTokenUrl:获取tokenurlspNoListUrl: 获取审批号dataUrl: 审批数据

四:下面就是写mvc部分

1.实体类WeixinApproval

@Getter
@Setter
@ToString
@TableName(value = "weixin_approval")
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class WeixinApproval extends BaseBean {/*** 审批编号*/@NotNull(message = "审批编号不能为空")@ApiModelProperty(value = "审批编号", name = "SpNo", dataType = "String")private String spNo;/*** 版本名称*/@ApiModelProperty(value = "版本名称", name = "spName", dataType = "String")private String spName;/*** 加入时间*/@ApiModelProperty(value = "加入时间", name = "applyTime", dataType = "Date")private LocalDateTime applyTime;/*** 用户userId*/@ApiModelProperty(value = "用户userId", name = "userId", dataType = "String")private String userId;/*** 审批金额*/@ApiModelProperty(value = "审批金额", name = "newMoney", dataType = "Double")private Double newMoney;/*** 审批类型*/@ApiModelProperty(value = "审批类型", name = "costType", dataType = "String")private String costType;/*** 审批状态*/@ApiModelProperty(value = "审批状态", name = "spStatus", dataType = "Integer")private Integer spStatus;
}

2.WeixinApprovalMapper


import java.util.List;public interface WeixinApprovalMapper extends BaseMapper<WeixinApproval> {@Select("SELECT * from weixin_approval wt WHERE wt.sp_status= 2")List<WeixinApproval> WeixinApprovalAdopt();
}

3.WeixinApprovalService


import java.util.List;public interface WeixinApprovalService extends BaseService<WeixinApproval> {void fetchData();List<WeixinApproval> WeixinApprovalAdopt();
}

4.WeixinApprovalServiceImpl

@Service
@Slf4j
@AllArgsConstructor
public class WeixinApprovalServiceImpl extends BaseServiceImpl<WeixinApprovalMapper, WeixinApproval> implements WeixinApprovalService {private final RestTemplate restTemplate;private final WechatConfig wechatConfig;@Overridepublic void fetchData() {//1.获取AccessTokenAccessTokenDTO accessTokenDTO = restTemplate.getForObject(wechatConfig.getAccessTokenUrl() + "?corpid=" + wechatConfig.getAgentId() + "&corpsecret=" + wechatConfig.getSecret() + "", AccessTokenDTO.class);log.info("AccessTokenDTO:{}", accessTokenDTO);if (null == accessTokenDTO || 0 != accessTokenDTO.getErrcode()) {log.warn("获取accessToken异常,返回状态码:{}", accessTokenDTO);return;}HttpHeaders headers = new HttpHeaders();MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");headers.setContentType(type);headers.add("Accept", MediaType.APPLICATION_JSON.toString());//2.获取审批单号, 需对审批单号进行过滤,库中已存在的,则无需再获取LocalDateTime startTime = LocalDateTime.of(2020, 3, 20, 0, 0, 0);LocalDateTime endTime = LocalDateTime.of(2020, 3, 25, 23, 59, 59);HttpEntity<Object> spDataEntity = new HttpEntity<>(JSON.toJSON(new SpNoQuery(LocalDateUtils.getSecondsByTime(startTime) + "", LocalDateUtils.getSecondsByTime(endTime) + "", 0, 100)), headers);SpDataListDTO spDataList = restTemplate.postForObject(wechatConfig.getSpNoListUrl() + "?access_token=" + accessTokenDTO.getAccessToken(), spDataEntity, SpDataListDTO.class);if (spDataList == null || 0 != spDataList.getErrcode() || null == spDataList.getSpNoList() || spDataList.getSpNoList().isEmpty()) {log.warn("获取审批单号异常,返回状态码:{}", spDataList);return;}//3.根据审批单号获取审批详情数据HttpEntity<Object> dataFormEntity;ApprovalDetailDTO approvalDetailDTO;for (String spNo : spDataList.getSpNoList()) {dataFormEntity = new HttpEntity<>(JSON.toJSON(new ApprovalDetailQuery(spNo)), headers);approvalDetailDTO = restTemplate.postForObject(wechatConfig.getDataUrl() + "?access_token=" + accessTokenDTO.getAccessToken() + "", dataFormEntity, ApprovalDetailDTO.class);if (null == approvalDetailDTO || 0 != approvalDetailDTO.getErrcode()) {log.warn("获取审批详情数据异常,返回状态码:{}", approvalDetailDTO);return;}WeixinApproval existBean = getOne(Wrappers.<WeixinApproval>lambdaQuery().eq(WeixinApproval::getSpNo, approvalDetailDTO.getInfo().getSpNo()));WeixinApproval weixinApproval = WeixinApproval.builder().spName(approvalDetailDTO.getInfo().getSpName()).spNo(approvalDetailDTO.getInfo().getSpNo()).applyTime(LocalDateTime.ofEpochSecond(approvalDetailDTO.getInfo().getApplyTime(),0, ZoneOffset.ofHours(8))).spStatus(approvalDetailDTO.getInfo().getSpStatus()).userId(approvalDetailDTO.getInfo().getApplyer().getUserid()).build();List<ApprovalDetailDTO.InfoBean.ApplyDataBean.ContentsBean> contents = approvalDetailDTO.getInfo().getApplyData().getContents();//设置费用类型contents.stream().filter(item -> "Selector".equals(item.getControl())).findFirst().ifPresent(item -> weixinApproval.setCostType(item.getValue().getSelector().getOptions().get(0).getValue().get(0).getText()));//设置金额contents.stream().filter(item -> "Money".equals(item.getControl())).findFirst().ifPresent(item -> weixinApproval.setNewMoney(item.getValue().getNewMoney()));if (null == existBean) {existBean = weixinApproval;} else {existBean.setNewMoney(weixinApproval.getNewMoney());existBean.setCostType(weixinApproval.getCostType());existBean.setApplyTime(weixinApproval.getApplyTime());existBean.setSpName(weixinApproval.getSpName());existBean.setSpNo(weixinApproval.getSpNo());existBean.setUserId(weixinApproval.getUserId());existBean.setSpStatus(weixinApproval.getSpStatus());}saveOrUpdate(existBean);}}@Overridepublic List<WeixinApproval> WeixinApprovalAdopt() {return this.baseMapper.WeixinApprovalAdopt();}
}

5.WeixinApprovalController

@RequestMapping("/weixin")
@RestController
@Api(tags = "企业微信测试")
@AllArgsConstructor
public class WeixinApprovalController {private final WeixinApprovalService weixinApprovalService;@GetMappingpublic ResponseUtil<WeixinApproval> list() {return ResponseUtil.responseSuccess(weixinApprovalService.list());}@GetMapping("/WeixinApprovalAdopt")public ResponseUtil<WeixinApproval> WeixinApprovalAdopt(){return ResponseUtil.responseSuccess(weixinApprovalService.WeixinApprovalAdopt());}
}

写完之后,接着就是测试啦,启动项目后访问

总结:像企业微信开发,公众号开发都有提供API 

springboot2.1:获取企业微信的审批数据相关推荐

  1. kettle实例(获取企业微信打卡数据并将数据入库)

    ETL.kettle初学者实例(获取企业微信打卡数据并将数据入库) Kettle简介 实例流程简介 从数据库中取出人员信息 处理人员信息 获取人员打卡信息 将打卡信息入库 总结 Kettle简介 Ke ...

  2. 利用kettle获取企业微信打卡数据

    利用kettle创建转换,把转换根据顺序执行,生成作业,通过计划任务定时执行作业,把企业微信的打卡记录插入到本地数据库中. 一.先获取打卡应用和通讯录的access_token,由于access_to ...

  3. C#获取企业微信打卡数据

    在涉及到获取第三方数据的时候都会涉及到调用接口,小编为此也是搜索了很长一段时间呢!https://www.cnblogs.com/BOSET/p/7089284.html这是小编参考的一份很完善的C# ...

  4. 集简云 x 度量科技丨打通企业微信OA审批与招银云直联,实现支付信息自动同步网银系统

    客户 · 介绍 北京度量科技有限公司专注于自主研发.生产制造和销售光学三维动作捕捉系统.公司现已获得专精特新企业.高新技术企业.瞪羚企业.展翼企业等一系列称号. 度量的核心产品--NOKOV(度量)光 ...

  5. Python3 获取钉钉OA审批数据

    根据钉钉最新的开发文档,使用python实现的获取钉钉OA审批数据内容的连接器. 使用条件: 1.创建一个钉钉应用,复制app key与app secret(在应用信息->应用凭证中). 2.赋 ...

  6. 小程序获取企业微信二维码,使用联系我插件配置企业微信二维码

    通过配置获取企业微信二维码总共分为五步: 第一步:登录企业微信管理后台,查询企业微信的企业ID(corpid)和Secret(corpsecret); 第二步:获取access_token: 第三步: ...

  7. 获取企业微信access-token

    @Resourceprivate RedisTemplate<String, Object> redisTemplate;/*** 获取access-token*/@GetMapping( ...

  8. 获取企业微信的群组 ID

    获取企业微信的群组 ID 的方法如下: 打开企业微信后台中的 "通讯录". 在 "通讯录" 页面中找到需要添加的群组并进入该群组详情页. 在该群组详情页中找到 ...

  9. Java对接企业微信的审批功能

    1.配置application.yml wechat:# 企业IDcorpId: ww8c813e720XXXXXX# 审批应用IDagentId: 3010040# 审批应用SecretcorpSe ...

最新文章

  1. mysql的root用户添加密码
  2. js词法作用域(静态作用域)
  3. python3.8.5 run-Python 3.8.5 正式发布
  4. 移动热潮催火统一通信
  5. jvm性能调优 - 06线上应用部署JVM实战_堆内存预估与设置
  6. AAAI 2021 | 上海交大提出基于有监督解耦的信息瓶颈算法
  7. 计算机基础:图形、图像相关知识笔记
  8. 一次线上ctf的网络协议分析
  9. 使用URLRewriter实现URL重写
  10. Docker学习总结(14)——从代码到上线, 云端Docker化持续交付实践
  11. MYSQL索引和权限管理
  12. cad转dxf格式文件太大_如何将DWG DXF互转,一招教你解决难题
  13. viper4android fx2.7,ViPER4Android FX下载-ViPER4Android FX(蝰蛇音效fx)2.7.1.0 安卓版下载_东坡手机下载...
  14. 饥荒服务器地图配置文件,饥荒联机版世界地图设置心得 联机全地图设置方法...
  15. ASP运行环境--.NetBox 软件使用方法,怎样使用.NETBOX运行asp项目?
  16. iPhone加码“独立王国” 有可能成摆设?
  17. 俄罗斯方块游戏的算法
  18. C#winform上传图片
  19. 第15章卡方检验:拟合优度和独立性检验
  20. uniapp做自己的启动页

热门文章

  1. 2022企业直播逐鹿奋进,品质直播能否稳中取胜
  2. 优优系统-www.uusystem.com
  3. 项目管理-PMP-第13章 考试认证计算题目
  4. Spring基础入门7 - JPA/Hibernate
  5. CS269I:Incentives in Computer Science 学习笔记 Lecture 16: Revenue-Maximizing Auctions(收入最大化拍卖)
  6. 初入C++的新手笔记(4)--初识转义字符
  7. Python看春运,万条拼车数据背后的春节迁徙地图
  8. 脑电图机器学习笔记(二):SVM 脑电波原信号和傅立叶变换的 癫痫信号检测
  9. PD协议芯片,快充协议芯片RK837
  10. 行李箱app开发的功能细节有哪些?