微信推送模板消息:

一.预备工作

公众号appid,密钥APPSECRET

请求地址:

//获取access_token的url

url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+APPID+"&secret="+APPSECRET;

//发送模板消息的url

String applyUrl="https://api.weixin.qq.com/cgi-bin/message/template/send";

消息模板实体类

package com.qcmc.entity;import java.io.Serializable;/** * 微信API返回状态 *  * @author wori * @date 2018年3月6日 * */ public class ResultState implements Serializable {/*** */private static final long serialVersionUID = 1692432930341768342L;private int errcode; // 状态  private String errmsg; //信息  public int getErrcode() {  return errcode;  }  public void setErrcode(int errcode) {  this.errcode = errcode;  }  public String getErrmsg() {  return errmsg;  }  public void setErrmsg(String errmsg) {  this.errmsg = errmsg;  }  }
package com.qcmc.entity;/** * 模板消息 返回的结果 * @author wori * @date 2018年3月6日 * */
public class TemplateMsgResult extends ResultState {/*** */private static final long serialVersionUID = 3198012785950215862L;private String msgid; // 消息id(发送模板消息)  public String getMsgid() {  return msgid;  }  public void setMsgid(String msgid) {  this.msgid = msgid;  }  }
public class WechatTemplateMsg {private String touser;//车主openidprivate String template_id; //模板IDprivate String url; //模板跳转链接  private TreeMap<String, TreeMap<String, String>> data; //data数据  public TreeMap<String, TreeMap<String, String>> getData() {return data;}public void setData(TreeMap<String, TreeMap<String, String>> data) {this.data = data;}public String getTouser() {return touser;}public void setTouser(String touser) {this.touser = touser;}public String getTemplate_id() {return template_id;}public void setTemplate_id(String template_id) {this.template_id = template_id;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}/** * 参数 * @param value * @param color 可不填 * @return */ public static TreeMap<String, String> item(String value, String color) {  TreeMap<String, String> params = new TreeMap<String, String>();  params.put("value", value);  params.put("color", color);  return params;  }
}
/*** * @author wori*    发送请求的工具类*/
public class WXSendHttpsUtil {//发送https请求public static String getAccessToken(String requestUrl,String requesMethod){StringBuffer buffer=null;//请求地址try{//创建SSLContextSSLContext sslContext=SSLContext.getInstance("SSL");TrustManager[] tm={new MyX509TrustManager()};//初始化sslContext.init(null, tm, new java.security.SecureRandom());;//获取SSLSocketFactory对象SSLSocketFactory ssf=sslContext.getSocketFactory();URL url=new URL(requestUrl);HttpsURLConnection conn=(HttpsURLConnection)url.openConnection();conn.setDoOutput(true);conn.setDoInput(true);conn.setUseCaches(false);//请求方法conn.setRequestMethod(requesMethod);//设置当前实例使用的SSLSoctetFactoryconn.setSSLSocketFactory(ssf);conn.connect();//往服务器端写内容//发起请求需要带的参数
//      if(null!=outputStr){
//          OutputStream os=conn.getOutputStream();
//          os.write(outputStr.getBytes("utf-8"));
//          os.close();
//      }//读取服务器端返回的内容InputStream is=conn.getInputStream();InputStreamReader isr=new InputStreamReader(is,"utf-8");BufferedReader br=new BufferedReader(isr);buffer=new StringBuffer();String line=null;while((line=br.readLine())!=null){buffer.append(line);}}catch(Exception e){e.printStackTrace();}return buffer.toString();}/*** 向指定 URL 发送POST方法的请求* * @param url*            发送请求的 URL* @param param*            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。* @return 所代表远程资源的响应结果*/public static String sendPost(String url, String param) {PrintWriter out = null;BufferedReader in = null;String result = "";try {URL realUrl = new URL(url);// 打开和URL之间的连接URLConnection conn = realUrl.openConnection();// 设置通用的请求属性conn.setRequestProperty("accept", "*/*");conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");// 发送POST请求必须设置如下两行conn.setDoOutput(true);conn.setDoInput(true);// 获取URLConnection对象对应的输出流out = new PrintWriter(conn.getOutputStream());// 发送请求参数out.print(param);// flush输出流的缓冲out.flush();// 定义BufferedReader输入流来读取URL的响应in = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("发送 POST 请求出现异常!"+e);e.printStackTrace();}//使用finally块来关闭输出流、输入流finally{try{if(out!=null){out.close();}if(in!=null){in.close();}}catch(IOException ex){ex.printStackTrace();}}return result;}    /*** post请求* @param url* @param json* @return*/public static JSONObject doPost(String url,JSONObject json){CloseableHttpClient httpclient = HttpClientBuilder.create().build();HttpPost post = new HttpPost(url);//请求头添加编码格式post.addHeader("Content-Type", "application/json;charset=utf-8"); JSONObject response = null;try {StringEntity s = new StringEntity(json.toString(),"utf-8");System.out.println("js=================="+json.toString());s.setContentEncoding("UTF-8");s.setContentType("application/json");//发送json数据需要设置contentTypepost.setEntity(s);HttpResponse res = httpclient.execute(post);if(res.getStatusLine().getStatusCode() == HttpStatus.SC_OK){String result = EntityUtils.toString(res.getEntity());// 返回json格式:response = JSONObject.fromObject(result);}} catch (Exception e) {throw new RuntimeException(e);}return response;}
}
因为项目为了方便调用,所以只写了service层,没到controller,以下是实现类,接口就不贴了
public class IMessageServiceImpl implements IMessageService{@Resource(name = "daoSupport")private DAO dao;@Resource(name = "IUserService")private com.qcmc.userservices.IUserService IUserService;static String APPID=Constants.appId;static String APPSECRET=Constants.secret;//获取access_token的urlstatic String url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+APPID+"&secret="+APPSECRET;//发送模板消息的urlString applyUrl="https://api.weixin.qq.com/cgi-bin/message/template/send";@Overridepublic DataModel pushMessage(DataModel pd) throws Exception {String accessToken="";//用openid查询车主车牌号String OPPEN_ID=pd.get("OPPEN_ID").toString();pd.put("openid",OPPEN_ID);System.out.println("=========查询车主信息");DataModel dm= IUserService.getUserInfo(pd);//整理模板消息参数TemplateMsgResult templateMsgResult = null;  TreeMap<String,TreeMap<String,String>> params = new TreeMap<String,TreeMap<String,String>>();  params.put("first",WechatTemplateMsg.item("您好,您收到一条挪车提醒", "#ff0000"));  params.put("keyword1",WechatTemplateMsg.item("系统", "#000000"));  params.put("keyword2",WechatTemplateMsg.item("您的爱车挡住路啦,麻烦您尽快前往挪车", "#996633"));  params.put("remark",WechatTemplateMsg.item("如有疑问,请联系客服", "#000000"));  WechatTemplateMsg wechatTemplateMsg = new WechatTemplateMsg();  wechatTemplateMsg.setTemplate_id("fzFRfTjBahKqVcPi9Zb8p2s1J05BS9__U8O-4nWIEJ0");    wechatTemplateMsg.setTouser(OPPEN_ID);  wechatTemplateMsg.setUrl(pd.getString("URL"));  wechatTemplateMsg.setData(params);  JSONObject json = JSONObject.fromObject(wechatTemplateMsg);System.out.println("====json数据"+json.toString());//请求获取access_tokenSystem.out.println("获取access_token");String result=WXSendHttpsUtil.getAccessToken(url,"GET");System.out.println(result);//解析返回的json获取access_tokenJSONObject sf = JSONObject.fromObject(result);accessToken=(String) sf.get("access_token");System.out.println("acc==================="+accessToken);String wxapplyUrl=applyUrl+"?access_token="+accessToken;System.out.println("applyurl++++++++++++++++"+wxapplyUrl);//推送消息System.out.println("=============推送消息");templateMsgResult = sendTemplate(wxapplyUrl, json);System.out.println("code=================="+templateMsgResult.getErrcode());System.out.println("msgid=================="+templateMsgResult.getMsgid());dm.put("templateMsgResult", templateMsgResult);  //保存推送日志记录System.out.println("=============保存推送记录");long time=DateUtils.DateToLong();pd.put("time", time);Integer row= (Integer) dao.save("UserMapper.savePushMessage", pd);dm.put("row", row);return dm;}/** * 发送模板消息 * @param accessToken * @param json * @return 状态 */  @Override  public TemplateMsgResult sendTemplate(String applyUrl, JSONObject json) {  TemplateMsgResult templateMsgResult = null;  //发起post请求,发送json数据,返回json对象JSONObject result = WXSendHttpsUtil.doPost(applyUrl, json); //将返回的json对象转为json字符串String restr=result.toString();//解析返回结果templateMsgResult = JsonUtils.jsonToPojo(restr, TemplateMsgResult.class);  return templateMsgResult;  }
}

注意:在post请求发送json数据时,因为使用的是httpcilent,在newStringEntity对象时,务必指明编码格式,防止乱码-------深受其害的我
StringEntity s = new StringEntity(json.toString(),"utf-8");

//2018.03.08
                                                                                                //第一次微信公众号接口开发
                                                                                                //模板消息推送

2018-03-08,模板消息推送,全代码,多多指教相关推荐

  1. php 异步请求微信模板消息_php实现微信模板消息推送

    本文实例为大家分享了php微信模板消息推送的具体代码,供大家参考,具体内容如下 1.微信公众号模板消息配置 2.PHP代码/*** 发送模板消息*/ public function send_noti ...

  2. 【微信小程序】模板消息推送(测试成功)。

    note: 这几天想做微信小程序消息推送的功能,然后在网上找了好多教程,都没解决问题,官方文档写的教程由不够详细,所以走了好多弯路. 现在问题解决了,记录一下. 我在网上找的好多教程都不详细,虽然是贴 ...

  3. springboot实现微信模板消息推送

    springboot实现微信模板消息推送 在上一篇文章我们已经知道了怎么获取openid 还不知道的可以查看我的上一篇文章springboot+微信小程序用codeid换取openid 这次我们不光要 ...

  4. 微信模板消息推送(内附工具类代码)

    文章目录 前言 一.添加模板消息 1.进入微信公众号后台 2.模板消息 3.填写信息 4.审核通过后 二.开发步骤 1.依赖坐标 2.实体类 1)AccessToken 2.WxTemplate模板消 ...

  5. java 微信模板_java开发微信模板消息推送

    概述 微信公众平台开始支持前端网页,大家可能看到很多网页上都有分享到朋友圈,关注微信等按钮,点击它们都会弹出一个窗口让你分享和关注,这个是怎么实现的呢?今天就给大家讲解下如何在微信公众平台前端网页上添 ...

  6. PHP之 微信模板消息推送 的相关代码

    温馨提示: 微信模板消息推送,得先去微信端,设置模板配置,会生成相应的消息模板id,这个是一串字符,需连同参数数据,传给微信端,切记!~ 第一部分:主体部分代码,负责业务模块,准备微信端所需参数 /* ...

  7. 公众号开发--模板消息推送中文乱码问题

    本地main方法发送中文正常,启动服务端下订单推送公众号模板消息时中文乱码. 这肯定是编码的问题. 解决办法: 发送消息模板推送的http工具类里获取out流时设置编码格式为utf-8即可. 如下: ...

  8. JAVA对接微信公众号(服务号、订阅号)实现模板消息推送功能

    最近做了个需求要求对接微信公众号,使用模板进行消息推送,今天抽时间总结一下相关的逻辑. 大概逻辑分为四个步骤: 获取微信调用接口凭证access_token. 获取微信模板列表. 使用模板进行消息推送 ...

  9. java开发微信模板消息推送

    完整demo下载 概述 微信公众平台开始支持前端网页,大家可能看到很多网页上都有分享到朋友圈,关注微信等按钮,点击它们都会弹出一个窗口让你分享和关注,这个是怎么实现的呢?今天就给大家讲解下如何在微信公 ...

  10. Nodejs + express 开发微信公众号模板消息推送功能

    第一步:申请测试号 1.打开微信测试号申请平台 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 2.点击"登录&q ...

最新文章

  1. python 保存模型、加载模型 Joblib
  2. C# 特性(attribute)
  3. Linux 中复制文件到多个目录中
  4. MSVCRTD.lib(crtexe.obj) : error LNK2019
  5. php背景图片 存放位置,CSS中背景图片位置 background-position 的使用方法
  6. “约见”面试官系列之常见面试题之第一百零五篇之v-if与v-show(建议收藏)
  7. 【转载保存】lucene优秀文章整理
  8. Python+django网页设计入门(8):网站项目文件夹布局
  9. sh 脚本 访问 路径 权限不够_IC设计之脚本语言介绍
  10. 断供后,英特尔再宣布暂停在俄罗斯业务,立即生效
  11. Git 看这一篇就够了!
  12. BZOJ1061: [Noi2008]志愿者招募(线性规划)
  13. python3读文件编码格式_使用不同的编码格式读取文件系统标准在Python3中
  14. 原子范数最小化(Atomic Norm Minimization)
  15. 2022腾讯云服务器租用费用价格表(轻量和CVM精准报价)
  16. Nginx 配置中nginx和alias的区别分析
  17. 杰理-BLE连接后打开经典蓝牙
  18. 设计商品分类表 mysql_商品分类表设计
  19. 股票查询小程序_以龙虎榜数据为例
  20. 网站推广技巧-网站推广常用技巧教程

热门文章

  1. Luminar 4:AI 人像照片增强器
  2. 中国的Palantir诞生,开启大数据关联挖掘的新时代
  3. Win8+CentOS7双系统安装
  4. Files 使用体验:一款高颜值 Windows 第三方资源管理器
  5. h3c 抓包么 能通过debug_H3C debugging 使用技巧
  6. mysql计算年休假天数_年休假天数计算方法是怎样的
  7. JavaScript:用JS函数隐藏浏览器地址栏 .
  8. 历史为什么丑化隋朝_历史上被严重丑化的五大名人,明明该流传千古,却变成遗臭万年!...
  9. Ubuntu系统下 .7z 文件压缩解压命令
  10. 【立创开源】ESP8266制作的1.44寸TFT显示屏太空人天气时钟(st7735)(增加农历显示)(抄作业)