微信公众号推送模板消息工具类
微信公众平台:
开通 模板消息功能 ;
添加消息模板;
将模板id复制作为后台参数;
后台(java):
使用时直接调用WechatModelMessage.sendWechatmsgToUser() 即可,参数说明见sendWechatmsgToUser()方法的注释
测试方法:
public class Test{public static void main(String[] args) {WechatModelMessage.sendWechatmsgToUser("这里是用户的openId","这里写微信公众平台模板的id", "http://www.baidu.com", //跳转链接"#173177",//颜色MessageModel.packJsonmsg("这是第一行说明", "这是学生姓名", "这是类型", "这是日期", "这是最后一行备注"));//调用消息模板方法}
}
1.WechatModelMessage.java 主要类
/*** 发送微信模板消息* @author xujunkai**/
public class WechatModelMessage {// 获取access_token的接口地址(GET) 限200(次/天)public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";/*** @method sendWechatmsgToUser* @描述: TODO(发送模板信息给用户)* @参数@param touser 用户的openid* @参数@param templat_id 信息模板id* @参数@param url 用户点击详情时跳转的url* @参数@param topcolor 模板字体的颜色* @参数@param data 模板详情变量 Json格式* @参数@return* @返回类型:String* @添加时间 2018-9-27 15:38:54 */public static String sendWechatmsgToUser(String touser, String templat_id, String clickurl, String topcolor,JSONObject data) {String tmpurl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";WechatModelMessage wechatModelMessage = new WechatModelMessage();AccessToken accessToken = wechatModelMessage.getAccessToken();String token = accessToken.getToken(); // 微信凭证,access_tokenString url = tmpurl.replace("ACCESS_TOKEN", token);JSONObject json = new JSONObject();try {json.put("touser", touser);json.put("template_id", templat_id);json.put("url", clickurl);json.put("topcolor", topcolor);json.put("data", data);} catch (JSONException e) {e.printStackTrace();}try {int i = 1;while (i <= 3) {// 循环发送3次JSONObject resultJson = WechatModelMessage.httpRequest(url, "POST", json.toString());String errmsg = (String) resultJson.get("errmsg");if ("ok".equals(errmsg)) { // 如果为errmsg为ok,则代表发送成功,公众号推送信息给用户了。i = 4;return "error";}else{System.out.println("***************************微信返回的错误信息:" + errmsg);i++;}}} catch (JSONException e) {e.printStackTrace();}return "success";}/*** @描述: TODO(获取access_token)* * @param appid 凭证* @param appsecret 密钥* @return*/public AccessToken getAccessToken() { AccessToken accessToken = null; WebChatConfigModel weCharById =null;//以下是用jdbc查库,也可以用mybatis 目的取出微信配置表中的appId 和 appsecret String sql="select * from T_SYS_WebChatConfig where fid=1";try {IRowSet rs=DbUtil.executeQuery(sql);if(rs.size()>0){while(rs.next()){weCharById=new WebChatConfigModel();weCharById.setCorpOrAppId(rs.getString("FCORPORAPPID"));weCharById.setCorpOrAppsecret(rs.getString("FCORPORAPPSECRET"));}}} catch (BOSException e1) {e1.printStackTrace();} catch (SQLException e1) {e1.printStackTrace();}//获取appId,appsecretString appId = weCharById.getCorpOrAppId();String appsecret = weCharById.getCorpOrAppsecret();System.out.println("***************************************appId="+appId); System.out.println("***************************************appsecret="+appsecret); String requestUrl = access_token_url.replace("APPID", appId).replace("APPSECRET", appsecret); JSONObject jsonObject = httpRequest(requestUrl, "GET", null); // 如果请求成功 if (null != jsonObject) { try { accessToken = new AccessToken(); accessToken.setToken(jsonObject.getString("access_token")); accessToken.setExpiresIn(jsonObject.getInteger("expires_in")); } catch (JSONException e) { accessToken = null; // 获取token失败 System.out.println("获取token失败 errcode:{"+jsonObject.getInteger("errcode")+"} errmsg:{"+jsonObject.getString("errmsg")+"}" ); } } return accessToken; }/*** * @描述: TODO(发送http请求httpsRequest)* @param requestUrl* @param requestMethod* @param outputStr* @return*/public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {JSONObject jsonObject = null;StringBuffer buffer = new StringBuffer();try {// 创建SSLContext对象,并使用我们指定的信任管理器初始化TrustManager[] tm = { new MyX509TrustManager() };SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");sslContext.init(null, tm, new java.security.SecureRandom());// 从上述SSLContext对象中得到SSLSocketFactory对象SSLSocketFactory ssf = sslContext.getSocketFactory();URL url = new URL(requestUrl);HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();httpUrlConn.setSSLSocketFactory(ssf);httpUrlConn.setDoOutput(true);httpUrlConn.setDoInput(true);httpUrlConn.setUseCaches(false);// 设置请求方式(GET/POST)httpUrlConn.setRequestMethod(requestMethod);if ("GET".equalsIgnoreCase(requestMethod))httpUrlConn.connect();// 当有数据需要提交时if (null != outputStr) {OutputStream outputStream = httpUrlConn.getOutputStream();// 注意编码格式,防止中文乱码outputStream.write(outputStr.getBytes("UTF-8"));outputStream.close();}// 将返回的输入流转换成字符串InputStream inputStream = httpUrlConn.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}bufferedReader.close();inputStreamReader.close();// 释放资源inputStream.close();inputStream = null;httpUrlConn.disconnect();jsonObject = JSONObject.parseObject(buffer.toString());} catch (ConnectException ce) {System.out.println("************************Weixin server connection timed out.");} catch (Exception e) {System.out.println("************************https request error:{" + e + "}");}return jsonObject;}
}
2.MessageModel.java 将微信的消息模板需要的数据转为json,下面的方法对应截图模板
后台json数据的key,必须与模板的形参名称一致(下图红框为形参)
/*** 消息模板类每个消息模板对应一个方法,目的将数据封装成json* @author xujunkai**/
public class MessageModel {/*** @method packJsonmsg* @描述: TODO(封装微信模板:留学生活服务报告提醒)* @参数@param first 头部* @参数@param studentName 留学生名* @参数@param typeName 报告类型* @参数@param date 报告时间* @参数@param remark 说明* @参数@return* @返回类型:JSONObject* @添加时间 2018-9-27 15:38:54 */public static JSONObject packJsonmsg(String first, String studentName, String typeName, String date,String remark) {JSONObject json = new JSONObject();try {JSONObject jsonFirst = new JSONObject();jsonFirst.put("value", first);jsonFirst.put("color", "#173177");json.put("first", jsonFirst);JSONObject jsonStudentName = new JSONObject();jsonStudentName.put("value", studentName);jsonStudentName.put("color", "#173177");json.put("keyword1", jsonStudentName);JSONObject JsonTypeName = new JSONObject();JsonTypeName.put("value", typeName);JsonTypeName.put("color", "#173177");json.put("keyword2", JsonTypeName);JSONObject jsonDate = new JSONObject();jsonDate.put("value", date);jsonDate.put("color", "#173177");json.put("keyword3", jsonDate);JSONObject jsonRemark = new JSONObject();jsonRemark.put("value", remark);jsonRemark.put("color", "#173177");json.put("remark", jsonRemark);} catch (JSONException e) {e.printStackTrace();}return json;}}
3.AccessToken.java Toke对象
public class AccessToken {private String token;private int expiresIn;public String getToken() {return token;}public void setToken(String token) {this.token = token;}public int getExpiresIn() {return expiresIn;}public void setExpiresIn(int expiresIn) {this.expiresIn = expiresIn;}}
4.MyX509TrustManager.java https请求的证书管理器
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;/** * 证书信任管理器(用于https请求) * */
public class MyX509TrustManager implements X509TrustManager { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return null; }
}
5、WebChatConfigModel.java 数据库微信配置模板表对应的对象
/*** 对应于数据库的webchatconfig配置* @author alfred* 该数据配置不依赖于company和baseorg* 由baseorg、company关联该对象* 后期根据数据获取逻辑为先获取公司相关的微信账号,如果为空,这获取其上级组织的微信账号,如果还为空,则获取* baseorg的微信账号,所以该实体的companyid、baseorgid为空*/public class WebChatConfigModel {private String id;//创建时间private Timestamp createTime;//最后修改时间private Timestamp lastupdateTime;//创建者private String creator;//最后修改者private String lastupdator;private String corpOrAppId; //企业Id private String corpOrAppsecret; //管理组的凭证密钥 private String encodingAESKey;//加密的AESKEYprivate WebChatType chatType;//类型//最后一次访问的accessTokenprivate String accessToken; private String token;private String mch_id;private String notice_url;private String apiKey;private String pfxPath;//证书路径private String pfxPassword;//证书密码//Token最后一次创建时间private long tokenCreateTime;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getCorpOrAppId() {return corpOrAppId;}public void setCorpOrAppId(String corpOrAppId) {this.corpOrAppId = corpOrAppId;}public String getCorpOrAppsecret() {return corpOrAppsecret;}public void setCorpOrAppsecret(String corpOrAppsecret) {this.corpOrAppsecret = corpOrAppsecret;}public String getEncodingAESKey() {return encodingAESKey;}public void setEncodingAESKey(String encodingAESKey) {this.encodingAESKey = encodingAESKey;}public WebChatType getChatType() {return chatType;}public void setChatType(WebChatType chatType) {this.chatType = chatType;}public String getAccessToken() {return accessToken;}public void setAccessToken(String accessToken) {this.accessToken = accessToken;}public String getToken() {return token;}public void setToken(String token) {this.token = token;}public long getTokenCreateTime() {return tokenCreateTime;}public void setTokenCreateTime(long tokenCreateTime) {this.tokenCreateTime = tokenCreateTime;}@Overridepublic String toString() {StringBuilder sb=new StringBuilder();sb.append(chatType.toString()).append("-");sb.append(corpOrAppId).append("-");sb.append(corpOrAppsecret).append("-");sb.append(encodingAESKey);return sb.toString();}@Overridepublic int hashCode() {int code=this.toString().hashCode();return code;}@Overridepublic boolean equals(Object obj) {if(obj==null){return false;}if(obj.toString().equals(this.toString())){return true;}return false;}public String getMch_id() {return mch_id;}public void setMch_id(String mch_id) {this.mch_id = mch_id;}public String getNotice_url() {return notice_url;}public void setNotice_url(String notice_url) {this.notice_url = notice_url;}public String getApiKey() {return apiKey;}public void setApiKey(String apiKey) {this.apiKey = apiKey;}public String getPfxPath() {return pfxPath;}public void setPfxPath(String pfxPath) {this.pfxPath = pfxPath;}public String getPfxPassword() {return pfxPassword;}public void setPfxPassword(String pfxPassword) {this.pfxPassword = pfxPassword;}public Timestamp getCreateTime() {return createTime;}public void setCreateTime(Timestamp createTime) {this.createTime = createTime;}public Timestamp getLastupdateTime() {return lastupdateTime;}public void setLastupdateTime(Timestamp lastupdateTime) {this.lastupdateTime = lastupdateTime;}public String getCreator() {return creator;}public void setCreator(String creator) {this.creator = creator;}public String getLastupdator() {return lastupdator;}public void setLastupdator(String lastupdator) {this.lastupdator = lastupdator;}}
6、微信配置表sql
CREATE TABLET_SYS_WEBCHATCONFIG(FID VARCHAR2(44) NOT NULL,FCREATETIME TIMESTAMP(6),FLASTUPDATETIME TIMESTAMP(6),FCREATORID VARCHAR2(44),FLASTUPDATORID VARCHAR2(44),FCORPORAPPID VARCHAR2(80),FCORPORAPPSECRET VARCHAR2(80),FENCODINGAESKEY VARCHAR2(80),FCHATTYPE VARCHAR2(80),FACCESSTOKEN VARCHAR2(255),FTOKEN VARCHAR2(255),FMCHID VARCHAR2(255),FNOTICEURL VARCHAR2(255),FAPIKEY VARCHAR2(255),FPFXPATH VARCHAR2(255),FPFXPASSORD VARCHAR2(255),FTOKENCREATETIME LONG,PRIMARY KEY (FID));
微信公众号推送模板消息工具类相关推荐
- 微信公众号推送模板消息
前言 因为微信接口的改版 无法获得用户的信息 只能通过用户注册拿到openid进行模板消息推送 首先查看文档 模板消息接口文档 如文档所示,我们需要的参数有access_tocken,template ...
- 记录使用.netcore 完成微信公众号推送模板消息
/// <summary>/// 微信公众号发送消息/// </summary>/// <param name="data"></para ...
- 公众号推送模板消息(JAVA版)
公众号推送模板消息(JAVA版) 先贴上官方文档 步骤不多:组装请求体,调用接口 接口:(POST)https://api.weixin.qq.com/cgi-bin/message/template ...
- nginx日志报警|微信公众号推送预警消息|PHP+shell脚本实现nginx错误日志报警恶意访问报警,实时通知到微信公众号 | 小型网站nginx日志报警轻量级方案
1.shell脚本 命名:run.sh #!/bin/bash #!/usr/bin/python # -*- coding:utf-8 -*- #日志文件路径 accesslog=/www/wwwl ...
- 微信公众号推送图文消息
需求 准备工作 代码编写 最终效果 目录 需求 用户在做完某个操作后,发送图文消息到用户微信公众号显示提醒 准备工作 公众号为服务号 获取公众号token 代码编写 public static voi ...
- 小程序给绑定的公众号推送模板消息
//该小程序用户的openid 前提时该用户已关注公众号public AjaxResult sendWXMessage(String openId) {String token = getToken( ...
- 公众号推送模板消息,跳转小程序报错INVALID WEAPP PAGEPATH
invalid weapp pagepath rid: 62d930f0-50070964-005e3fc6 这是微信示例: 在检查自己代码发现路径写错了.pagepath 要写对,前面可以不加斜线
- Java微信公众号推送消息
Java微信公众号推送消息 1.导入pom文件 2.编写yml文件 3.配置文件 4.配置bean 5.service 模板消息主要代码 6.外放接口测试 ==注:== 1.控制台报40164,解决方 ...
- 微信公众号推送消息前期准备
微信公众号推送消息使用手册 1.准备 微信公众平台注册公众号.(https://mp.weixin.qq.com/) 公众号进行"微信认证" 开通"订阅通知& ...
最新文章
- 直播回顾丨拆解 LTV:增长焦虑,企业如何诊断黄金流量?
- 【快讯】阿里云张建锋:数据成为经济发展的新生产要素
- 基于Zookeeper使用ZkClient实现分布式锁
- 第2章[2.2] Ext JS多类型终端-电脑、移动端(手机、平板)
- 为什么你必须了解云原生?!
- vb access mysql数据库教程_VB操作access数据库
- 五子棋初步以及对五子棋的局面估值
- 计算机与农学论文,农学毕业论文范文
- 信用评分卡模型python_信用评分卡模型在Python中实践(下)
- 桌面版whatsapp自动发送实例分析
- paypal如何支付欧元_涨姿势!Paypal怎么用?
- win7网络无法连接其他计算机,Win7局域网不能访问如何解决?
- EXCEL身份证号码校验以及提取基本信息
- Tcp三次握手、四次握手、数据传输
- 世界性能服务器图片欣赏,AMD发布全球最强服务器显卡-AMD,全球最强,服务器显卡,FirePro,S9000,S7000,虚拟机 ——快科技(驱动之家旗下媒体)--科技改变未来...
- ExcelVBA:利用SUMIF和OFFSET+MATCH进行多条件求和
- java打开浏览器_Java调用浏览器打开网页完整实例
- HTML中插入地图的方法
- 学计算机科学导论到底有什么用,计算机科学导论
- linux下hadoop集群常用命令
热门文章
- 微信公众号php二次开发,微信公众号开发之文本消息自动回复php代码
- 1.22(Grocery Problem)
- 中式红木家装,古典装饰情景极致邂逅
- 用Python实现win10画图程序拖动鼠标画各种形状多边形功能
- Docker镜像操作相关
- oracle erp 重置密码,ORACLE ERP修改密码的方法
- 答复 我不会OOO,仍然可以XXX
- 华信Java课第一节
- 黑客公布从Medibank窃取的50万用户数据;苹果招募大量神经渲染研究员;Slack 的CEO将卸任 | 每日大事件...
- 高性能计算和并行计算的关系