前言:发送微信模板消息首先需要用户去绑定openId和serverOpenId才能推送模板消息.
1.微信配置项
1.微信小程序根据前端返回的code去获取unionId和openid 通过type=0的接口去请求
2.用户获取到unionId和openId之后插入表中 就是用户登录微信小程序时 请求的是type=0的接口
3.得到用户的open和unionId之后 去请求type=1的接口 获取到serverOpenId(重点),通过unionId找到用户并且插入serverOpenId进去
4.做完准备工作之后,我们就需要完成下面真正的功能了 发送微信模板公众号 ,请求三方接口的工具类
package cn.abtu.config; import cn.abtu.parent.mapper.TaskMapper; import com.alibaba.fastjson.JSONObject; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.params.HttpMethodParams; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @Component public class WechatApi { @Value("${wechat.server.appid}") private String appid; @Value("${wechat.server.secret}") private String secret; @Value("${wechat.template_id0}") private String template_id0; @Value("${wechat.template_id1}") private String template_id1; @Value("${wechat.template_id2}") private String template_id2; @Value("${wechat.template_id3}") private String template_id3; @Autowired public RedisTemplate redisTemplate; /* @Autowired private ITaskService taskService; @Autowired private AsyncTaskManager asyncTaskManager;*/ @Autowired private TaskMapper taskMapper; public static void main(String[] args) { System.out.println("===="); WechatApi wa = new WechatApi(); wa.appid = "wx43a4c47b16c76ff2"; wa.secret = "5ebdcd41ebb802eeb2057c6d5a221243"; wa.get_access_token(); } public static String sendRequest(String urlParam,String requestType) { HttpURLConnection con = null; BufferedReader buffer = null; StringBuffer resultBuffer = null; try { URL url = new URL(urlParam); //得到连接对象 con = (HttpURLConnection) url.openConnection(); //设置请求类型 con.setRequestMethod(requestType); //设置请求需要返回的数据类型和字符集类型 con.setRequestProperty("Content-Type", "application/json;charset=GBK"); //允许写出 con.setDoOutput(true); //允许读入 con.setDoInput(true); //不使用缓存 con.setUseCaches(false); //得到响应码 int responseCode = con.getResponseCode(); if(responseCode == HttpURLConnection.HTTP_OK){ //得到响应流 InputStream inputStream = con.getInputStream(); //将响应流转换成字符串 resultBuffer = new StringBuffer(); String line; buffer = new BufferedReader(new InputStreamReader(inputStream, "GBK")); while ((line = buffer.readLine()) != null) { resultBuffer.append(line); } return resultBuffer.toString(); } }catch(Exception e) { e.printStackTrace(); } return ""; } public String get_access_token() { try { // 如果redis有,直接走redis Object access_token = redisTemplate.opsForValue().get("access_token"); System.err.println(access_token); if(access_token != null){ return access_token.toString(); } Integer t=7000; // 没有验证数据库 JSONObject wx_access_token = taskMapper.getWxAccessToken(); if (wx_access_token == null){ if(taskMapper.checkWxAccessToken() == 0){ taskMapper.insertAccessToken(""); } String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+secret; String req = sendRequest(url,"GET"); JSONObject object = JSONObject.parseObject(req); System.out.println(object); if(object.get("access_token") == null){ return null; } access_token = object.getString("access_token"); taskMapper.setWxAccessToken((String)access_token); redisTemplate.opsForValue().set("access_token", access_token, 6900, TimeUnit.SECONDS); return (String) access_token; }else{ access_token = wx_access_token.get("config_value"); // 获取剩余过期时间戳 t = wx_access_token.getInteger("t"); if(t > 60){ redisTemplate.opsForValue().set("access_token", access_token, t, TimeUnit.SECONDS); } return (String) access_token; } } catch (Exception e) { e.printStackTrace(); System.err.println(e.getMessage()); return null; } } /** * 示例json格式如下 { "first": { "value": "test", "color": "#173177" }, "keyword1": { "value": "aaa", "color": "#173177" } "remark":{ "value":"TEST", "color":"#173177" } } { "touser":"o3Yg26IyKm_7CwsxU7Y1SmWzhZe8", "template_id":"o2Fi5wI-H5s2ca3e5Iw0cBK_bM22egafOnrrvjWSAjk", "url":"http://weixin.qq.com/download", "topcolor":"#FF0000", "data":{ "first": { "value": "test", "color": "#173177" }, "keyword1": { "value": "aaa", "color": "#173177" } "remark":{ "value":"TEST", "color":"#173177" } } } */ /** * 直接发送消息的方法 * @param openid 用的openid * @param data 模板消息的data * 示例格式如下,根据模板需求传具体的值,一般会有多个keyword, 如keyword1, keyword2 * { * "first": { * "value": "test", * "color": "#173177" * }, * "keyword1": { * "value": "aaa", * "color": "#173177" * } * "remark":{ * "value":"TEST", * "color":"#173177" * } * } * @param url 模板消息跳转的地址,可以为空或null * @param topcolor 颜色 可以为空或null * @return */ public String send_temp_msg(String openid, JSONObject data, String url, String topcolor, Integer type){ String[] msgtype = {template_id0, template_id1,template_id2,template_id3}; JSONObject jsonobj =new JSONObject(); jsonobj.put("touser", openid); jsonobj.put("template_id", msgtype[type]); jsonobj.put("url", url != null ? url :""); jsonobj.put("topcolor", topcolor != null ? topcolor :"#173177"); jsonobj.put("data", data); try { String access_token = get_access_token(); //System.err.println("access_token"+ access_token); if (access_token == null) { return "access_token获取失败"; } String baseurl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + access_token; //System.err.println(baseurl); HttpClient httpClient = new HttpClient(); httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(15000); PostMethod postMethod = new PostMethod(baseurl); postMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 60000); //System.out.println(jsonobj); System.err.println(jsonobj.toString()); postMethod.setRequestBody(jsonobj.toString()); postMethod.addRequestHeader("Content-Type", "application/json;charset=utf-8"); httpClient.executeMethod(postMethod); String result = postMethod.getResponseBodyAsString(); postMethod.releaseConnection(); System.out.println(result); return result; }catch (Exception e){ System.err.println("send_temp_msg error:"+e.getMessage()); return e.getMessage(); } } /* public String SendMsg(List<WxTemplateContent> list){ if(list.size() ==0){ return ""; } String taskId = UUID.randomUUID().toString(); Task task = new Task(); task.setTaskId(taskId); task.setStatus(0); task.setMsg("开始执行任务"); String tousers= list.stream().map(WxTemplateContent::getTouser).collect(Collectors.toList()).toString(); JSONObject send_data = new JSONObject(); send_data.put("to_users", tousers); send_data.put("count", list.size()); task.setInfo(send_data.toString()); task.setProgress(0); if(taskService.insertTask(task) == 1){ Task task1 = asyncTaskManager.submit(() -> { Task asynctask = taskService.get_task(taskId); asynctask.setStatus(1); System.out.println("_____start_____"); List<JSONObject> info = new ArrayList<>(); for (int i = 0; i < list.size(); i++) { JSONObject result = new JSONObject(); String res = send_temp_msg(list.get(i).getTouser(), new JSONObject(list.get(i).getData()),list.get(i).getUrl(),list.get(i).getTopcolor(), 0); asynctask.setTaskId(taskId); asynctask.setMsg("正在执行第!"+(i+1)+"个"); asynctask.setProgress(((i+1)/list.size()* 100)); taskService.updateTask(asynctask); result.put("openid", list.get(i).getTouser()); result.put("res", res); info.add(result); } asynctask.setMsg("任务执行完成"); asynctask.setStatus(3); asynctask.setRes(info.toString()); taskService.updateTask(asynctask); System.out.println("_____end_____"); }, taskId); } return taskId; }*/ }
5.根据业务场景去发送模板消息这里就举例子一个万能模板 wechatApi.send_temp_msg
if (wechatApi.get_access_token() != null) { JSONObject res = new JSONObject(); res.put("openid", teacher != null ? teacher.getServerOpenId() : ""); res.put("book_name", kidBook != null ? bookName : ""); res.put("kid_name", logininfo != null ? logininfo.getName() : ""); if (res != null) { System.err.println(res); String openid = res.getString("openid"); String book_name = res.getString("book_name"); String kid_name = res.getString("kid_name"); if (openid != null ) { //调用任务管理器中的submit去提交一个异步任务 String taskId = UUID.randomUUID().toString(); Task task = new Task(); task.setTaskId(taskId); task.setStatus(0); task.setMsg("开始发送微信模板消息"); task.setInfo(""); task.setProgress(0); if (taskService.insertTask(task) == 1) { Task task1 = asyncTaskManager.submit(() -> { System.out.println("_____start_____"); Task asynctask = taskService.get_task(taskId); JSONObject data = new JSONObject(); data.put("first", new WxMsg("请审核学生的预约借书", null)); data.put("keyword1", new WxMsg(kid_name, null)); data.put("keyword2", new WxMsg(cn.abtu.config.DateUtil.getTime(), null)); data.put("keyword3", new WxMsg("发起了"+book_name+"预约借书", null)); //data.put("time", new WxMsg("尽快", null)); // data.put("location", new WxMsg("借阅地点", null)); data.put("remark", new WxMsg(kid_name + "发起了图书:" + book_name + "的预约审核", null)); asynctask.setMsg("已执行发送"); asynctask.setStatus(3); asynctask.setRes(wechatApi.send_temp_msg(openid, data, "", "", 3)); taskService.updateTask(asynctask); System.out.println("_____end_____"); }, taskId); if (task1 == null) { throw new BusinessExeption("201", "微信模板消息发送失败!"); } } } }
6.模板配置
# 模板消息 0催还通知 1活动未完成提醒 wechat.template_id0: wechat.template_id1: 90O9OofmDvCXRt- #万能模板 wechat.template_id2: -3Ww #借还书模板三 wechat.template_id3:
7.万能模板的模板 根据 模板的详情内容编写代码就可以了
编辑不易,一键三连