微信公众平台:

开通 模板消息功能 ;

添加消息模板;

将模板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));

微信公众号推送模板消息工具类相关推荐

  1. 微信公众号推送模板消息

    前言 因为微信接口的改版 无法获得用户的信息 只能通过用户注册拿到openid进行模板消息推送 首先查看文档 模板消息接口文档 如文档所示,我们需要的参数有access_tocken,template ...

  2. 记录使用.netcore 完成微信公众号推送模板消息

    /// <summary>/// 微信公众号发送消息/// </summary>/// <param name="data"></para ...

  3. 公众号推送模板消息(JAVA版)

    公众号推送模板消息(JAVA版) 先贴上官方文档 步骤不多:组装请求体,调用接口 接口:(POST)https://api.weixin.qq.com/cgi-bin/message/template ...

  4. nginx日志报警|微信公众号推送预警消息|PHP+shell脚本实现nginx错误日志报警恶意访问报警,实时通知到微信公众号 | 小型网站nginx日志报警轻量级方案

    1.shell脚本 命名:run.sh #!/bin/bash #!/usr/bin/python # -*- coding:utf-8 -*- #日志文件路径 accesslog=/www/wwwl ...

  5. 微信公众号推送图文消息

    需求 准备工作 代码编写 最终效果 目录 需求 用户在做完某个操作后,发送图文消息到用户微信公众号显示提醒 准备工作 公众号为服务号 获取公众号token 代码编写 public static voi ...

  6. 小程序给绑定的公众号推送模板消息

    //该小程序用户的openid 前提时该用户已关注公众号public AjaxResult sendWXMessage(String openId) {String token = getToken( ...

  7. 公众号推送模板消息,跳转小程序报错INVALID WEAPP PAGEPATH

    invalid weapp pagepath rid: 62d930f0-50070964-005e3fc6 这是微信示例: 在检查自己代码发现路径写错了.pagepath  要写对,前面可以不加斜线

  8. Java微信公众号推送消息

    Java微信公众号推送消息 1.导入pom文件 2.编写yml文件 3.配置文件 4.配置bean 5.service 模板消息主要代码 6.外放接口测试 ==注:== 1.控制台报40164,解决方 ...

  9. 微信公众号推送消息前期准备

    微信公众号推送消息使用手册 1.准备 ​ 微信公众平台注册公众号.(https://mp.weixin.qq.com/) ​ 公众号进行"微信认证" ​ 开通"订阅通知& ...

最新文章

  1. 直播回顾丨拆解 LTV:增长焦虑,企业如何诊断黄金流量?
  2. 【快讯】阿里云张建锋:数据成为经济发展的新生产要素
  3. 基于Zookeeper使用ZkClient实现分布式锁
  4. 第2章[2.2] Ext JS多类型终端-电脑、移动端(手机、平板)
  5. 为什么你必须了解云原生?!
  6. vb access mysql数据库教程_VB操作access数据库
  7. 五子棋初步以及对五子棋的局面估值
  8. 计算机与农学论文,农学毕业论文范文
  9. 信用评分卡模型python_信用评分卡模型在Python中实践(下)
  10. 桌面版whatsapp自动发送实例分析
  11. paypal如何支付欧元_涨姿势!Paypal怎么用?
  12. win7网络无法连接其他计算机,Win7局域网不能访问如何解决?
  13. EXCEL身份证号码校验以及提取基本信息
  14. Tcp三次握手、四次握手、数据传输
  15. 世界性能服务器图片欣赏,AMD发布全球最强服务器显卡-AMD,全球最强,服务器显卡,FirePro,S9000,S7000,虚拟机 ——快科技(驱动之家旗下媒体)--科技改变未来...
  16. ExcelVBA:利用SUMIF和OFFSET+MATCH进行多条件求和
  17. java打开浏览器_Java调用浏览器打开网页完整实例
  18. HTML中插入地图的方法
  19. 学计算机科学导论到底有什么用,计算机科学导论
  20. linux下hadoop集群常用命令

热门文章

  1. 微信公众号php二次开发,微信公众号开发之文本消息自动回复php代码
  2. 1.22(Grocery Problem)
  3. 中式红木家装,古典装饰情景极致邂逅
  4. 用Python实现win10画图程序拖动鼠标画各种形状多边形功能
  5. Docker镜像操作相关
  6. oracle erp 重置密码,ORACLE ERP修改密码的方法
  7. 答复 我不会OOO,仍然可以XXX
  8. 华信Java课第一节
  9. 黑客公布从Medibank窃取的50万用户数据;苹果招募大量神经渲染研究员;Slack 的CEO将卸任 | 每日大事件...
  10. 高性能计算和并行计算的关系