2018-03-08,模板消息推送,全代码,多多指教
微信推送模板消息:
一.预备工作
公众号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,模板消息推送,全代码,多多指教相关推荐
- php 异步请求微信模板消息_php实现微信模板消息推送
本文实例为大家分享了php微信模板消息推送的具体代码,供大家参考,具体内容如下 1.微信公众号模板消息配置 2.PHP代码/*** 发送模板消息*/ public function send_noti ...
- 【微信小程序】模板消息推送(测试成功)。
note: 这几天想做微信小程序消息推送的功能,然后在网上找了好多教程,都没解决问题,官方文档写的教程由不够详细,所以走了好多弯路. 现在问题解决了,记录一下. 我在网上找的好多教程都不详细,虽然是贴 ...
- springboot实现微信模板消息推送
springboot实现微信模板消息推送 在上一篇文章我们已经知道了怎么获取openid 还不知道的可以查看我的上一篇文章springboot+微信小程序用codeid换取openid 这次我们不光要 ...
- 微信模板消息推送(内附工具类代码)
文章目录 前言 一.添加模板消息 1.进入微信公众号后台 2.模板消息 3.填写信息 4.审核通过后 二.开发步骤 1.依赖坐标 2.实体类 1)AccessToken 2.WxTemplate模板消 ...
- java 微信模板_java开发微信模板消息推送
概述 微信公众平台开始支持前端网页,大家可能看到很多网页上都有分享到朋友圈,关注微信等按钮,点击它们都会弹出一个窗口让你分享和关注,这个是怎么实现的呢?今天就给大家讲解下如何在微信公众平台前端网页上添 ...
- PHP之 微信模板消息推送 的相关代码
温馨提示: 微信模板消息推送,得先去微信端,设置模板配置,会生成相应的消息模板id,这个是一串字符,需连同参数数据,传给微信端,切记!~ 第一部分:主体部分代码,负责业务模块,准备微信端所需参数 /* ...
- 公众号开发--模板消息推送中文乱码问题
本地main方法发送中文正常,启动服务端下订单推送公众号模板消息时中文乱码. 这肯定是编码的问题. 解决办法: 发送消息模板推送的http工具类里获取out流时设置编码格式为utf-8即可. 如下: ...
- JAVA对接微信公众号(服务号、订阅号)实现模板消息推送功能
最近做了个需求要求对接微信公众号,使用模板进行消息推送,今天抽时间总结一下相关的逻辑. 大概逻辑分为四个步骤: 获取微信调用接口凭证access_token. 获取微信模板列表. 使用模板进行消息推送 ...
- java开发微信模板消息推送
完整demo下载 概述 微信公众平台开始支持前端网页,大家可能看到很多网页上都有分享到朋友圈,关注微信等按钮,点击它们都会弹出一个窗口让你分享和关注,这个是怎么实现的呢?今天就给大家讲解下如何在微信公 ...
- Nodejs + express 开发微信公众号模板消息推送功能
第一步:申请测试号 1.打开微信测试号申请平台 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 2.点击"登录&q ...
最新文章
- python 保存模型、加载模型 Joblib
- C# 特性(attribute)
- Linux 中复制文件到多个目录中
- MSVCRTD.lib(crtexe.obj) : error LNK2019
- php背景图片 存放位置,CSS中背景图片位置 background-position 的使用方法
- “约见”面试官系列之常见面试题之第一百零五篇之v-if与v-show(建议收藏)
- 【转载保存】lucene优秀文章整理
- Python+django网页设计入门(8):网站项目文件夹布局
- sh 脚本 访问 路径 权限不够_IC设计之脚本语言介绍
- 断供后,英特尔再宣布暂停在俄罗斯业务,立即生效
- Git 看这一篇就够了!
- BZOJ1061: [Noi2008]志愿者招募(线性规划)
- python3读文件编码格式_使用不同的编码格式读取文件系统标准在Python3中
- 原子范数最小化(Atomic Norm Minimization)
- 2022腾讯云服务器租用费用价格表(轻量和CVM精准报价)
- Nginx 配置中nginx和alias的区别分析
- 杰理-BLE连接后打开经典蓝牙
- 设计商品分类表 mysql_商品分类表设计
- 股票查询小程序_以龙虎榜数据为例
- 网站推广技巧-网站推广常用技巧教程
热门文章
- Luminar 4:AI 人像照片增强器
- 中国的Palantir诞生,开启大数据关联挖掘的新时代
- Win8+CentOS7双系统安装
- Files 使用体验:一款高颜值 Windows 第三方资源管理器
- h3c 抓包么 能通过debug_H3C debugging 使用技巧
- mysql计算年休假天数_年休假天数计算方法是怎样的
- JavaScript:用JS函数隐藏浏览器地址栏 .
- 历史为什么丑化隋朝_历史上被严重丑化的五大名人,明明该流传千古,却变成遗臭万年!...
- Ubuntu系统下 .7z 文件压缩解压命令
- 【立创开源】ESP8266制作的1.44寸TFT显示屏太空人天气时钟(st7735)(增加农历显示)(抄作业)