企业微信开发第一步获取AccessToken,企业微信的AccessToken和公众号的不一样,企业微信所有接口调用只需要一个AccessToken,而公众号授权和jssdk是分开的

一、获取企业微信AccessToken


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.bootdo.common.cache.RedisService;
import com.bootdo.common.utils.Errors;
import com.bootdo.wx.entity.WxAgent;
import com.bootdo.wx.mapper.WxAgentMapper;
import com.hyd.weixin.utils.HttpSender;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.concurrent.TimeUnit;/*** 处理企业微信AccessToken* @author laowang* @email open@xcloud.com*/
@Slf4j
@Service
public class WeixinAccessTokenService {//企业微信public static final String URL_PATTERN2 = "https://qyapi.weixin.qq.com/cgi-bin/gettoken" +"?corpid={{APPID}}&corpsecret={{SECRET}}";@AutowiredWxAgentMapper wxAgentMapper;@AutowiredRedisService redisService;public String getEnterpriseAccessToken(String account) throws IOException {String accessToken = "";WxAgent wxAgent = selectAgent(account);if (wxAgent == null) {throw Errors.Account_MissingAccount.ex(account);}String url = URL_PATTERN2.replace("{{APPID}}", wxAgent.getCorpid()).replace("{{SECRET}}", wxAgent.getAgentSecret());if(redisService.keyExists("enterprise_"+wxAgent.getAgentId())){accessToken = redisService.get("enterprise_"+wxAgent.getAgentId());}else{HttpSender httpSender = new HttpSender(url);String json = httpSender.sendAndGetResponse();JSONObject jsonObject = JSON.parseObject(json);if (jsonObject.getInteger("errcode")==0) {accessToken = jsonObject.getString("access_token");redisService.set("enterprise_"+wxAgent.getAgentId(),accessToken,7200, TimeUnit.SECONDS);}else{log.error("企业号获取AccessToken错误 原因{}",jsonObject.getString("errmsg"));}}return accessToken;}public WxAgent selectAgent(String account) {return wxAgentMapper.selectWxAgent(account);}
}

注:这里获取AccessToken根据自己业务来,做好AccessToken缓存

二、对所有消息类型的枚举

public interface WxTempConstant {public final String TEMP_TEXT = "text";public final String TEMP_IMAGE = "image";public final String TEMP_VOICE = "voice";public final String TEMP_VIDEO = "video";public final String TEMP_FILE = "file";public final String TEMP_TEXT_CARD = "textcard";public final String TEMP_NEWS = "news";public final String TEMP_MPNEWS = "mpnews";public final String TEMP_MARKDOWN = "markdown";public final String TEMP_MINIPROGEAM_NOTICE = "miniprogram_notice";public final String TEMP_TASK_CARD = "taskcard";}

三、封装消息节点结构接口

import java.util.List;
import java.util.Map;/*** (description)* created at 2017/9/30** @author laowang*/
public interface MapInitializer<K, V> {void init(Map<K, V> m);void initListMap(List<Map<K, V>> m);
}

四、封装消息发送类

package com.bootdo.wx.service.wechat;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.bootdo.common.utils.MapInitializer;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 处理企业微信消息推送操作** @author laowang* @email open@xcloud.com*/
@Slf4j
@Service
public class WeixinMessageService {//企业微信public static final String URL_PATTERN = "https://qyapi.weixin.qq.com/cgi-bin/message/send" +"?access_token={{ACCESS_TOKEN}}";@AutowiredWeixinAccessTokenService weixinAccessTokenService;/*** 推送企业消息给用户** @param agentId     应用ID* @param touser      成员ID列表(消息接收者,多个接收者用‘|’分隔,最多支持1000个)。特殊情况:指定为@all,则向关注该企业应用的全部成员发送* @param toparty     部门ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数* @param totag       标签ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数* @param msgtype     消息类型* @param initializer 消息主体参数参考 https://work.weixin.qq.com/api/doc#90000/90135/90236*/public void send(String msgtype, String touser, String toparty, String totag, MapInitializer<String, String> initializer, String agentId) {log.info("企业应用{}发送{}消息给{}", agentId, msgtype, touser);//准备构造jsonJSONObject firstjsonObject = new JSONObject();JSONObject msgtypejsonObject = new JSONObject();//图文类json构造JSONArray jsonArray = new JSONArray();JSONObject secandjsonObject = new JSONObject();//填充消息参数Map<String, String> map = new HashMap<>();//填充图文类多节点参数List<Map<String, String>> list = new ArrayList<>();//构造通用消息参数jsonfirstjsonObject.put("touser", touser);firstjsonObject.put("toparty", toparty);firstjsonObject.put("totag", totag);firstjsonObject.put("msgtype", msgtype);firstjsonObject.put("agentid", agentId);switch (msgtype) {case "text":initializer.init(map);//构造消息主体jsonfor (String paramName : map.keySet()) {msgtypejsonObject.put(paramName, map.get(paramName));}firstjsonObject.put("text", msgtypejsonObject);firstjsonObject.put("safe", 0);break;case "image":initializer.init(map);//构造消息主体jsonfor (String paramName : map.keySet()) {msgtypejsonObject.put(paramName, map.get(paramName));}firstjsonObject.put("image", msgtypejsonObject);firstjsonObject.put("safe", 0);break;case "voice":initializer.init(map);//构造消息主体jsonfor (String paramName : map.keySet()) {msgtypejsonObject.put(paramName, map.get(paramName));}firstjsonObject.put("voice", msgtypejsonObject);break;case "video":initializer.init(map);//构造消息主体jsonfor (String paramName : map.keySet()) {msgtypejsonObject.put(paramName, map.get(paramName));}firstjsonObject.put("video", msgtypejsonObject);firstjsonObject.put("safe", 0);break;case "file":initializer.init(map);//构造消息主体jsonfor (String paramName : map.keySet()) {msgtypejsonObject.put(paramName, map.get(paramName));}firstjsonObject.put("file", msgtypejsonObject);firstjsonObject.put("safe", 0);break;case "textcard":initializer.init(map);//构造消息主体jsonfor (String paramName : map.keySet()) {msgtypejsonObject.put(paramName, map.get(paramName));}firstjsonObject.put("textcard", msgtypejsonObject);break;case "news":initializer.initListMap(list);//构造消息主体jsonfor (int i = 0; i <= list.size() - 1; i++) {secandjsonObject = new JSONObject();for (String paramName : list.get(i).keySet()) {secandjsonObject.put(paramName, list.get(i).get(paramName));}jsonArray.add(secandjsonObject);}log.info(jsonArray.toJSONString());msgtypejsonObject.put("articles", jsonArray);firstjsonObject.put("news", msgtypejsonObject);break;case "mpnews":initializer.initListMap(list);//构造消息主体jsonfor (int i = 0; i <= list.size() - 1; i++) {secandjsonObject = new JSONObject();for (String paramName : list.get(i).keySet()) {secandjsonObject.put(paramName, list.get(i).get(paramName));}jsonArray.add(secandjsonObject);}log.info(jsonArray.toJSONString());msgtypejsonObject.put("articles", jsonArray);firstjsonObject.put("mpnews", msgtypejsonObject);break;case "markdown":initializer.init(map);//构造消息主体jsonfor (String paramName : map.keySet()) {msgtypejsonObject.put(paramName, map.get(paramName));}firstjsonObject.put("markdown", msgtypejsonObject);break;case "miniprogram_notice":initializer.init(map);initializer.initListMap(list);//构造消息主体jsonfor (String paramName : map.keySet()) {msgtypejsonObject.put(paramName, map.get(paramName));}//构造消息节点jsonfor (int i = 0; i <= list.size() - 1; i++) {secandjsonObject = new JSONObject();for (String paramName : list.get(i).keySet()) {secandjsonObject.put(paramName, list.get(i).get(paramName));}jsonArray.add(secandjsonObject);}log.info(jsonArray.toJSONString());msgtypejsonObject.put("content_item", jsonArray);firstjsonObject.put("miniprogram_notice", msgtypejsonObject);break;case "taskcard":initializer.init(map);initializer.initListMap(list);//构造消息主体jsonfor (String paramName : map.keySet()) {msgtypejsonObject.put(paramName, map.get(paramName));}//构造消息节点jsonfor (int i = 0; i <= list.size() - 1; i++) {secandjsonObject = new JSONObject();for (String paramName : list.get(i).keySet()) {secandjsonObject.put(paramName, list.get(i).get(paramName));}jsonArray.add(secandjsonObject);}log.info(jsonArray.toJSONString());msgtypejsonObject.put("btn", jsonArray);firstjsonObject.put("taskcard", msgtypejsonObject);break;}sendTo(agentId, firstjsonObject.toJSONString());}/*** 推送消息* @param agentId* @param tempdata*/public void sendTo(String agentId, String tempdata) {String accessToken = null;try {accessToken = weixinAccessTokenService.getEnterpriseAccessToken(agentId);} catch (IOException e) {e.printStackTrace();}String url = URL_PATTERN.replace("{{ACCESS_TOKEN}}", accessToken);JSONObject jsonObject = post(url, tempdata);if (!StringUtils.isEmpty(jsonObject.toJSONString()) && jsonObject.getInteger("errcode") == 0) {log.info("消息推送成功");} else {log.info("消息推送失败 原因:{}", jsonObject.toJSONString());}}/*** POST请求的RAW参数传递** @param url* @param body* @return*/public static JSONObject post(String url, String body) {JSONObject jsonObject = null;CloseableHttpClient httpClient = null;HttpPost httpPost = null;try {httpClient = HttpClients.createDefault();RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(20000).setConnectTimeout(20000).build();httpPost = new HttpPost(url);httpPost.setConfig(requestConfig);httpPost.setEntity(new StringEntity(body, "utf-8"));CloseableHttpResponse response = httpClient.execute(httpPost);HttpEntity httpEntity = response.getEntity();jsonObject = JSONObject.parseObject(EntityUtils.toString(httpEntity, "utf-8"));return jsonObject;} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {return jsonObject;}}
}

五、各类型消息推送单元测试(消息主体参数参考 https://work.weixin.qq.com/api/doc#90000/90135/90236)

package com.bootdo;import com.bootdo.common.utils.MapInitializer;
import com.bootdo.common.utils.wechat.WxTempConstant;
import com.bootdo.wx.service.wechat.WeixinMessageService;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class BootdoApplicationTests {@AutowiredWeixinMessageService weixinMessageService;@Testpublic void contextLoads() throws IOException {final String agentId = "1000002";final String touser = "WangLinJun";final String toparty = "";final String totag = "";//文本消息try {weixinMessageService.send(WxTempConstant.TEMP_TEXT, touser, toparty, totag,new MapInitializer<String, String>() {@Overridepublic void init(Map<String, String> m) {m.put("content", "你的快递已到,请携带工卡前往邮件中心领取。\n出发前可查看<a href=\"http://work.weixin.qq.com\">邮件中心视频实况</a>,聪明避开排队。");}@Overridepublic void initListMap(List<Map<String, String>> m) {}}, agentId);} catch (Exception e) {log.error("发送模板消息失败: " + e.getMessage());e.printStackTrace();}//图片消息try {weixinMessageService.send(WxTempConstant.TEMP_IMAGE, touser, toparty, totag,new MapInitializer<String, String>() {@Overridepublic void init(Map<String, String> m) {m.put("media_id", "MEDIA_ID");}@Overridepublic void initListMap(List<Map<String, String>> m) {}}, agentId);} catch (Exception e) {log.error("发送模板消息失败: " + e.getMessage());e.printStackTrace();}//语音消息try {weixinMessageService.send(WxTempConstant.TEMP_VOICE, touser, toparty, totag,new MapInitializer<String, String>() {@Overridepublic void init(Map<String, String> m) {m.put("media_id", "MEDIA_ID");}@Overridepublic void initListMap(List<Map<String, String>> m) {}}, agentId);} catch (Exception e) {log.error("发送模板消息失败: " + e.getMessage());e.printStackTrace();}//视频消息try {weixinMessageService.send(WxTempConstant.TEMP_VIDEO, touser, toparty, totag,new MapInitializer<String, String>() {@Overridepublic void init(Map<String, String> m) {m.put("media_id", "MEDIA_ID");}@Overridepublic void initListMap(List<Map<String, String>> m) {}}, agentId);} catch (Exception e) {log.error("发送模板消息失败: " + e.getMessage());e.printStackTrace();}//文件消息try {weixinMessageService.send(WxTempConstant.TEMP_FILE, touser, toparty, totag,new MapInitializer<String, String>() {@Overridepublic void init(Map<String, String> m) {m.put("media_id", "MEDIA_ID");}@Overridepublic void initListMap(List<Map<String, String>> m) {}}, agentId);} catch (Exception e) {log.error("发送模板消息失败: " + e.getMessage());e.printStackTrace();}//文本卡片消息try {weixinMessageService.send(WxTempConstant.TEMP_TEXT_CARD, touser, toparty, totag,new MapInitializer<String, String>() {@Overridepublic void init(Map<String, String> m) {m.put("title", "领奖通知");m.put("description", "<div class=\"gray\">2016年9月26日</div> <div class=\"normal\">恭喜你抽中iPhone 7一台,领奖码:xxxx</div><div class=\"highlight\">请于2016年10月10日前联系行政同事领取</div>");m.put("url", "URL");m.put("btntxt", "更多");}@Overridepublic void initListMap(List<Map<String, String>> m) {}}, agentId);} catch (Exception e) {log.error("发送模板消息失败: " + e.getMessage());e.printStackTrace();}//图文消息try {weixinMessageService.send(WxTempConstant.TEMP_NEWS, touser, toparty, totag,new MapInitializer<String, String>() {@Overridepublic void init(Map<String, String> m) {}@Overridepublic void initListMap(List<Map<String, String>> m) {Map<String, String> m1 = new HashMap<>();m1.put("title", "中秋节礼品领取1");m1.put("description", "今年中秋节公司有豪礼相送");m1.put("url", "http://www.baidu.com");m1.put("picurl", "http://res.mail.qq.com/node/ww/wwopenmng/images/independent/doc/test_pic_msg1.png");m.add(m1);Map<String, String> m2 = new HashMap<>();m2.put("title", "中秋节礼品领取2");m2.put("description", "今年中秋节公司有豪礼相送");m2.put("url", "http://www.baidu.com");m2.put("picurl", "http://res.mail.qq.com/node/ww/wwopenmng/images/independent/doc/test_pic_msg1.png");m.add(m2);}}, agentId);} catch (Exception e) {log.error("发送模板消息失败: " + e.getMessage());e.printStackTrace();}//图文消息(mpnews)try {weixinMessageService.send(WxTempConstant.TEMP_MPNEWS, touser, toparty, totag,new MapInitializer<String, String>() {@Overridepublic void init(Map<String, String> m) {}@Overridepublic void initListMap(List<Map<String, String>> m) {Map<String, String> m1 = new HashMap<>();m1.put("title", "Title");m1.put("thumb_media_id", "MEDIA_ID");m1.put("author", "Author");m1.put("content_source_url", "URL");m1.put("content", "content");m1.put("digest", "Digest description");m.add(m1);Map<String, String> m2 = new HashMap<>();m2.put("title", "Title");m2.put("thumb_media_id", "MEDIA_ID");m2.put("author", "Author");m2.put("content_source_url", "URL");m2.put("content", "content");m2.put("digest", "Digest description");m.add(m2);}}, agentId);} catch (Exception e) {log.error("发送模板消息失败: " + e.getMessage());e.printStackTrace();}//markdown消息try {weixinMessageService.send(WxTempConstant.TEMP_MARKDOWN, touser, toparty, totag,new MapInitializer<String, String>() {@Overridepublic void init(Map<String, String> m) {m.put("content", "markdown content");}@Overridepublic void initListMap(List<Map<String, String>> m) {}}, agentId);} catch (Exception e) {log.error("发送模板消息失败: " + e.getMessage());e.printStackTrace();}//小程序通知消息try {weixinMessageService.send(WxTempConstant.TEMP_MINIPROGEAM_NOTICE, touser, toparty, totag,new MapInitializer<String, String>() {@Overridepublic void init(Map<String, String> m) {m.put("appid", "appid");m.put("page", "pages/index?userid=zhangsan&orderid=123123123");m.put("title", "会议室预订成功通知");m.put("description", "appid");m.put("emphasis_first_item", "true");}@Overridepublic void initListMap(List<Map<String, String>> m) {Map<String, String> m1 = new HashMap<>();m1.put("key", "会议室");m1.put("value", "402");m.add(m1);Map<String, String> m2 = new HashMap<>();m2.put("key", "会议室1");m2.put("value", "403");m.add(m2);}}, agentId);} catch (Exception e) {log.error("发送模板消息失败: " + e.getMessage());e.printStackTrace();}//任务卡片消息try {weixinMessageService.send(WxTempConstant.TEMP_TASK_CARD, touser, toparty, totag,new MapInitializer<String, String>() {@Overridepublic void init(Map<String, String> m) {m.put("appid", "appid");m.put("page", "pages/index?userid=zhangsan&orderid=123123123");m.put("title", "会议室预订成功通知");m.put("description", "appid");m.put("emphasis_first_item", "true");}@Overridepublic void initListMap(List<Map<String, String>> m) {Map<String, String> m1 = new HashMap<>();m1.put("key", "会议室");m1.put("value", "402");m.add(m1);Map<String, String> m2 = new HashMap<>();m2.put("key", "会议室1");m2.put("value", "403");m.add(m2);}}, agentId);} catch (Exception e) {log.error("发送模板消息失败: " + e.getMessage());e.printStackTrace();}}
}

以上代码请根据自己的业务进行更改

Java企业微信开发-企业微信所有类型消息推送封装相关推荐

  1. 通过企业微信或者微信公众号发送小程序消息推送功能

    前言 为了解决在管理员端可以主动发起某个指令,可以给用户推送小程序消息需求,共找出两个解决方案: 两个方案均已实现点击调转到对应小程序页面,同时可以主动多次进行发送(暂时公众号模板消息有条数限制). ...

  2. java开发钉钉企业内部应用,免登授权+消息推送

    1.申请账号登操作直接看文档去申请就ok了,管理员身份登录,创建微应用 地址:钉钉管理后台 - 钉钉统一身份认证 2.免登授权 CORP_ID :企业id,CORP_SECRET:企业秘钥,agent ...

  3. 微信小程序java后端开发记录(三):模板消息推送

    ·模板消息推送 1.1推送参数dto: 按照文档逐层次封装请求参数. 这些参数 /*** @author hanyy* @Description: 微信小程序模板消息推送参数* @date 2019/ ...

  4. in java中文版百度云 thinking_小程序订阅消息推送(含源码)java实现小程序推送,springboot实现微信消息推送...

    前面写过一篇云开发实现小程序订阅消息(模板消息)推送的文章,<借助云开发实现小程序订阅消息和模板消息的推送功能>是有好多同学用的是Java写后台,所以今天就再来写一篇Java后台实现小程序 ...

  5. 微信开发3之php模板信息推送

    模板信息推送:需要在后台开通了模板消息推送接口 PHP代码如下: <?php $appid="wxxxxxxxxxxxxxxxxxx"; //填写微信后台的appid $ap ...

  6. 微信公众平台的:服务器配置,消息推送配置

    小程序(消息推送配置)与服务号(服务器配置)通用配置方法都是一样的. 以公众号为例子 设置与开发->基础设置->服务器配置 一:在服务器后台添加一个验证类(接口) package com. ...

  7. 云开发实现小程序订阅消息推送功能

    步骤一:获取模板 ID 在微信公众平台手动配置获取模板 ID: 登录 https://mp.weixin.qq.com 获取模板,如果没有合适的模板,可以申请添加新模板,审核通过后可使用. 步骤二:请 ...

  8. 浅析即时通讯开发中移动端实时消息推送技术

    实时消息推送在移动端互联网时代很平常,也很重要,它的存在让智能终端真正成为全时信息传播的工具.本文将从移动端无线网络的特点来谈谈实时消息推送的技术原理及相关问题,希望能给你带来些许启发. 移动端实时消 ...

  9. 微信三方开发平台开发模式下接收事件消息推送

    了解更多内容可观看我的学院视频

最新文章

  1. 关于空指针(指针指向为NULL)和void类型的指针的理解
  2. 腾讯年终奖刷屏了...
  3. 操作分布式文件之六:如何解析远程文件
  4. 计算机专业文档写作课件,计算机专业论文写作的方法.ppt
  5. 七牛大数据平台的演进与大数据分析实践--转
  6. ICCV 2017 EAST:《Learning Policies for Adaptive Tracking with Deep Feature Cascades》论文笔记
  7. SAP ABAP OData gateway框架序列化和反序列化(serialization deserialization)的实现逻辑
  8. 如何应对Spark-Redis行海量数据插入、查询作业时碰到的问题
  9. inno setup读取XML文件
  10. 图形界限命令在命令行输入_CAD骚操作,恭喜你又学会了几个重要的命令
  11. “让我陪你走到人生的尽头。” | 也许AI能提供更好的临终关怀
  12. 如何稳定地使用 Google 搜索
  13. ES6--阮一峰版笔记
  14. c语言令牌桶原理,基于多 goroutine 实现令牌桶
  15. NOIP2016普及组T4(魔法阵)题解
  16. linux局域网ip查询软件,局域网IP查询
  17. 深度学习数据增强方法总结
  18. 模型评估之过拟合与欠拟合
  19. RLC谐振电路简单计算公式
  20. 基于Tcl脚本生成Vivado工程及编译

热门文章

  1. C++程序设计之四书五经
  2. win10 php安装seaslog扩展
  3. 机动目标跟踪——匀速运动CV模型
  4. 按键精灵实现游戏自动加血脚本
  5. 后市如何操作-----把握市场主热点从题材股向蓝筹股转换的时机!!!!!!
  6. 常用的区块链数据查询网站
  7. 让你的手机变身电脑--我所知道的几种方式
  8. 版本号的正则表达式-下划线+短横线+点
  9. Print(打印机) APPsrv DC1
  10. 蓝桥杯——海盗喝酒(循环)