pom.xml
< dependency> < groupId> cn.hutool</ groupId> < artifactId> hutool-all</ artifactId> < version> 5.8.12</ version> </ dependency> < dependency> < groupId> org.apache.commons</ groupId> < artifactId> commons-lang3</ artifactId> < version> 3.6</ version> </ dependency>
java工具类
package com. zens. doudian. utils ; import cn. hutool. http. HttpRequest ;
import com. alibaba. fastjson. JSON;
import org. apache. commons. codec. binary. Base64 ;
import org. apache. commons. lang3. StringUtils ;
import org. slf4j. Logger ;
import org. slf4j. LoggerFactory ; import javax. crypto. Mac ;
import javax. crypto. spec. SecretKeySpec ;
import java. io. UnsupportedEncodingException ;
import java. net. URLEncoder ;
import java. nio. charset. StandardCharsets ;
import java. security. InvalidKeyException ;
import java. security. NoSuchAlgorithmException ;
import java. util. Collections ;
import java. util. HashMap ;
import java. util. List ;
import java. util. Map ;
public class DingTalkWebhookUtils { private static final Logger log = LoggerFactory . getLogger ( DingTalkWebhookUtils . class ) ; private static final int TIME_OUT = 10000 ; private static final String SECRET = "SECbd7fd971096ea3333e3d56bf30xxxxexxxxx" ; private static final String WEBHOOK = "https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxx" ; public static void main ( String [ ] args) { DingTalkWebhookUtils . sendWebhook ( WEBHOOK, SECRET, "测试推送!!!" , Collections . singletonList ( "18534xxxxx" ) ) ; } public static void sendMessage ( String content, List < String > mobileList) { sendWebhook ( WEBHOOK, SECRET, content, mobileList) ; } public static void sendWebhook ( String webhook, String secret, String content, List < String > mobileList) { try { if ( ! StringUtils . isEmpty ( secret) ) { Long timestamp = System . currentTimeMillis ( ) ; String sign = getSign ( timestamp, secret) ; webhook = new StringBuilder ( webhook) . append ( "×tamp=" ) . append ( timestamp) . append ( "&sign=" ) . append ( sign) . toString ( ) ; } System . out. println ( "webhook:" + webhook) ; boolean isAtAll = false ; String reqStr = buildReqStr ( content, isAtAll, mobileList) ; String result = postJson ( webhook, reqStr) ; log. info ( "推送响应结果:{}" , result) ; } catch ( Exception e) { log. info ( "发送群通知异常 异常原因:{}" , e. getMessage ( ) ) ; } } private static String buildReqStr ( String content, boolean isAtAll, List < String > mobileList) { Map < String , String > contentMap = new HashMap < > ( ) ; contentMap. put ( "content" , content) ; Map < String , Object > atMap = new HashMap < > ( ) ; atMap. put ( "isAtAll" , isAtAll) ; atMap. put ( "atMobiles" , mobileList) ; Map < String , Object > reqMap = new HashMap < > ( ) ; reqMap. put ( "msgtype" , "text" ) ; reqMap. put ( "text" , contentMap) ; reqMap. put ( "at" , atMap) ; return JSON. toJSONString ( reqMap) ; } private static String postJson ( String url, String reqStr) { String body = null ; try { body = HttpRequest . post ( url) . body ( reqStr) . timeout ( TIME_OUT) . execute ( ) . body ( ) ; } catch ( Exception e) { log. error ( "钉钉消息推送异常:{}" , e. getMessage ( ) ) ; } return body; } private static String getSign ( Long timestamp, String secret) throws NoSuchAlgorithmException , UnsupportedEncodingException , InvalidKeyException { String stringToSign = timestamp + "\n" + secret; Mac mac = Mac . getInstance ( "HmacSHA256" ) ; mac. init ( new SecretKeySpec ( secret. getBytes ( StandardCharsets . UTF_8) , "HmacSHA256" ) ) ; byte [ ] signData = mac. doFinal ( stringToSign. getBytes ( StandardCharsets . UTF_8) ) ; String sign = URLEncoder . encode ( new String ( Base64 . encodeBase64 ( signData) ) , "UTF-8" ) ; log. info ( "sign:" + sign) ; return sign; }
}