在企业开发中,经常会碰到一些消息要及时推送到企业员工的手中。so 下面来说怎么向企业微信中的员工发消息。
本人只是记录下开发过程,详细参考https://work.weixin.qq.com/api/
1.准备
注册企业微信公司
获取企业ID
新开企业微信应用
获取应用的Agentid,Secret
参考:https://work.weixin.qq.com/api/doc/90000/90135/90665
2.开发
应用支持推送文本、图片、视频、文件、图文等类型。以下以推送文本为例。
1)获取access_token
请求方式:GET(HTTPS)
请求地址:https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET
ID :企业id
SECRET:应用的凭证密钥(Secret)
返回结果如下,我们需要记录access_token
{ "errcode": 0, "errmsg": "ok", "access_token": "3YY3ZRP-nl3s25idin-Qay5bOL5503uzqz45OKFtd7R1E8AE40I3paB8v7wzeWucH8nS9y-95eJzivzEbRKHgBurmAwPZ6AkU4mDuiXSSl5S8v6Keal3_MRF5BxheLRfEThR5LFBFOE9PZluB4Z_JvdRUluNfWKKCqMUL0xwAnJ1bs2OuDVsdLeMiO5hQcl94diHsENz2O1T3_C5WRvp1w", "expires_in": 7200}
注:access_token的有效期大概2小时左右。每天获取access_token的次数也是有限的(大概200次左右)
所以下面可以写个公共类
WechatService.java
@Servicepublic class WechatService{ private static org.apache.log4j.Logger logger = Logger.getLogger(WechatService.class); RestTemplate client = new RestTemplate(); private RestTemplate restTemplate = RestTemplateUtil.getInstance(); private static AccessToken at ; @Value("${appId}") private String appId; @Value("${appSecret}") private String appSecret; //向外暴露获取accessToken public String getAccessToken() { if(at==null||at.isExpired()){ getToken(); } if(at!=null){ return at.getAccessToken(); } return null; } //私有 private void getToken(){ String accessTokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid="+appId+ "&corpsecret="+appSecret; logger.debug("URL for getting accessToken accessTokenUrl="+accessTokenUrl); Map<String, Object> rtnMap = restTemplate.getForObject(accessTokenUrl, Map.class); if(rtnMap!=null){ Integer errcode = (Integer)rtnMap.get("errcode"); logger.debug("GETToken errcode:"+errcode); if(errcode==0){ String accessToken = (String)rtnMap.get("access_token"); logger.debug("accessToken:"+accessToken); Integer expiresIn = (Integer)rtnMap.get("expires_in"); //创建token对象,并保存 at = new AccessToken(accessToken, expiresIn); } } }}
RestTemplateUtil.java
public class RestTemplateUtil { public static RestTemplate getInstance() { RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters().add(new WxConverter()); return restTemplate; }}
WxConverter.java
public class WxConverter extends MappingJackson2HttpMessageConverter { public WxConverter(){ List<MediaType> mediaTypes = new ArrayList<>(); mediaTypes.add(MediaType.TEXT_PLAIN); mediaTypes.add(MediaType.TEXT_HTML); setSupportedMediaTypes(mediaTypes); }}
AccessToken.java
public class AccessToken { private String accessToken;//token private Long expiresTime;//过期时间 时间戳 public String getAccessToken() { return accessToken; } public void setAccessToken(String accessToken) { this.accessToken = accessToken; } public Long getExpiresTime() { return expiresTime; } public void setExpiresTime(Long expiresTime) { this.expiresTime = expiresTime; } public AccessToken(String accessToken,Integer expiresIn){ super(); this.accessToken = accessToken; this.expiresTime = System.currentTimeMillis()+expiresIn*1000; } /** * 判断当前token是否过期 * @return */ public Boolean isExpired(){ return System.currentTimeMillis()>expiresTime; }}
以上的代码本人认为是比较麻烦的,so 全部记录下来了
2)发送消息正文
请求方式:POST(HTTPS)
请求地址:https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN
ACCESS_TOKEN是上面GET请求得到的
请求示例
{ "touser" : "UserID1|UserID2|UserID3", "toparty" : "PartyID1|PartyID2", "totag" : "TagID1 | TagID2", "msgtype" : "text", "agentid" : 1, "text" : { "content" : "第一次发送成功啦!" }, "safe":0, "enable_id_trans": 0, "enable_duplicate_check": 0}
touser:发送的人,可多个
msgtype:类型
content:主题内容
......
其他不是必填字段,可以自己去看官方文档吧。
返回示例
{ "errcode" : 0, "errmsg" : "ok", "invaliduser" : "userid1|userid2", "invalidparty" : "partyid1|partyid2", "invalidtag": "tagid1|tagid2" }
errcode:0 代表发送成功了
有些地方不是很详细,作为自己以后工作参考用。。。
还是建议大家多去官网看看API
文采不好,请多包涵