企业微信审批Java版
生活随笔
收集整理的這篇文章主要介紹了
企业微信审批Java版
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
業(yè)務(wù)背景:公司目前的審批是走erp后臺,然后還得走紙質(zhì)的打印出來審批,影響效率,現(xiàn)在需要在企業(yè)微信直接提交申請單,然后審批,最后將審批數(shù)據(jù)同步到erp后臺。
第一步:驗證回調(diào)Url,在配置回調(diào)url時,企業(yè)微信后臺需要驗證,因此需要寫一個回調(diào)驗證接口
/*** 回調(diào)接口接受企業(yè)微信驗證* @param msgSignature* @param timestamp* @param nonce* @param echostr* @param response*/ @GetMapping("/receiveData") public void verifyURL(@RequestParam("msg_signature") String msgSignature,@RequestParam("timestamp") Integer timestamp,@RequestParam("nonce") String nonce,@RequestParam("echostr") String echostr,HttpServletResponse response){PrintWriter out=null;try {out = response.getWriter();if(StringUtils.isNotEmpty(echostr)){log.info("驗證回調(diào)url有效性, 簽名:{},時間戳:{},隨機數(shù):{},密文:{}", msgSignature,timestamp,nonce,echostr);String sEchoStr=workWeiXinService.verifyURL(msgSignature,timestamp,nonce,echostr);if(StringUtils.isNotEmpty(sEchoStr)){out.write(sEchoStr);out.flush();}}} catch (IOException e) {log.error("企業(yè)微信回調(diào)url驗證錯誤",e.getMessage());e.printStackTrace();}finally {out.close();} } @Override public String verifyURL(String msgSignature, Integer timestamp, String nonce, String echostr) {String sEchoStr=null;try {WXBizJsonMsgCrypt wxBizJsonMsgCrypt = new WXBizJsonMsgCrypt(token, encodingAesKey, corpId);sEchoStr = wxBizJsonMsgCrypt.VerifyURL(msgSignature, timestamp.toString(),nonce, echostr);log.info("verifyurl echostr:{}",sEchoStr);} catch (Exception e) {log.error("驗證URL失敗,錯誤原因請查看異常,{}",e.getMessage());//驗證URL失敗,錯誤原因請查看異常e.printStackTrace();}return sEchoStr; }第二步:給前端生成簽名
(簽名一共分兩種,筆者剛開始只給自建應(yīng)用生成了簽名,后來在和前端聯(lián)調(diào)過程中,發(fā)現(xiàn)報錯,驗簽不通過,后經(jīng)官方文檔排查還需要給jsAPI生成簽名)
@Override public SignatureResponse getSignature(String url) { String approvalTicket =getApprovalTicket(); JSONObject approvalObject=getSignature(approvalTicket,url); String jsapiTicket = getJsapiTicket(); JSONObject jsapiObject=getSignature(jsapiTicket,url); SignatureResponse response=new SignatureResponse(); response.setSignature(approvalObject.get("signature").toString()); response.setNonce(approvalObject.get("nonceStr").toString()); response.setTimestamp(Long.valueOf(approvalObject.get("timestamp").toString())); response.setCorpId(corpId); response.setSignatureConfig(jsapiObject.get("signature").toString()); response.setNonceConfig(jsapiObject.get("nonceStr").toString()); response.setTimestampConfig(Long.valueOf(jsapiObject.get("timestamp").toString())); return response; } private JSONObject getSignature(String ticket, String url) {JSONObject jsonObject=new JSONObject();String nonce=getNonce();Long timeStamp=getTimeStamp();String plainText= "jsapi_ticket=" + ticket +"&noncestr=" + nonce +"×tamp=" + timeStamp +"&url=" + url;String signature=null;try {MessageDigest crypt = MessageDigest.getInstance("SHA-1");crypt.reset();crypt.update(plainText.getBytes("UTF-8"));signature = byteToHex(crypt.digest());jsonObject.put("nonceStr",nonce);jsonObject.put("timestamp",timeStamp);jsonObject.put("signature",signature);jsonObject.put("ticket",ticket);}catch (NoSuchAlgorithmException e){e.printStackTrace();}catch (UnsupportedEncodingException e){e.printStackTrace();}return jsonObject; }private String getJsapiTicket() {String accessToken = getAccessToken();String jsapiTicket = getJsapiTicket(accessToken);return jsapiTicket; }/*** 獲取審批應(yīng)用的ticket* @return*/ private String getApprovalTicket() {String accessToken = getAccessToken();String approvalTicket=getApprovalTicket(accessToken);return approvalTicket; } private String getAccessToken() {String reqAccessTokenUrl="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid="+corpId+"&corpsecret="+corpSecret;String reqAccessTokenResponse = HttpClient.sendGetRequest(reqAccessTokenUrl, Constants.ENCODE_UTF8);String accessToken=null;if(StringUtils.isNotEmpty(reqAccessTokenResponse)){AccessTokenResponse accessTokenResponse = com.alibaba.fastjson.JSONObject.parseObject(reqAccessTokenResponse, AccessTokenResponse.class);accessToken=accessTokenResponse.getAccess_token();}return accessToken; } private String getAccessToken() {String reqAccessTokenUrl="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid="+corpId+"&corpsecret="+corpSecret;String reqAccessTokenResponse = HttpClient.sendGetRequest(reqAccessTokenUrl, Constants.ENCODE_UTF8);String accessToken=null;if(StringUtils.isNotEmpty(reqAccessTokenResponse)){AccessTokenResponse accessTokenResponse = com.alibaba.fastjson.JSONObject.parseObject(reqAccessTokenResponse, AccessTokenResponse.class);accessToken=accessTokenResponse.getAccess_token();}return accessToken; } private String getJsapiTicket(String accessToken) {String reqJsapiTicketUrl="https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token="+accessToken;String reqJsapiTicketResponse = HttpClient.sendGetRequest(reqJsapiTicketUrl, Constants.ENCODE_UTF8);String jsapiTicket=null;if(StringUtils.isNotEmpty(reqJsapiTicketResponse)){JsapiTicketResponse response= JSONObject.parseObject(reqJsapiTicketResponse,JsapiTicketResponse.class);jsapiTicket=response.getTicket();}log.info("accessToken:{},jsapiTicket:{}",accessToken,jsapiTicket);return jsapiTicket; } private String getApprovalTicket(String accessToken) {String reqJsapiTicketUrl="https://qyapi.weixin.qq.com/cgi-bin/ticket/get?access_token="+accessToken+"&type=agent_config";String reqJsapiTicketResponse = HttpClient.sendGetRequest(reqJsapiTicketUrl, Constants.ENCODE_UTF8);String jsapiTicket=null;if(StringUtils.isNotEmpty(reqJsapiTicketResponse)){JsapiTicketResponse response= JSONObject.parseObject(reqJsapiTicketResponse,JsapiTicketResponse.class);jsapiTicket=response.getTicket();}log.info("accessToken:{},approvalTicket:{}",accessToken,jsapiTicket);return jsapiTicket; } private String byteToHex(byte[] hash) {Formatter formatter = new Formatter();for (byte b : hash){formatter.format("%02x", b);}String result = formatter.toString();formatter.close();return result; }private Long getTimeStamp() {return System.currentTimeMillis() / 1000; }private String getNonce() {String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";Random random = new Random();StringBuffer sb = new StringBuffer();for (int i = 0; i < 16; i++) {int number = random.nextInt(base.length());sb.append(base.charAt(number));}return sb.toString(); }第三步:回調(diào)接口接受企業(yè)微信審批數(shù)據(jù)
/*** 回調(diào)接口接受企業(yè)微信審核數(shù)據(jù)* @param requestDto* @return*/ @PostMapping("/receiveData") public void receiveData(@RequestParam("msg_signature") String msgSignature,@RequestParam("timestamp") Integer timestamp,@RequestParam("nonce") String nonce,@RequestBody(required=false) WorkWeiXinCallBack requestDto,HttpServletResponse response) {log.info("回調(diào)接口接受企業(yè)微信審核數(shù)據(jù)信息, 信息:{}", JSONObject.toJSONString(requestDto));workWeiXinService.receiveData(msgSignature,timestamp,nonce,requestDto);PrintWriter out=null;try {out = response.getWriter();out.write("SUCCESS");out.flush();}catch (IOException e) {log.error("企業(yè)微信回調(diào)url驗證錯誤",e.getMessage());e.printStackTrace();}finally {out.close();} } @Override public void receiveData(String msgSignature,Integer timestamp,String nonce,WorkWeiXinCallBack requestDto) {try {WXBizJsonMsgCrypt wxBizJsonMsgCrypt = new WXBizJsonMsgCrypt(token, encodingAesKey, corpId);String sReqData = com.alibaba.fastjson.JSONObject.toJSONString(requestDto);String sMsg = wxBizJsonMsgCrypt.DecryptMsg(msgSignature, timestamp.toString(), nonce, sReqData);log.info("after decrypt msg:{} ", sMsg);JSONObject json = new JSONObject(sMsg);String Content = json.getString("Content");log.info("回調(diào)接口接受企業(yè)微信審核數(shù)據(jù)信息Content:{}",Content);WorkWeiXinCallBackAuditInfo workWeiXinCallBackAuditInfo = com.alibaba.fastjson.JSONObject.parseObject(Content, WorkWeiXinCallBackAuditInfo.class);//WorkWeiXinCallBackAuditInfo workWeiXinCallBackAuditInfo =(WorkWeiXinCallBackAuditInfo) JSON.parse(Content);//申請單當(dāng)前審批狀態(tài):1-審批中;2-已通過;3-已駁回;4-已撤銷if(workWeiXinCallBackAuditInfo.getApprovalInfo().getOpenSpStatus()!=2){return;}String thirdNo = workWeiXinCallBackAuditInfo.getApprovalInfo().getThirdNo();log.info("回調(diào)接口接受企業(yè)微信審核數(shù)據(jù),審核訂單號:{}",thirdNo);//獲取訪問tokenString accessToken=getAccessToken();String reqApprovalInfoUrl="https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovaldetail?access_token="+accessToken;Map<String,Object> param=new HashMap<>();param.put("sp_no",thirdNo);Map<String,Object> result = HttpClient.sendPostRequestForJson(reqApprovalInfoUrl, param,Map.class);if(result ==null || result.get("info") ==null){return;}//-----------------------企業(yè)微信審核申請數(shù)據(jù)解析start-------------------------String applyUserId = workWeiXinCallBackAuditInfo.getApprovalInfo().getApplyUserId();String applyUserName = workWeiXinCallBackAuditInfo.getApprovalInfo().getApplyUserName();Map<String,Object> info = (Map<String, Object>) result.get("info");Map<String,Object> applyData = (Map<String, Object>) info.get("apply_data");List<Map<String,Object>> contentList= (List<Map<String, Object>>) applyData.get("contents");String overseasServiceRate=null;String startTime=null;String endTime=null;String overseasServiceRemark=null;Integer memberId=0;for(Map<String,Object> content:contentList){Map<String,Object> value= (Map<String, Object>) content.get("value");if("startTime".equals(content.get("id").toString())){startTime=value.get("text").toString();}else if("endTime".equals(content.get("id").toString())){endTime=value.get("text").toString();}else if("overseasServiceRemark".equals(content.get("id").toString())){overseasServiceRemark=value.get("text").toString();}else if("overseasServiceRate".equals(content.get("id").toString())){overseasServiceRate=value.get("text").toString();}else if("memberId".equals(content.get("id").toString())){memberId= Ints.tryParse(value.get("text").toString());}}//-------------------------企業(yè)微信審核申請數(shù)據(jù)解析end-----------------------AppMemOverSeasService appMemOverSeasService=new AppMemOverSeasService();appMemOverSeasService.setOverseasServiceRate(new BigDecimal(overseasServiceRate));appMemOverSeasService.setOverseasServiceState((byte)1);appMemOverSeasService.setEffectiveStatus((byte)1);appMemOverSeasService.setCreateTime(new Date());appMemOverSeasService.setStartTime(DateUtil.StrToDate(startTime,"yyyy-MM-dd HH:mm"));appMemOverSeasService.setEndTime(DateUtil.StrToDate(endTime,"yyyy-MM-dd HH:mm"));appMemOverSeasService.setMemberId(memberId);appMemOverSeasService.setOverseasServiceRemark(overseasServiceRemark);appMemOverSeasServiceMapper.insertSelective(appMemOverSeasService);log.info("回調(diào)接口接受企業(yè)微信審核數(shù)據(jù)信息新增成功:{}", com.alibaba.fastjson.JSONObject.toJSONString(appMemOverSeasService));try {String content= "會員境外服務(wù)費修改成功\r\n" +"會員id:" +applyUserId+"\r\n"+"會員名稱:" +applyUserName+"\r\n"+"境外服務(wù)費:" +overseasServiceRate+"\r\n"+"開始時間:" +startTime+"\r\n"+"結(jié)束時間:"+endTime+"\r\n";new Thread(() -> weixinService.sendQYWXMessageByNum(content, applyUserId)).start();} catch (Exception e) {log.error("發(fā)送企業(yè)微信通知異常:{}",e.getMessage());e.printStackTrace();}log.info("推送通知提交人,企業(yè)微信通知成功,審核單編號:{}", thirdNo);} catch (Exception e) {log.info("解密失敗,失敗原因請查看異常:",e.getMessage());// 解密失敗,失敗原因請查看異常e.printStackTrace();} }企業(yè)微信審批后 會自動回調(diào)企業(yè)服務(wù)器地址
總結(jié)
以上是生活随笔為你收集整理的企业微信审批Java版的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GD32系列总结 - systick介绍
- 下一篇: 广西壮族自治区计算机证书查询,职业资格证