开启左侧

JAVA运用wecom-sdk企业微信审批功能接入教程

[复制链接]
在线会员 cqgwi 发表于 4 小时前 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
布景
1.短期公司java名目需要连接企业微疑的审批功用,用户提接审批,转到企业微疑截至审批过程,审批后背景施行响应操纵,连接到企业微疑中即是收收审批、审批处置(企业微疑内部)、审批疑息回调、后绝处置
2.为便利连接企业微疑,快速使用各交心,原次使用了wecom-sdk那个名目连接企业微疑,可是该名目不供给学程文档,唯一示例代码中的小段笔墨分析,需要设置甚么其实不大白,尔小我私家也是探究了好久终极运行胜利,正在那里也是分享一下尔的经历,并干一下记载
操纵
1.引进wecom-sdk
https://gitee.com/felord/wecom-sdk拜访 名目下载最新版原,尔原次使用的是1.3.4版原
将samples中的文献按照自己的名目构造复造到名目中对于应职位
JAVA使用wecom-sdk企业微疑审批功用交进学程-1.png


JAVA使用wecom-sdk企业微疑审批功用交进学程-2.png


api文献夹中为controller文献,自己按需复造到指定职位
名目中引进相干依靠:
  1. <dependency>
  2.     <groupId>cn.felord</groupId>
  3.     <artifactId>wecom-sdk</artifactId>
  4.     <version>1.3.4</version>
  5. </dependency>
复造代码
可以需要引进okhttp的依靠
名目民间分析:
    Okhttp高版原兼容依靠
会报错NoSuchMethod的是因为您名目自己引进了Okhttp,可是版原比力高,招致没有兼容的情况,可颠末如下依靠引进wecom-sdk
  1. <dependency>
  2.     <groupId>cn.felord</groupId>
  3.     <artifactId>wecom-sdk</artifactId>
  4.     <version>1.3.4</version>
  5.     <exclusions>
  6.         <exclusion>
  7.             <groupId>com.squareup.okhttp3</groupId>
  8.             <artifactId>okhttp</artifactId>
  9.         </exclusion>
  10.         <exclusion>
  11.             <groupId>com.squareup.okhttp3</groupId>
  12.             <artifactId>logging-interceptor</artifactId>
  13.         </exclusion>
  14.     </exclusions>
  15. </dependency>
  16. <dependency>
  17.     <groupId>com.squareup.okhttp3</groupId>
  18.     <artifactId>okhttp</artifactId>
  19.     <version>4.12.0</version>
  20. </dependency>
  21. <dependency>
  22.     <groupId>com.squareup.okhttp3</groupId>
  23.     <artifactId>logging-interceptor</artifactId>
  24.     <version>4.12.0</version>
  25. </dependency>
复造代码
2.设置企业微疑参数(涉及回调)
起首需要企业微疑的自修使用用往返调,并树立可托域名战企业可托IP,那里没有细分析能够参照其余学程,结果以下:
JAVA使用wecom-sdk企业微疑审批功用交进学程-3.png


需要使用企业微疑自修使用三件套,企业ID(尔的企业页里最下圆看来,corpId),自修使用的AgentId战Secret(自修使用页里上圆看来)
借需要设置回调交心,先正在自己的名目中设置佳回调交心,复造收缩包中api文献夹的CallbackController.java按照自己名目微调便可,并搁止制止拦阻
需要留神的是,那里controller交心的设置,正在交心地点上增加corpId战agentId
JAVA使用wecom-sdk企业微疑审批功用交进学程-4.png


而后正在功用中的领受消息设置交心等疑息
JAVA使用wecom-sdk企业微疑审批功用交进学程-5.png


URL为交心地点,忘患上前面戴上corpId战agentId,Token战EncodingAESKey面随机获得,此时记载那二个值,需要正在名目中树立。领受的消息工作范例自止挑选。
JAVA使用wecom-sdk企业微疑审批功用交进学程-6.png


正在WecomCallbackSettingsServiceImpl中树立settings的值,三个属性别离是Token、EncodingAESKey战CorpId
JAVA使用wecom-sdk企业微疑审批功用交进学程-7.png


运行名目保证交心能够跑通后,面打企业微疑树立效劳器页里的保留,会显现设置疑息,证实回调树立结束
JAVA使用wecom-sdk企业微疑审批功用交进学程-8.png


3.审批模板树立
使用企业微疑使用中的审批使用成立模板,没有是自修使用中的审批模板
对于模板的成立根据自己需要去,咱们存眷的是模板ID的获得,二种方法,一个是面打模板概略后,目前url中最初的部门即是模板,大概面打最上圆的模板名,会呈现模板id疑息
JAVA使用wecom-sdk企业微疑审批功用交进学程-9.png


4.提接审批代码编辑示例,尔的模板以下:
JAVA使用wecom-sdk企业微疑审批功用交进学程-10.png


值患上留神的是,颠末交心提接审批恳求没有会读与正在企业微疑中树立的审批过程,需要咱们自己正在代码中树立审批节面(WecomApprove是尔自止创立的数据表,请按需树立自己的表或者没有保留)
  1. ListContentDataValue finalTableData = tableData;// 明细控件实质
  2. String templateId = "C4c奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫";
  3. AgentDetails nativeAgent = DefaultAgent.of(systemConfigService.getValueByKey(WecomConstants.WECOM_CORPID),
  4.                     systemConfigService.getValueByKey(WecomConstants.WECOM_NOTIFY_SECRET),
  5.                     systemConfigService.getValueByKey(WecomConstants.WECOM_NOTIFY_AGENTID));
  6. ApprovalApi approvalApi = workWeChatApi.approvalApi(nativeAgent);
  7. ApprovalTmpDetailResponse templateDetail = approvalApi.getTemplateDetail(TemplateId.of(templateId));
  8. System.out.println("templateDetail = " + templateDetail);
  9. String templateName = templateDetail.getTemplateNames().get(0).getText();
  10. List<Su妹妹ary> su妹妹aryList = Collections.singletonList(Su妹妹ary.zhCN(templateName+"恳求"));
  11. //依据 模板构造调解数据值列表
  12. List<ContentDataValue> dataValues = Arrays.asList(
  13.     TextValue.from(existOrder.getOrderId()),           // 定单号
  14.     TextValue.from(userService.getById(existOrder.getUid()).getNickname()), // 客户称呼
  15.     MoneyValue.from(existOrder.getPayPrice()),        // 真付金额
  16.     MoneyValue.from(request.getPayPrice()),           // 改价金额
  17.     // 商品明细(表格控件)
  18.     finalTableData,
  19.     TextValue.from("改价启事示例")                      // 改价启事
  20. );
  21. // 审批人、打点人、抄收人
  22. String approver = "ZhangSan";
  23. String processor = "ZhangSan";
  24. String cc = "ZhangSan";
  25. /*参数分析
  26. ProcessNode.cc(): 抄收节面,指定抄收人
  27. ProcessNode.assignees(): 审批节面,指定审批人
  28. ApvRel.ALL: 会签(统统审批人皆需审批)
  29. ApvRel.OR: 或者签(任一审批人审批便可)
  30. ProcessNode.processor():处置 节面,指定处置人*/
  31. List<ProcessNode> nodeList = Arrays.asList(
  32.     //ProcessNode.cc(Collections.singletonList("3958")),
  33.     //ProcessNode.assignees(ApvRel.ALL, Arrays.asList("4921", "2774")),
  34.     ProcessNode.assignees(ApvRel.OR, Arrays.asList(approver)),
  35.     ProcessNode.processor(Collections.singletonList(processor))
  36.     //ProcessNode.cc(Collections.singletonList(cc))
  37. );
  38. String applicant = loginUserVo.getUser().getWechatAccount();
  39. GenericResponse<String> stringGenericResponse = approvalApi.applyEvent(ProcessApplyRequest.approveMode(
  40.     applicant,
  41.     templateId,
  42.     nodeList,
  43.     templateDetail.getTemplateContent().getControls(),
  44.     dataValues,
  45.     su妹妹aryList
  46. ));
  47. System.out.println("stringGenericResponse = " + stringGenericResponse);
  48. //保管 审批疑息到数据表
  49. WecomApprove wecomApprove = new WecomApprove();
  50. ObjectMapper mapper = new ObjectMapper();
  51. JsonNode jsonNode = null;
  52. try {
  53.     jsonNode = mapper.readTree(stringGenericResponse.getData());
  54. } catch (JsonProcessingException ex) {
  55.     throw new RuntimeException(ex);
  56. }
  57. // 获得前去的审批ID
  58. String spNo = jsonNode.asText();
  59. wecomApprove.setName(templateName);
  60. wecomApprove.setTemplateId(templateId);
  61. wecomApprove.setApproveId(spNo);
  62. wecomApprove.setApplicant(applicant);
  63. wecomApprove.setApprover(approver);
  64. wecomApprove.setStatus(1);
  65. wecomApprove.setParams(JSONUtil.toJsonStr(request));
  66. wecomApproveService.save(wecomApprove);
复造代码
5.树立审批回调工作处置
wecom-sdk供给的示例文献中并无审批相干的处置文献,需要咱们自己编辑一个,从其余类复造一份截至改写
JAVA使用wecom-sdk企业微疑审批功用交进学程-11.png


那些文献的区分正在于匹配的工作范例差别,此中,对于工作范例品种正在CallbackEvent看来,具体哪一种工作对于应甚么值详睹企业微疑开辟文档,将工作范例交流成需要的
  1. public boolean matched(CallbackEvent event) {
  2.     return CallbackEvent.SYS_APPROVAL_CHANGE.equals(event);
  3. }
复造代码
咱们编辑一下审批回调工作:
  1. @Override
  2. public void consume(CallbackEventBody body) {
  3.     CallbackEvent event = body.getEvent();
  4.     CallbackChangeType changeType = body.getChangeType();
  5.     ApprovalInfo approvalInfo = body.getApprovalInfo();
  6.     if (Objects.nonNull(approvalInfo)) {
  7.         //处置 审批变动工作
  8.         log.info("领受到审批变动工作");
  9.         // 获得审批形状
  10.         SpStatus spStatus = approvalInfo.getSpStatus();
  11.         //StatusChangeEvent statuChangeEvent = approvalInfo.getStatuChangeEvent();
  12.         //依据 差别形状处置
  13.         switch (spStatus.getType()) {
  14.             case 1://APPROVAL(1)审批中
  15.                 break;
  16.             case 2://ACCEPTED(2)曾经过
  17.                 // 审批颠末处置逻辑
  18.                 handleApprovalAccepted(approvalInfo);
  19.                 break;
  20.             case 3://REJECTED(3)已经采纳
  21.                 // 审批拒绝处置逻辑
  22.                 handleApprovalRejected(approvalInfo);
  23.                 break;
  24.             case 4://REVOKED(4)已经打消
  25.                 // 审批打消处置逻辑
  26.                 handleApprovalCanceled(approvalInfo);
  27.                 break;
  28.             default:
  29.                 log.warn("其余审批形状: {}", spStatus);
  30.                 break;
  31.         }
  32.     }
  33. }
复造代码
需要处置甚么审批形状回和谐后绝处置工作按需编辑(FinishTime完毕时间出找到交心获得,可是企业微疑审批列表却有那个值,便自己天生了)
  1. /**
  2. *处置 审批颠末工作
  3. */
  4. private void handleApprovalAccepted(ApprovalInfo approvalInfo) {
  5.     // 完毕审批颠末的营业逻辑
  6.     log.info("审批颠末,审批编号: {},开端处置{}后绝逻辑", approvalInfo.getSpNo(), approvalInfo.getSpName());
  7.     // 读与审批疑息,获得审批参数
  8.     WecomApprove wecomApprove= wecomApproveService.getOne(new QueryWrapper<WecomApprove>().eq("approve_id",approvalInfo.getSpNo()));
  9.     StoreOrderUpdatePriceRequest request = JSON.parseObject(wecomApprove.getParams(), StoreOrderUpdatePriceRequest.class);
  10.     // 施行改价逻辑,保留审批成果
  11.     //依据 恳求人得到办理员id
  12.     SystemAdmin systemAdmin = systemAdminService.getOne(new QueryWrapper<SystemAdmin>().eq("wechat_account",wecomApprove.getApplicant()));
  13.     Boolean result =storeOrderService.updatePriceCallBack(request, systemAdmin.getId());
  14.     if (result){
  15.         wecomApprove.setStatus(2);
  16.         wecomApprove.setFinishTime(DateTime.now());
  17.         wecomApproveService.updateById(wecomApprove);
  18.         log.info("审批颠末后改价完毕");
  19.     }else{
  20.         log.info("审批颠末后改价失利");
  21.     }
  22. }
复造代码
6.一个小坑,没有明白是否是统统人皆如许,即是wecom-sdk给出的WecomCallbackSettings类尔那里运行提醒需要序列化,归正尔是加之了,如果没有呈现便没有减吧。
归纳:
今朝便那些实质,期望各人均可以顺遂交进名目
您需要登录后才可以回帖 登录 | 立即注册 qq_login

本版积分规则

发布主题
阅读排行更多+
用专业创造成效
400-778-7781
周一至周五 9:00-18:00
意见反馈:server@mailiao.group
紧急联系:181-67184787
ftqrcode

扫一扫关注我们

Powered by 职贝云数A新零售门户 X3.5© 2004-2025 职贝云数 Inc.( 蜀ICP备2024104722号 )