• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

java实现微信公众平台发送模板消息的示例代码

java 搞代码 4年前 (2022-01-09) 36次浏览 已收录 0个评论

最近开发公众号项目,前端采用vue开发,后台使用java开发,由于业务需求,需要实现公众号向用户发送重要的服务通知,提醒工作人员进行业务审核。这时候就需要用到微信平台的模板消息,为了保证用户不受到骚扰,在开发者出现需要主动提醒、通知用户时,才允许开发者在公众平台网站中模板消息库中选择模板,选择后获得模板ID,再根据模板ID向用户主动推送提醒、通知消息。常用的服务场景,如信用卡刷卡通知,商品下单成功、购买成功通知等。

获取template_id(注意:仅微信开放平台同事可获取)

通过向微信公众平台申请模板,来获取模板id,模板消息调用时主要需要模板ID和模板中各参数的赋值内容。请注意:
1.模板中参数内容必须以”.DATA”结尾,否则视为保留字;
2.模板保留符号”{{ }}”

下图是在微信测试公众号申请模板

请求模板消息接口

1)微信网页授权

 //前端发请请求
 this.axios.get('/wx/get_code_num').then((res) => {
  window.location.href = res.data;
 }).catch((error) => {
  console.log(error)
 });

 /**
  * 1.用户同意授权,获取code
  */
  @RequestMapping(value = "/get_code_num", method = RequestMethod.GET)
  public String getCode() throws UnsupportedEncodingException {
    return "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + Constants.APPID + "&redirect_uri="
        + URLEncoder.encode("http://192.168.0.152:8085/wx/send_wx_msg", "UTF-8") + "&response_type=code&scope="
        + Constants.GRANTSCOPE + "&state=STATE#wechat_redirect";
  }  

2)获取用户openid

/**
 * 2.通过code换取网页授权access_token及openid
 */
@RequestMapping(value = "/send_wx_msg", method = RequestMethod.GET)
public String sendWxMsg(String code) {
  String access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token";
  String accessTokenObj = HttpClientUtil.sendGet(access_token_url, "appid=" + Constants.APPID + "&secret="
      + Constants.APPSECRET + "&code=" + code + "&grant_type=authorization_code");
  JSONObject jsonToken = JSONObject.fromObject(accessTokenObj);

  String openId = null;
  if (StringUtils.isNotBlank(String.valueOf(jsonToken))) {
    openId = jsonToken.getString("openid");
  }
  logger.info("获取openid,微信平台接口返回{}", openId);
  return openId;
}

3)组装、发送模板消息

import java.util.TreeMap;

public class WechatTemplate {

  private String touser;//用??penid

  private String template_id;//模板ID

  private String url;//URL置空,则在发送后,点击模板消息会进入一个空白页面(ios),或无法点击(android)

  private TreeMap<String, TreeMap<String, String>> data; //data数据

  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;
  }

  public TreeMap<String, TreeMap<String, String>> getData() {
    return data;
  }

  public void setData(TreeMap<String, TreeMa<a style="color:transparent">本文来源gao($daima.com搞@代@#码(网5</a>p<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;
  }

  @Override
  public String toString() {
    return "WechatTemplate{" +
        "touser='" + touser + '\'' +
        ", template_id='" + template_id + '\'' +
        ", url='" + url + '\'' +
        ", data=" + data +
        '}';
  }
}
//微信模板接口
private final String SEND_TEMPLATE_MESSAGE_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send";
//模板消息详情跳转URL
private static String url = "https://www.baidu.com/";

@RequestMapping(value = "/send_wx_msg", method = RequestMethod.GET)
public String sendWxMsg(String code) {
  String access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token";
  String accessTokenObj = HttpClientUtil.sendGet(access_token_url, "appid=" + Constants.APPID + "&secret="
      + Constants.APPSECRET + "&code=" + code + "&grant_type=authorization_code");
  JSONObject jsonToken = JSONObject.fromObject(accessTokenObj);

  String openId = null;
  if (StringUtils.isNotBlank(String.valueOf(jsonToken))) {
    openId = jsonToken.getString("openid");
  }
  logger.info("获取openid,微信平台接口返回{}", openId);

  String urlToken = "https://api.weixin.qq.com/cgi-bin/token";
  String tokenObj = HttpClientUtil.sendGet(urlToken, "grant_type=client_credential" + "&secret=" + Constants.APPSECRET + "&appid=" + Constants.APPID);
  JSONObject retToken = JSONObject.fromObject(tokenObj);
  String accessToken = String.valueOf(retToken.get("access_token"));
  logger.info("获取access_token,微信平台接口返回{}", accessToken);

  TreeMap<String, TreeMap<String, String>> params = new TreeMap<String, TreeMap<String, String>>();
  //根据具体模板参数组装
  params.put("first", WechatTemplate.item("您的户外旅行活动订单已经支付完成,可在我的个人中心中查看", "#000000"));
  params.put("keyword1", WechatTemplate.item("发现尼泊尔—人文与自然的旅行圣地", "#000000"));
  params.put("keyword2", WechatTemplate.item("5000元", "#000000"));
  params.put("keyword3", WechatTemplate.item("2019.09.04", "#000000"));
  params.put("keyword4", WechatTemplate.item("5", "#000000"));
  params.put("remark", WechatTemplate.item("请届时携带好身份证件准时到达集合地点,若临时退改将产生相应损失,敬请谅解,谢谢!", "#000000"));
  WechatTemplate wechatTemplate = new WechatTemplate();
  wechatTemplate.setTemplate_id(Constants.TEMPLATEID);
  wechatTemplate.setTouser(openId);
  wechatTemplate.setUrl(url);
  wechatTemplate.setData(params);
  JSONObject json = JSONObject.fromObject(wechatTemplate);//将java对象转换为json对象
  String sendData = json.toString();//将json对象转换为字符串
  logger.info("板参数组装{}", sendData);

  TreeMap<String, String> treeMap = new TreeMap<String, String>();
  treeMap.put("access_token", accessToken);
  String retInfo = HttpUtil.doPost(SEND_TEMPLATE_MESSAGE_URL, treeMap, sendData);
  logger.info("消息模板返回{}", retInfo);
  return retInfo;
}

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:java实现微信公众平台发送模板消息的示例代码
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址