首先我们要知道企业微信推送消息的步骤,企业微信官方提供了多个API供我们调用,这里我们只讲我们需要的API;

企业微信的官方开放的API地址:https://work.weixin.qq.com/api/doc

推送企业微信消息分为这么几步:

1、建立一个企业应用,我们只能给应用里面的成员发送消息;

2、获取accss_token,这是通过企业微信的获取token的接口获取的

请求方式:GET(HTTPS
请求URL:https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRECT

参数解释:

corpid:企业id,每个企业微信都有唯一的一个corpid;

corpsecret:应用的凭证密钥,这个是你要发送消息给应用下的成员的corpsecret

返回值:

expires_in是有效时间,单位是秒

{"errcode":0,"errmsg":"","access_token": "accesstoken000001","expires_in": 7200
}

3、获取到access_token以后,你就可以向应用的成员推送企业微信消息了(这里我们以最简单的发送text为例子,其它的发送图片等消息大同小异,大家可以自己查看官方文档);

推送消息的接口:

请求方式:POST(HTTPS
请求地址: https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN

请求示例:

{"touser" : "UserID1|UserID2|UserID3",//企业微信的唯一userid,非必输"toparty" : "PartyID1|PartyID2",//部门id,非必输,如果输入了就只给指定部门发送消息"totag" : "TagID1 | TagID2",//标签,非必输,传输了就只给指定的标签发送消息"msgtype" : "text",//消息类型,必输,text等"agentid" : 1,//应用id,必输,每个应用都有一个唯一的应用id"text" : {"content" : "你的快递已到,请携带工卡前往邮件中心领取。\n出发前可查看<a href=\"http://work.weixin.qq.com\">邮件中心视频实况</a>,聪明避开排队。"},//发送的消息"safe":0//是否安全传输
}

参数说明:

参数 是否必须 说明
touser 成员ID列表(消息接收者,多个接收者用‘|’分隔,最多支持1000个)。特殊情况:指定为@all,则向该企业应用的全部成员发送
toparty 部门ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数
totag 标签ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数
msgtype 消息类型,此时固定为:text
agentid 企业应用的id,整型。可在应用的设置页面查看
content 消息内容,最长不超过2048个字节
safe 表示是否是保密消息,0表示否,1表示是,默认0

返回示例:

 {"errcode" : 0,"errmsg" : "ok","invaliduser" : "userid1|userid2", // 不区分大小写,返回的列表都统一转为小写"invalidparty" : "partyid1|partyid2","invalidtag":"tagid1|tagid2"}

如果部分接收人无权限或不存在,发送仍然执行,但会返回无效的部分(即invaliduser或invalidparty或invalidtag),常见的原因是接收人不在应用的可见范围内

注:企业微信推送消息的步骤就这么几步,很简单,用户也可以根据自己的实际需求参考企业微信的api实现更多的功能,着咯就不再赘述,接下来我们看看代码的实现:

基础消息类:

package company.sendmessage;import lombok.Data;/*** 消息基类(企业号 -> 普通用户)* @author **/@Data
public class BaseMessage {// 否 成员ID列表(消息接收者,多个接收者用‘|’分隔,最多支持1000个)。特殊情况:指定为@all,则向该企业应用的全部成员发送private String touser;// 否 部门ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数private String toparty;// 否 标签ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数private String totag;// 是 消息类型private String msgtype;// 是 企业应用的id,整型。可在应用的设置页面查看private Integer agentid;
}

推送消息类:

/*** 文本消息* @author**/@Data
public class TextMessage extends BaseMessage {//文本private Text text;//否     表示是否是保密消息,0表示否,1表示是,默认0private int safe;}

具体要发送的消息:

/*** 文本* @author **/@Data
public class Text {//是    消息内容,最长不超过2048个字节private String content;}

接收accesstoken类:

/*** @desc  : 微信通用接口凭证 * * @author: * @date  : 2018-8-17 下午9:35:11*/
public class AccessToken {  // 获取到的凭证  private String token;  // 凭证有效时间,单位:秒  private int expiresIn;  public String getToken() {  return token;  }  public void setToken(String token) {  this.token = token;  }  public int getExpiresIn() {  return expiresIn;  }  public void setExpiresIn(int expiresIn) {  this.expiresIn = expiresIn;  }
}  

异常处理类:

import lombok.Data;@Data
public class BizException extends RuntimeException {private int code;private String msg;private EnumsUtils enumsUtils;public BizException(EnumsUtils enumsUtils) {this.enumsUtils = enumsUtils;}public BizException(int code, String msg){this.code = code;this.msg = msg;}}

异常枚举类:

import lombok.Getter;@Getter
public enum EnumsUtils {FAIL(000, "操作失败"),SUCCESS(100, "操作成功"),BASEMESSAGE_ISEMPTY(110, "基础信息不能为null"),MSGTYPE_ISEMPTY(120, "发送消息类型不能为空"),WEIXINPARAMES_ISEMPTY(130, "微信参数不能为null"),AGENTID_ISEMPTY(131, "应用ID不能为空"),CORPID_ISEMPTY(132, "企业ID不能为空"),AGENTSECRET_ISEMPTY(133, "应用密钥不能为空"),WEIXIN_CONNECT_FAILED(134, "请求微信接口失败"),WEIXIN_HAPPEN_EXCEPTION(135, "请求微信接口发生未知错误"),APPLY_TOKEN_FAILED(136, "请求应用token发生未知错误"),SENDMESSAGE_FAILED(137, "发送企业微信消息失败"),SENDMAIL_PARAM_ISEMPTY(138, "发送Email基础参数不能为空"),SENDMAIL_FROM_ISEMPTY(139, "Email邮件发送人不能为空"),SENDMAIL_TO_ISEMPTY(140, "Email邮件收件人不能为空"),SENDMAIL_MESSAGING_EXCEPTION(141, "Email邮件发送缺少发送类");private int code;private String msg;EnumsUtils(int code, String msg) {this.code = code;this.msg = msg;}}

参数检验类:

/*** 校验参数的工具类** @Author * @date 2018-08-17*/public class CheckParamsUtil {/*** 校验基本参数BaseMessage** @param message*/public static void checkBaseMessage(RequestMessage message) {//baseMessage不能为空if (null == message) {throw new BizException(EnumsUtils.BASEMESSAGE_ISEMPTY);}if (StringUtils.isEmpty(message.getMsgtype())) {throw new BizException(EnumsUtils.MSGTYPE_ISEMPTY);}if (null == message.getAgentid()) {throw new BizException(EnumsUtils.AGENTID_ISEMPTY);}}/*** 校验基本参数WeiXinParames** @param weiXinParames*/public static void checkWeiXinParames(WeiXinParames weiXinParames) {if (null == weiXinParames) {throw new BizException(EnumsUtils.WEIXINPARAMES_ISEMPTY);}if (StringUtils.isEmpty(weiXinParames.getCorpId())) {throw new BizException(EnumsUtils.CORPID_ISEMPTY);}if (StringUtils.isEmpty(weiXinParames.getAgentSecret())) {throw new BizException(EnumsUtils.AGENTSECRET_ISEMPTY);}}/** 检查参数* @param entity*/public static void checkMailParam(SendMailUtils.EmailEntity entity) {if (null == entity) {throw new BizException(EnumsUtils.SENDMAIL_PARAM_ISEMPTY);}//发件人不能为空if (org.springframework.util.StringUtils.isEmpty(entity.getFrom())) {throw new BizException(EnumsUtils.SENDMAIL_FROM_ISEMPTY);}//收件人不能为空if (CollectionUtils.isEmpty(entity.getTo())) {throw new BizException(EnumsUtils.SENDMAIL_TO_ISEMPTY);}}
}

证书信任器:

/** * 证书信任管理器(用于https请求) *  * @author * @date 2018-08-17*/
public class MyX509TrustManager implements X509TrustManager {  public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {  }  public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {  }  public X509Certificate[] getAcceptedIssuers() {  return null;  }
}  

我们提供别人的发送消息的接口接收参数:

/*** 消息基类(企业号 -> 普通用户)* @author **/@Data
public class RequestMessage {// 否 成员ID列表private List<String> touser;// 否 部门ID列表private List<String> toparty;// 否 标签ID列表private List<String> totag;// 是 消息类型private String msgtype;// 是 企业应用的id,整型。可在应用的设置页面查看private Integer agentid;//文本private Text text;//否     表示是否是保密消息,0表示否,1表示是,默认0private int safe;
}

接口返回参数:

package company.sendmessage;import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;import java.io.Serializable;@Setter
@Getter
@ToString
@NoArgsConstructor
public class ResultJson<T> implements Serializable {/*** 返回编码*/private int code;/*** 返回消息*/private String msg;/*** 返回数据*/private T data;public ResultJson(T date) {this.data = date;}public ResultJson(int code, String msg) {this.code = code;this.msg = msg;}public ResultJson(int code, T data) {this.code = code;this.data = data;}public ResultJson(String msg, T data) {this.msg = msg;this.data = data;}public ResultJson(EnumsUtils enumsUtils, T data) {this.code = enumsUtils.getCode();this.msg = enumsUtils.getMsg();this.data = data;}public ResultJson(EnumsUtils enumsUtils) {this.code = enumsUtils.getCode();this.msg = enumsUtils.getMsg();}
}

发送消息的service:

package com.newnoa.framework.sendmessage;import com.google.gson.Gson;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** @desc : 发送消息* @author: * @date : 2018-8-17 上午10:06:23*/
public class SendMessageService {private static Logger log = LoggerFactory.getLogger(SendMessageService.class);private static final String SENDMESSAGE_URL = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=";/*** @param accessToken* @param message     void* @desc :0.公共方法:发送消息*/public String sendMessage(String accessToken, BaseMessage message, WeiXinParames weiXinParames, int cycleSize) {//重试5次,超过五次直接失败cycleSize++;if(cycleSize > 5){throw new BizException(EnumsUtils.SENDMESSAGE_FAILED);}//存储不合法的useridString invaliduser = "";//1.获取json字符串:将message对象转换为json字符串Gson gson = new Gson();String jsonMessage = gson.toJson(message);      //使用gson.toJson(user)即可将user对象顺序转成jsonlog.info("请求发送消息的jsonTextMessage:" +  jsonMessage);//2.获取请求的urlString sendMessageUrl = SENDMESSAGE_URL + accessToken;//3.调用接口,发送消息JSONObject jsonObject = WeiXinUtil.httpRequest(sendMessageUrl, "POST", jsonMessage);log.info("发送消息的返回jsonObject:" + jsonObject);//4.错误消息处理if (null != jsonObject) {int errcode = jsonObject.getInt("errcode");if (0 == errcode) {//批量发送推送消息时,可能存在部分用户发送消息成功,部分用户userid不合法的情侣if(!"".equals(jsonObject.getString("invaliduser"))){log.warn("发送企业微信成功,部分用户userId不合法,不合法的userId = " + jsonObject.getString("invaliduser"));invaliduser = jsonObject.getString("invaliduser");}else {log.info("发送企业微信消息成功" + message);}}else {//如果是由于token失效,则替换老的token,重新调用if(40014 == errcode || 41001 == errcode || 42001 == errcode){String key = weiXinParames.getCorpId() + "_" + weiXinParames.getAgentSecret();//重新获取token之前,首先删除过期的tokenWeiXinUtil.tokenMap.remove(key);//再重新获取新tokenAccessToken newToken = WeiXinUtil.getAccessToken(weiXinParames.getCorpId(), weiXinParames.getAgentSecret());//重新发送消息sendMessage(newToken.getToken(), message, weiXinParames, cycleSize);//替换过期的token,所以先锁tokenMap不让别人用synchronized (WeiXinUtil.tokenMap){//替换新的tokenWeiXinUtil.tokenMap.put(key, newToken);}}else {log.error("发送企业微信消息失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));throw new BizException(jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));}}}else {log.info("请求发送企业微信消息返回为空,requestUrl =" + sendMessageUrl);throw new BizException(EnumsUtils.SENDMESSAGE_FAILED);}return invaliduser;}
}

推送企业微信的util工具类,这个是入口方法:

package company.sendmessage;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.ArrayList;
import java.util.List;/*** 微信发送消息工具类*/
public class SendWeiXinUtils {//发送企业微信消息的serviceprivate final static SendMessageService SMS = new SendMessageService();//企业微信发送请求接口的连接符private final static String SYMBOL = "|";private static Logger log = LoggerFactory.getLogger(SendWeiXinUtils.class);/*** 发送企业微信消息** @param message*/public static ResultJson sendWeiXinMessage(RequestMessage message, WeiXinParames weiXinParames) {log.info("发送企业微信消息开始,message={},params ={}", message, weiXinParames);ResultJson resultJson = null;TextMessage textMessage = null;try {//1、校验BaseMessage和weiXinParamesCheckParamsUtil.checkBaseMessage(message);CheckParamsUtil.checkWeiXinParames(weiXinParames);//RequestMessage转换BaseMessagetextMessage = convertTextMessage(message);//1.获取access_token:根据企业id和通讯录密钥获取access_token,并拼接请求urlString accessToken = WeiXinUtil.getAccessToken(weiXinParames.getCorpId(), weiXinParames.getAgentSecret()).getToken();//发送消息SMS.sendMessage(accessToken, textMessage, weiXinParames, 1);resultJson = new ResultJson(EnumsUtils.SUCCESS);log.info("发送企业微信消息成功,response = " + resultJson);} catch (BizException e) {log.warn("发送企业微信消息失败,code ={},msg ={}", e.getEnumsUtils().getCode(), e.getEnumsUtils().getMsg());resultJson = new ResultJson(e.getEnumsUtils().getCode(), e.getEnumsUtils().getMsg());}return resultJson;}/*** RequestMessage转换BaseMessage** @param message* @return*/public static TextMessage convertTextMessage(RequestMessage message) {TextMessage textMessage = new TextMessage();//转换成员列表textMessage.setTouser(StringUtils.connectBySymbol(message.getTouser(), SYMBOL));//转换部门列表textMessage.setToparty(StringUtils.connectBySymbol(message.getToparty(), SYMBOL));//转换标签列表textMessage.setTotag(StringUtils.connectBySymbol(message.getTotag(), SYMBOL));textMessage.setMsgtype(message.getMsgtype());textMessage.setAgentid(message.getAgentid());textMessage.setText(message.getText());textMessage.setSafe(message.getSafe());return textMessage;}public static void main(String[] args) {/* //0.设置消息内容String content="unex 定时调度系统后台测试消息,只发给任务创建者!";//1.创建文本消息对象TextMessage message=new TextMessage();//企业微信的userid,唯一且必须message.setTouser("");//1.1非必需//message.setTouser("@all");  //不区分大小写//textMessage.setToparty("1");//txtMsg.setTotag(totag);//txtMsg.setSafe(0);//1.2必需message.setMsgtype("text");message.setAgentid(1000001);Text text=new Text();text.setContent(content);message.setText(text);*/String content = "定时调度系统后台测试消息,只发给任务创建者!";RequestMessage requestMessage = new RequestMessage();List<String> list = new ArrayList<String>();list.add("");list.add("xxx10609");requestMessage.setTouser(list);requestMessage.setMsgtype("text");requestMessage.setAgentid(100003);Text text = new Text();text.setContent(content);requestMessage.setText(text);WeiXinParames weiXinParames = new WeiXinParames();weiXinParames.setCorpId("**********");weiXinParames.setAgentSecret("****************");for (int i = 0; i < 1; i++) {sendWeiXinMessage(requestMessage, weiXinParames);}}
}

自定义字符串工具类:

/*** 字符串工具类* @Author csh10609*/
public class StringUtils {/** 遍历数组,以特定的符号连接* @param list* @param symbol* @return*/public static String connectBySymbol(List<String> list, String symbol){StringBuffer sb = new StringBuffer();String touser = "";if(!CollectionUtils.isEmpty(list)){for (String s: list) {sb.append(s).append(symbol);}//去除最后面的symboltouser =  sb.substring(0,sb.length() - symbol.length());}return touser;}public static void main(String[] args) {List<String> list =  new ArrayList<String>();list.add("aaa");list.add("bbb");list.add("ccc");System.out.println(connectBySymbol(list, "|"));}
}

企业微信参数类:

/*** 微信参数* @author csh10609**/@Data
public class WeiXinParames {//企业IDprivate String corpId;//应用密钥private String agentSecret;//企业应用的id,整型。可在应用的设置页面查看//private  int agentId;}

微信工具类:就是提供http请求等一些公共方法:

package company.sendmessage;import io.swagger.models.HttpMethod;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import java.io.*;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;public class WeiXinUtil {private static Logger log = LoggerFactory.getLogger(WeiXinUtil.class);//微信的请求url//获取access_token的接口地址(GET) 限200(次/天)public final static String access_token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpId}&corpsecret={corpsecret}";//存储accessToken的Map,key=corpId_agentSecret,value=accessTokenpublic static volatile Map<String, AccessToken> tokenMap = new ConcurrentHashMap<String, AccessToken>();/*** 1.发起https请求并获取结果** @param requestUrl 请求地址* @param requestMethod 请求方式(GET、POST)* @param outputStr 提交的数据* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)*/public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {JSONObject jsonObject = null;StringBuffer buffer = new StringBuffer();InputStream inputStream = null;InputStreamReader inputStreamReader = null;BufferedReader bufferedReader = null;try {// 创建SSLContext对象,并使用我们指定的信任管理器初始化TrustManager[] tm = { new MyX509TrustManager() };SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");sslContext.init(null, tm, new java.security.SecureRandom());// 从上述SSLContext对象中得到SSLSocketFactory对象SSLSocketFactory ssf = sslContext.getSocketFactory();URL url = new URL(requestUrl);HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();httpUrlConn.setSSLSocketFactory(ssf);httpUrlConn.setDoOutput(true);httpUrlConn.setDoInput(true);httpUrlConn.setUseCaches(false);// 设置请求方式(GET/POST)httpUrlConn.setRequestMethod(requestMethod);if (HttpMethod.GET.toString().equalsIgnoreCase(requestMethod))httpUrlConn.connect();// 当有数据需要提交时if (null != outputStr) {OutputStream outputStream = httpUrlConn.getOutputStream();// 注意编码格式,防止中文乱码outputStream.write(outputStr.getBytes("UTF-8"));outputStream.close();}// 将返回的输入流转换成字符串inputStream = httpUrlConn.getInputStream();inputStreamReader = new InputStreamReader(inputStream, "UTF-8");bufferedReader = new BufferedReader(inputStreamReader);String str = null;while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}httpUrlConn.disconnect();jsonObject = JSONObject.fromObject(buffer.toString());} catch (ConnectException ce) {log.error("Weixin server connection timed out.");throw new BizException(EnumsUtils.WEIXIN_CONNECT_FAILED);} catch (Exception e) {log.error("https request error:{}", e);throw new BizException(EnumsUtils.WEIXIN_HAPPEN_EXCEPTION);}finally {try {// 释放资源bufferedReader.close();inputStreamReader.close();inputStream.close();inputStream = null;} catch (IOException e) {e.printStackTrace();}}return jsonObject;}/*** 2.发起http请求获取返回结果** @param requestUrl 请求地址* @return*/public static String httpRequest(String requestUrl) {StringBuffer buffer = new StringBuffer();try {URL url = new URL(requestUrl);HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();httpUrlConn.setDoOutput(false);httpUrlConn.setDoInput(true);httpUrlConn.setUseCaches(false);httpUrlConn.setRequestMethod("GET");httpUrlConn.connect();// 将返回的输入流转换成字符串InputStream inputStream = httpUrlConn.getInputStream();//InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");InputStreamReader inputStreamReader = new InputStreamReader(inputStream);BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}bufferedReader.close();inputStreamReader.close();// 释放资源inputStream.close();inputStream = null;httpUrlConn.disconnect();} catch (Exception e) {}return buffer.toString();}/*** 3.获取access_token** @param corpId 凭证* @param appsecret 密钥* @return*/public static AccessToken getAccessToken(String corpId, String appsecret) {AccessToken accessToken = null;//如果tokenMap已经有缓存token,直接返回,不用请求微信接口//注意因为token都是有失效时间的,所有返回的有可能是失败的tokenString key = corpId + "_" + appsecret;if(!StringUtils.isEmpty(tokenMap.get(key))){accessToken = tokenMap.get(key);return accessToken;}//如果是第一次请求token,通过corpId、appsecret请求企业微信的获取token的接口//拼装请求的urlString requestUrl = access_token_url.replace("{corpId}", corpId).replace("{corpsecret}", appsecret);JSONObject jsonObject = httpRequest(requestUrl, "GET", null);// 如果请求成功if (null != jsonObject) {try {accessToken = new AccessToken();accessToken.setToken(jsonObject.getString("access_token"));accessToken.setExpiresIn(jsonObject.getInt("expires_in"));//获取token成功,缓存进tokenMap中tokenMap.put(key, accessToken);} catch (JSONException e) {// 获取token失败log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));//解析失败原因throw new BizException(jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));}}else {log.error("获取token返回为空, requestUrl = " + requestUrl);//请求token失败throw new BizException(EnumsUtils.APPLY_TOKEN_FAILED);}return accessToken;}public static void main(String[] args) {for (int i = 0; i < 3; i++) {String requestUrl = access_token_url.replace("{corpId}", "**************").replace("{corpsecret}", "**********************");JSONObject jsonObject = httpRequest(requestUrl, "GET", null);System.out.println(jsonObject);}}}

java 通过企业微信推送消息相关推荐

  1. Java:企业微信推送消息到个人和部门

    第一步:我们需要组装请求参数,比如下面这种的JSON字符串 这里接收的个人企业微信ID和部门ID是用符号 | 隔开的 {"touser" : "UserID1|UserI ...

  2. sqlserver 调用接口往企业微信推送消息

    其实解决问题的方法有很多,对于定时推送的功能来说,.net和java 都有自己的定时功能,但对于这些不熟悉,只熟悉sqlserver 的人来说,肯定希望从sqlserver下手.于是,我就尝试做了下, ...

  3. 插件实现了钉钉和企业微信推送消息

    项目需要开发一个消息推送插件,今天整理一下做一个记录. 消息推送插件实现了钉钉和企业微信推送消息的功能. 首先介绍的是钉钉的实现方式: 1.需要在钉钉后台创建一个应用,并且需要记录下agentId.a ...

  4. 企业微信推送消息延迟_通过企业微信发送提醒消息 支持markdown

    师太大佬: 最近一直在使用方糖推送,看到LOC大佬的企业微信推送感觉NB,隧稍作修改发上来分享给大家食用~ LOC大佬的GITHUB:https://github.com/kaixin1995/Inf ...

  5. 企业微信推送消息延迟_iPhone手机微信推送消息总是延迟怎么办?

    在有些时候我们的苹果手机屏幕页面总是有微信消失提示,但是我们打开微信页面刷新很久也看不到相应的消息记录,让我们总是没有办法及时回复一些好友消息.如果是一些工作上的关键信息就很麻烦了,毕竟现在微信已经深 ...

  6. 持续集成之企业微信通知:5:在Jenkins中向企业微信推送消息

    在这篇文章中结合具体的示例来介绍在Jenkins中如何向企业微信群推送消息. 环境准备 这里使用Easypack的Jenkins 2.164.3来创建验证用的Jenkins环境.使用如下步骤即可完成. ...

  7. 企业微信推送消息延迟_一种基于企业微信的消息推送方法与流程

    本发明涉及消息推送技术领域,特别涉及一种基于企业微信的消息推送方法. 背景技术: 随着微信公众号的普及,微信企业号也越来越受到人们的关注.而腾讯公司在微信企业号的基础上又进行了进一步的升级,提供了类似 ...

  8. 企业微信推送消息延迟_企业微信发送应用消息,员工无法接收到推送消息。

    请求消息体:[touser=18666211235,toparty=,totag=,agentid=1000040,msgtype=text,content=,media_id=,title=,des ...

  9. 驰骋工作流JFLOW版本企业微信推送消息总结

    简介:jflow的推送消息,简单地记录一下,并不是很详细,这里以企业微信的消息推送消息为例,钉钉与其差不多. 1.推送企业微信节点消息前台页面配置:节点属性>节点消息 Jflow.propert ...

最新文章

  1. CVPR2019论文看点:自学习Anchor原理
  2. JavaSript模块化 AMD CMD 详解.....
  3. 解题报告(一)E、(BZOJ4589)Hard Nim(博弈论 + FWT)
  4. TrackID识别音乐的应用不能用了
  5. 8080端口被占用处理办法
  6. 多重链表 十字链表存储稀疏矩阵,中缀表达式
  7. 页面跳转多种方法(加传参)
  8. 大大大大数怎么求余?C语言
  9. mysql 远程安装linux命令,Linux mysql命令安装允许远程连接的安装设置方法
  10. minifilter 与用户态的通信
  11. 《深入剖析Nginx》一2.5 加桩调试
  12. Thymeleaf 的使用
  13. html内容超出不自动滚动,16.css: overflow使用 例: 固定div大小,不让内容超出div
  14. LINUX下用C判断一个进程是否活着
  15. 2020.3-4 【读书笔记】
  16. R语言入门(1)时间序列分析
  17. 20年的分享页面signature
  18. 7-28 天梯赛的善良 (PTA C语言)最简
  19. 绝对干货3000字,手把手带你用Python实现一个量化炒股策略,小白也能看得懂!...
  20. JQuery关于使用jsp:include标签需要注意的事

热门文章

  1. C++黑客编程:视频播放器的开发
  2. 创业公司想获取采访,找这四家科技媒体就够了
  3. 打印机共享及常见问题解决方法
  4. 传智播客python培训班 青岛
  5. 计算机最炫民族风教案,辽师大版信息技术四下第一单元第6课《最炫民族风》教案1.doc...
  6. 【使用stripTrailingZeros()函数将BigDecimal去0变为科学计数法7E+1】
  7. OpenCV图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma)
  8. 海康威视网络摄像头SDK二次开发(QT版本)
  9. 【xshell】xshell免费个人使用下载安装
  10. 超简易实现电脑微信多开