首先說一下需求
每天定時往釘釘的2個不同的羣推送一些類似於祕鑰的文字。
聲明:https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq/XAzBI 參考文檔
我用的第二種簽名加密方式創建的發送代碼如下:
package com.jeecg.dingDing.controller;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.jeecg.dingDing.entity.TRobotGroupEntity;
import com.jeecg.dingDing.service.TRobotGroupServiceI;
import com.jeecg.sapjeecg.SapDingDingTask.HttpUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.net.util.Base64;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.jeecgframework.core.annotation.JAuth;
import org.jeecgframework.core.common.model.json.AjaxJson;
import org.jeecgframework.core.enums.Permission;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping("/query*****")
@JAuth(auth = Permission.SKIP_AUTH)//跳過認證
public class DingGroup {
@Autowired
private TRobotGroupServiceI tRobotGroupService;
@RequestMapping(params = "querySend*****")
@ResponseBody
public AjaxJson querySendDingGroup(HttpServletRequest request) {
SimpleDateFormat format = new SimpleDateFormat("MM月dd日");
SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd");
String message = null;
AjaxJson j = new AjaxJson();
message = "獲取成功";
String contentMsg = "";
String secret1 = "SEC107ad4f4582cc5e96646d4***";
String access_token1="153e3394979fc99c63e58ddc61b2439b04cd52a8995f1ca6***";
String secret2 = "SEC178e5b5c8a9533f397f29f10b043e22666ed6c17ae76a1319668***";
String access_token2="9781852943eef4bd6e7f69dc6aeea03a7c06b84a36155a85a0***";
TRobotGroupEntity tRobotGroupEntity = tRobotGroupService.findUniqueByProperty(TRobotGroupEntity.class, "dateTime", dateTimeFormat.format(new Date()));
if (tRobotGroupEntity!=null){
contentMsg = tRobotGroupEntity.getContent();
if(StringUtils.isNotBlank(contentMsg)){
try{
//配置簽名
Long timestamp1 = System.currentTimeMillis();
String stringToSign1 = timestamp1 + "\n" + secret1;
Mac mac1 = Mac.getInstance("HmacSHA256");
mac1.init(new SecretKeySpec(secret1.getBytes("UTF-8"), "HmacSHA256"));
byte[] signData1 = mac1.doFinal(stringToSign1.getBytes("UTF-8"));
String sign1 = URLEncoder.encode(new String(Base64.encodeBase64(signData1)),"UTF-8");
System.out.println(sign1);
//釘釘機器人地址(配置機器人的webhook)
String dingUrl1 = "https://oapi.dingtalk.com/robot/send?access_token="+access_token1+"×tamp="+timestamp1+"&sign="+sign1+"";
//是否通知所有人
boolean isAtAll1 = true;
//通知具體人的手機號碼列表
List<String> mobileList1 = Lists.newArrayList();
String content1= contentMsg+format.format(new Date());
String reqStr1 = buildReqStr(content1, isAtAll1, mobileList1);
String result1 = HttpUtils.doPostJson(dingUrl1, reqStr1);
System.out.println("result1 == " + result1);//result == {"errcode":0,"errmsg":"ok"}
/**
* 第二個羣
*/
CloseableHttpClient client = HttpClients.createDefault();
client.close();
// Thread.sleep(11000); // 休眠1秒
//配置簽名
Long timestamp2 = System.currentTimeMillis();
String stringToSign2 = timestamp2 + "\n" + secret2;
Mac mac2 = Mac.getInstance("HmacSHA256");
mac2.init(new SecretKeySpec(secret2.getBytes("UTF-8"), "HmacSHA256"));
byte[] signData2 = mac2.doFinal(stringToSign2.getBytes("UTF-8"));
String sign2 = URLEncoder.encode(new String(Base64.encodeBase64(signData2)),"UTF-8");
System.out.println(sign2);
//釘釘機器人地址(配置機器人的webhook)
String dingUrl2 = "https://oapi.dingtalk.com/robot/send?access_token="+access_token2+"×tamp="+timestamp2+"&sign="+sign2+"";
//是否通知所有人
boolean isAtAll2 = true;
//通知具體人的手機號碼列表
List<String> mobileList2 = Lists.newArrayList();
String content2= contentMsg+format.format(new Date());
String reqStr2 = buildReqStr(content2, isAtAll2, mobileList2);
String result2 = HttpUtils.doPostJson(dingUrl2, reqStr2);
System.out.println("result2 == " + result2);//result == {"errcode":0,"errmsg":"ok"}
}catch(Exception e){
e.printStackTrace();
message = "獲取失敗";
throw new org.jeecgframework.core.common.exception.BusinessException(e.getMessage());
}
}
}else {
message = "當日未配置發送數據";
}
j.setMsg(message);
return j;
}
/**
* 組裝請求報文
* @param content
* @return
*/
private static String buildReqStr(String content, boolean isAtAll, List<String> mobileList) {
//消息內容
Map<String, String> contentMap = Maps.newHashMap();
contentMap.put("content", content);
//通知人
Map<String, Object> atMap = Maps.newHashMap();
//1.是否通知所有人
atMap.put("isAtAll", isAtAll);
//2.通知具體人的手機號碼列表
atMap.put("atMobiles", mobileList);
Map<String, Object> reqMap = Maps.newHashMap();
reqMap.put("msgtype", "text");//image
reqMap.put("text", contentMap);
reqMap.put("at", atMap);
return JSON.toJSONString(reqMap);
}
}
返回結果:
result1 == {"errcode":0,"errmsg":"ok"}
result2 == {"errcode":0,"errmsg":"ok"}
看結果均返回成功。 boolean isAtAll = true;
結果發現測試的2個羣和正式的2個羣都是這個結果,但是有一個羣就是收不到信息,如果把 是否@所有人設置爲false 兩個都可以發送。單個測試的時候,一個個也能成功。後來再次單個測試的時候,又沒發送過去。
釘釘接口始終返回
result1 == {"errcode":0,"errmsg":"ok"}
result2 == {"errcode":0,"errmsg":"ok"}
或者:result2 == {"errcode":40004,"errmsg":"一堆亂碼"}
網上查詢了錯誤代碼 https://blog.csdn.net/weixin_40514790/article/details/104249446 參考錯誤代碼地址
什麼鬼看不懂,繼續想.....
實在沒辦法,就換了一種方式
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/robot/send?access_token=566cc69da782ec******");
OapiRobotSendRequest request = new OapiRobotSendRequest();
request.setMsgtype("text");
OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text();
text.setContent("測試文本消息");
request.setText(text);
OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
at.setAtMobiles(Arrays.asList("132xxxxxxxx"));
request.setAt(at);
OapiRobotSendResponse response = client.execute(request);
結果意外出來了:
後續。。。。。
我找到管理員把他給弄死了.............