布景
1.短期公司java名目需要连接企业微疑的审批功用,用户提接审批,转到企业微疑截至审批过程,审批后背景施行响应操纵,连接到企业微疑中即是收收审批、审批处置(企业微疑内部)、审批疑息回调、后绝处置
2.为便利连接企业微疑,快速使用各交心,原次使用了wecom-sdk那个名目连接企业微疑,可是该名目不供给学程文档,唯一示例代码中的小段笔墨分析,需要设置甚么其实不大白,尔小我私家也是探究了好久终极运行胜利,正在那里也是分享一下尔的经历,并干一下记载
操纵
1.引进wecom-sdk
https://gitee.com/felord/wecom-sdk拜访 名目下载最新版原,尔原次使用的是1.3.4版原
将samples中的文献按照自己的名目构造复造到名目中对于应职位
api文献夹中为controller文献,自己按需复造到指定职位
名目中引进相干依靠:- <dependency>
- <groupId>cn.felord</groupId>
- <artifactId>wecom-sdk</artifactId>
- <version>1.3.4</version>
- </dependency>
复造代码 可以需要引进okhttp的依靠
名目民间分析:
会报错NoSuchMethod的是因为您名目自己引进了Okhttp,可是版原比力高,招致没有兼容的情况,可颠末如下依靠引进wecom-sdk
- <dependency>
- <groupId>cn.felord</groupId>
- <artifactId>wecom-sdk</artifactId>
- <version>1.3.4</version>
- <exclusions>
- <exclusion>
- <groupId>com.squareup.okhttp3</groupId>
- <artifactId>okhttp</artifactId>
- </exclusion>
- <exclusion>
- <groupId>com.squareup.okhttp3</groupId>
- <artifactId>logging-interceptor</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>com.squareup.okhttp3</groupId>
- <artifactId>okhttp</artifactId>
- <version>4.12.0</version>
- </dependency>
- <dependency>
- <groupId>com.squareup.okhttp3</groupId>
- <artifactId>logging-interceptor</artifactId>
- <version>4.12.0</version>
- </dependency>
复造代码 2.设置企业微疑参数(涉及回调)
起首需要企业微疑的自修使用用往返调,并树立可托域名战企业可托IP,那里没有细分析能够参照其余学程,结果以下:
需要使用企业微疑自修使用三件套,企业ID(尔的企业页里最下圆看来,corpId),自修使用的AgentId战Secret(自修使用页里上圆看来)
借需要设置回调交心,先正在自己的名目中设置佳回调交心,复造收缩包中api文献夹的CallbackController.java按照自己名目微调便可,并搁止制止拦阻
需要留神的是,那里controller交心的设置,正在交心地点上增加corpId战agentId
而后正在功用中的领受消息设置交心等疑息
URL为交心地点,忘患上前面戴上corpId战agentId,Token战EncodingAESKey面随机获得,此时记载那二个值,需要正在名目中树立。领受的消息工作范例自止挑选。
正在WecomCallbackSettingsServiceImpl中树立settings的值,三个属性别离是Token、EncodingAESKey战CorpId
运行名目保证交心能够跑通后,面打企业微疑树立效劳器页里的保留,会显现设置疑息,证实回调树立结束
3.审批模板树立
使用企业微疑使用中的审批使用成立模板,没有是自修使用中的审批模板
对于模板的成立根据自己需要去,咱们存眷的是模板ID的获得,二种方法,一个是面打模板概略后,目前url中最初的部门即是模板,大概面打最上圆的模板名,会呈现模板id疑息
4.提接审批代码编辑示例,尔的模板以下:
值患上留神的是,颠末交心提接审批恳求没有会读与正在企业微疑中树立的审批过程,需要咱们自己正在代码中树立审批节面(WecomApprove是尔自止创立的数据表,请按需树立自己的表或者没有保留)- ListContentDataValue finalTableData = tableData;// 明细控件实质
- String templateId = "C4c奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫";
- AgentDetails nativeAgent = DefaultAgent.of(systemConfigService.getValueByKey(WecomConstants.WECOM_CORPID),
- systemConfigService.getValueByKey(WecomConstants.WECOM_NOTIFY_SECRET),
- systemConfigService.getValueByKey(WecomConstants.WECOM_NOTIFY_AGENTID));
- ApprovalApi approvalApi = workWeChatApi.approvalApi(nativeAgent);
- ApprovalTmpDetailResponse templateDetail = approvalApi.getTemplateDetail(TemplateId.of(templateId));
- System.out.println("templateDetail = " + templateDetail);
- String templateName = templateDetail.getTemplateNames().get(0).getText();
- List<Su妹妹ary> su妹妹aryList = Collections.singletonList(Su妹妹ary.zhCN(templateName+"恳求"));
- //依据 模板构造调解数据值列表
- List<ContentDataValue> dataValues = Arrays.asList(
- TextValue.from(existOrder.getOrderId()), // 定单号
- TextValue.from(userService.getById(existOrder.getUid()).getNickname()), // 客户称呼
- MoneyValue.from(existOrder.getPayPrice()), // 真付金额
- MoneyValue.from(request.getPayPrice()), // 改价金额
- // 商品明细(表格控件)
- finalTableData,
- TextValue.from("改价启事示例") // 改价启事
- );
- // 审批人、打点人、抄收人
- String approver = "ZhangSan";
- String processor = "ZhangSan";
- String cc = "ZhangSan";
- /*参数分析
- ProcessNode.cc(): 抄收节面,指定抄收人
- ProcessNode.assignees(): 审批节面,指定审批人
- ApvRel.ALL: 会签(统统审批人皆需审批)
- ApvRel.OR: 或者签(任一审批人审批便可)
- ProcessNode.processor():处置 节面,指定处置人*/
- List<ProcessNode> nodeList = Arrays.asList(
- //ProcessNode.cc(Collections.singletonList("3958")),
- //ProcessNode.assignees(ApvRel.ALL, Arrays.asList("4921", "2774")),
- ProcessNode.assignees(ApvRel.OR, Arrays.asList(approver)),
- ProcessNode.processor(Collections.singletonList(processor))
- //ProcessNode.cc(Collections.singletonList(cc))
- );
- String applicant = loginUserVo.getUser().getWechatAccount();
- GenericResponse<String> stringGenericResponse = approvalApi.applyEvent(ProcessApplyRequest.approveMode(
- applicant,
- templateId,
- nodeList,
- templateDetail.getTemplateContent().getControls(),
- dataValues,
- su妹妹aryList
- ));
- System.out.println("stringGenericResponse = " + stringGenericResponse);
- //保管 审批疑息到数据表
- WecomApprove wecomApprove = new WecomApprove();
- ObjectMapper mapper = new ObjectMapper();
- JsonNode jsonNode = null;
- try {
- jsonNode = mapper.readTree(stringGenericResponse.getData());
- } catch (JsonProcessingException ex) {
- throw new RuntimeException(ex);
- }
- // 获得前去的审批ID
- String spNo = jsonNode.asText();
- wecomApprove.setName(templateName);
- wecomApprove.setTemplateId(templateId);
- wecomApprove.setApproveId(spNo);
- wecomApprove.setApplicant(applicant);
- wecomApprove.setApprover(approver);
- wecomApprove.setStatus(1);
- wecomApprove.setParams(JSONUtil.toJsonStr(request));
- wecomApproveService.save(wecomApprove);
复造代码 5.树立审批回调工作处置
wecom-sdk供给的示例文献中并无审批相干的处置文献,需要咱们自己编辑一个,从其余类复造一份截至改写
那些文献的区分正在于匹配的工作范例差别,此中,对于工作范例品种正在CallbackEvent看来,具体哪一种工作对于应甚么值详睹企业微疑开辟文档,将工作范例交流成需要的- public boolean matched(CallbackEvent event) {
- return CallbackEvent.SYS_APPROVAL_CHANGE.equals(event);
- }
复造代码 咱们编辑一下审批回调工作:- @Override
- public void consume(CallbackEventBody body) {
- CallbackEvent event = body.getEvent();
- CallbackChangeType changeType = body.getChangeType();
- ApprovalInfo approvalInfo = body.getApprovalInfo();
- if (Objects.nonNull(approvalInfo)) {
- //处置 审批变动工作
- log.info("领受到审批变动工作");
- // 获得审批形状
- SpStatus spStatus = approvalInfo.getSpStatus();
- //StatusChangeEvent statuChangeEvent = approvalInfo.getStatuChangeEvent();
- //依据 差别形状处置
- switch (spStatus.getType()) {
- case 1://APPROVAL(1)审批中
- break;
- case 2://ACCEPTED(2)曾经过
- // 审批颠末处置逻辑
- handleApprovalAccepted(approvalInfo);
- break;
- case 3://REJECTED(3)已经采纳
- // 审批拒绝处置逻辑
- handleApprovalRejected(approvalInfo);
- break;
- case 4://REVOKED(4)已经打消
- // 审批打消处置逻辑
- handleApprovalCanceled(approvalInfo);
- break;
- default:
- log.warn("其余审批形状: {}", spStatus);
- break;
- }
- }
- }
复造代码 需要处置甚么审批形状回和谐后绝处置工作按需编辑(FinishTime完毕时间出找到交心获得,可是企业微疑审批列表却有那个值,便自己天生了)- /**
- *处置 审批颠末工作
- */
- private void handleApprovalAccepted(ApprovalInfo approvalInfo) {
- // 完毕审批颠末的营业逻辑
- log.info("审批颠末,审批编号: {},开端处置{}后绝逻辑", approvalInfo.getSpNo(), approvalInfo.getSpName());
- // 读与审批疑息,获得审批参数
- WecomApprove wecomApprove= wecomApproveService.getOne(new QueryWrapper<WecomApprove>().eq("approve_id",approvalInfo.getSpNo()));
- StoreOrderUpdatePriceRequest request = JSON.parseObject(wecomApprove.getParams(), StoreOrderUpdatePriceRequest.class);
- // 施行改价逻辑,保留审批成果
- //依据 恳求人得到办理员id
- SystemAdmin systemAdmin = systemAdminService.getOne(new QueryWrapper<SystemAdmin>().eq("wechat_account",wecomApprove.getApplicant()));
- Boolean result =storeOrderService.updatePriceCallBack(request, systemAdmin.getId());
- if (result){
- wecomApprove.setStatus(2);
- wecomApprove.setFinishTime(DateTime.now());
- wecomApproveService.updateById(wecomApprove);
- log.info("审批颠末后改价完毕");
- }else{
- log.info("审批颠末后改价失利");
- }
- }
复造代码 6.一个小坑,没有明白是否是统统人皆如许,即是wecom-sdk给出的WecomCallbackSettings类尔那里运行提醒需要序列化,归正尔是加之了,如果没有呈现便没有减吧。
归纳:
今朝便那些实质,期望各人均可以顺遂交进名目 |