写这篇文章之前先给大家看张图片,这种图是不是很熟悉,用过微信关注过某些公众号的用户应该都见过,没错,是微信公众号推送出来的。通过消息推送,可以为用户发送预约服务,购买提醒服务,发货服务,提现提醒服务等消息通知。

现在,我们也要做这样一件事,不过我的业务场景是这样的:现在有一个公众号,还有一个小程序,我需要给指定的已关注我公众号的用户推送一条模板消息,当用户点击模板消息后可以调到我小程序中的指定页面。(本文以此业务场景记录开发过程)

不了解微信公众号或者没有相关经验的开发人员可能有点懵,因为不知道怎么下手,究竟该如何推送模板消息呢,其实很简单,我们只需要根据微信公众平台技术文档去仔细阅读接口调用方式并按照规范调用即可完成推送。附:模板消息推送接口

大致阅读文档后,我们知道需要具备以下条件:

  1. 有一个微信公众号,并且知道公众号的appid和appSecret
  2. 有一个小程序,并且知道小程序的appid
  3. 需要跳转到的小程序的页面(不知道的话可以问前端开发人员要)
  4. 知道就模板消息接受者的openid(接受者已关注微信公众号)

以下附上我们需要用到的两个官方接口:

//微信获取ACCESS_TOKEN API
public static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET";//微信模板消息推送 API
public static final String MESSAGE_TEMPLATE_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";

第一个接口为获取access_token,它是调用接口的凭证,在调用其他接口前必须先调用此接口获取access_token(请将自己的微信公众号的appid和appSecret替换接口地址中的APPID和SECRET)。此接口返回示例如下(返回结果是一个json数据包,注意access_token的有效期为7200s,也就是2小时,且此接口的调用频次为日限2000,如果你的推送用户量大,请把返回的access_token放到缓存中缓存一段时间,节约网络资源,从我做起。:)。另外,调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中,点击查看设置方法,否则将无法调用成功。

{
"access_token":"25_vdgBGnGbfY1bE9e0xOw-mHTROXh6xUXwCANb49jjEQ_Eu4iyhW2MqSmA1UZf7oGelW9AjLGzICvhOJcAqLaxDRVBLmwkeLDEPwQ0YbDN7-wdYza47x-WYDY0lvbFJX3ejIMu6xwnQZGlN2Um1SXHTXSeAD5AHLG",
"expires_in":7200
}

第二个接口即为推送消息模板的关键性接口,模板消息的推送就是依靠此接口完成的,但是注意,需要将第一个接口返回的access_token解析拿出来替换这个接口地址中的ACCESS_TOKEN。(以下为此接口的请求体,封装成一个数据传输对象dto,然后转成json)

{"touser":"OPENID",        // 接收模板消息的用户"template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",        //公众号中配置的消息模板对应的模板ID"url":"http://weixin.qq.com/download",         //想要跳转的路径 "miniprogram":{        //需要跳转的小程序的appid和页面"appid":"xiaochengxuappid12345","pagepath":"index?foo=bar"},          "data":{        // 封装模板消息数据"first": {"value":"恭喜你购买成功!","color":"#173177"},"keyword1":{"value":"巧克力","color":"#173177"},"keyword2": {"value":"39.8元","color":"#173177"},"keyword3": {"value":"2014年9月22日","color":"#173177"},"remark":{"value":"欢迎再次购买!","color":"#173177"}}}

注意:请务必根据微信公众平台的技术文档按照规范封装数据请求体。

注:url和miniprogram都是非必填字段,若都不传则模板无跳转;若都传,会优先跳转至小程序。开发者可根据实际需要选择其中一种跳转方式即可。当用户的微信客户端版本不支持跳小程序时,将会跳转至url。


这就结束了?并没有!如果我没有公众号我想练练手怎么办呢?当然有办法,我们可以申请测试号直接测试!nice!

微信公众平台接口测试帐号申请,点此申请测试号!!!

现在公众号的appid和appSecret有了!

关注二维码,相当于关注了上面的测试号,这样我们就拿到了自己的openid!

增加一个模板消息,现在模板ID也有了!

根据上面的步骤,一步步来,直接放张结果图吧!大功告成!

(本文最终推送的结果与实际场景有出入,因为本测试号无法关联我要跳转的小程序,所以...)

文章最后抛出一些注意点:

  1. 如果要在微信公众号内推送消息,其分为微信消息与小程序消息,微信消息可以主动推送,小程序消息的推送依赖于用户主动点击小程序内产生的formid,两者是有差别的,注意区分。(本文推送的是微信消息,所以跟formid没关系)
  2. 如果要推送消息并且跳转对应小程序,需要小程序已审核发布,并且已关联本公众号,否则推送不出来!
  3. 本文发送http请求依赖了hutool工具包,自行pom文件引入调用即可。
  4. 多看文档介绍,调用接口推送完毕回返回状态码,根据状态码自行检查错误。全局返回码说明、

附上本文demo代码:

public class WxTemplateMessage {public static void main(String[] args) {final Logger logger = LoggerFactory.getLogger(WxTemplateMessage.class);logger.info("========微信模板消息定时推送开始========");String appId = "wxf8daaba119674993ae";        // 公众号appidString appSecret = "2a996e13386170a817c42d611a8b26ce49";      // 公众号appSecretString miniAppId = "wx37e7dd9d2312bfb19d4";        // 要跳转的小程序appidString pagePath = "pages/common/Outpatient-pay?type=clinic";     // 要跳转的小程序页面String accessToken = JSONObject.fromObject(HttpUtil.get(WeChatMessagePushConstants.ACCESS_TOKEN_URL.replace("APPID", appId).replace("SECRET", appSecret))).getString("access_token");WechatTemplate template = new WechatTemplate();template.setTemplate_id("a5kTd_SzwgUhwRrh21PF7eYIcouGUNaQ8tdRoHgNTC5GE");     // 模板消息IDtemplate.setTouser("olfZfwadJ24NRAm7YS2fESXYuFVqmM");     //  接收者openidMiniprogram miniprogram = new Miniprogram();miniprogram.setAppid(miniAppId);miniprogram.setPagepath(pagePath);template.setMiniprogram(miniprogram);Map<String, TemplateData> mapdata = new HashMap<>();TemplateData first = new TemplateData("您好,您有一笔订单产生!");mapdata.put("first", first);TemplateData keyword1 = new TemplateData("测试用户");       // 用户名mapdata.put("keyword1", keyword1);TemplateData keyword3 = new TemplateData("100.00");           // 订单金额mapdata.put("keyword3", keyword3);TemplateData keyword4 = new TemplateData("小米手机");         // 商品信息mapdata.put("keyword4", keyword4);TemplateData remark = new TemplateData("更多详细内容点击查看");         // 备注mapdata.put("remark", remark);template.setData(mapdata);logger.info("推送内容:[{}]", com.alibaba.fastjson.JSONObject.toJSONString(template));JSONObject pushResult = JSONObject.fromObject(HttpUtil.post(WeChatMessagePushConstants.MESSAGE_TEMPLATE_URL.replace("ACCESS_TOKEN", accessToken), com.alibaba.fastjson.JSONObject.toJSONString(template)));int result = 0;if (null != pushResult) {if (0 != pushResult.getInt("errcode")) {result = pushResult.getInt("errcode");logger.info("推送结果:[推送失败],错误代码:[{}],错误原因:[{}]。", pushResult.getInt("errcode"), pushResult.getString("errmsg"));} else {logger.info("推送结果:[推送成功]。");}}logger.info("========微信模板消息定时推送结束========");}
}
public class WeChatMessagePushConstants {//微信获取ACCESS_TOKEN APIpublic static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET";//微信模板消息推送 APIpublic static final String MESSAGE_TEMPLATE_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";}
public class Miniprogram {private String appid;private String pagepath;public String getAppid() {return appid;}public void setAppid(String appid) {this.appid = appid;}public String getPagepath() {return pagepath;}public void setPagepath(String pagepath) {this.pagepath = pagepath;}
}
public class WechatTemplate {private String touser;private String template_id;private Miniprogram miniprogram;private String url;private Map<String, TemplateData> data;public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public Miniprogram getMiniprogram() {return miniprogram;}public void setMiniprogram(Miniprogram miniprogram) {this.miniprogram = miniprogram;}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 Map<String, TemplateData> getData() {return data;}public void setData(Map<String, TemplateData> data) {this.data = data;}}

下期再见!

微信公众号开发之微信模板消息推送相关推荐

  1. PHP+TP框架实现微信公众号开发之发送模板消息

    一:准备工作. 1.将需要使用到的微信配置放在config.php配置文件中方便获取.(我使用的是微信测试号) return array(//'配置项'=>'配置值''appID'=>'w ...

  2. 微信公众号配置 Token 认证以及消息推送功能

    前言 公众号服务配置 Token认证 如何配置 Token 认证接口 公众号获取网页授权及用户信息 导向 网页授权 关注后消息触发授权 公众号推送模板消息 模板消息功能插件 推送模版消息接口介绍 获取 ...

  3. 教程: nodejs 做微信公众号开发,回复 xml 消息

    教程: nodejs 做微信公众号开发,回复 xml 消息 首先需要你的后台跟服务器已经可以建立连接,这个不再冗述看官方教程就好 接入指南 .此篇介绍的是如何获取用户发来的信息,并回复它. 一.接收 ...

  4. 微信公众号开发 - 事件处理和回复消息

    微信公众号开发文章目录 1.微信公众号开发 - 环境搭建 2.微信公众号开发 - 配置表设计以及接入公众号接口开发 3.微信公众号开发 - token获取(保证同一时间段内只请求一次) 4.微信公众号 ...

  5. 微信公众 mysql回复图片_微信公众号开发之微信公共平台消息回复类实例

    本文实例讲述了微信公众号开发之微信公共平台消息回复类.分享给大家供大家参考.具体如下: 微信公众号开发代码我在网上看到了有不少,其实都是大同小义了都是参考官方给出的demo文件进行修改的,这里就给各位 ...

  6. 公众平台模板消息所在行业_如何使用微信公众号第三方平台群发模板消息助手?...

    对于微信公众号群发模板消息助手的实现,公众号后台提供了接口编程实现,微号帮平台提供了模板消息群发功能实现,均可以让微信公众号群发模板消息,模板消息即按固定格式的文本模块消息,没有图文形式,纯固定格式的 ...

  7. 视频教程-基于python的微信公众号开发教程-微信开发

    基于python的微信公众号开发教程 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试(软考)--"信 ...

  8. 微信公众号开发之微信公众平台与公众号第三方平台区别

    微信公众号开发分为微信公众平台和公众号第三方平台. 首先需要一个认证服务号,然后在设置,基本配置里面配置公众号开发信息和服务器配置. 这是我们会得到开发者ID(AppID),开发者密码(AppSecr ...

  9. 微信公众号发送小程序卡片_微信公众号将能够直接给用户推送小程序卡片,社交电商开始发力...

    公众号或能在对话框中直接给粉丝推送小程序卡片了,这个功能似乎正在灰度测试中. 微信公众号将能够直接给用户推送小程序卡片,社交电商开始发力 一直以来,微信公众号和微信小程序一直是腾讯基于微信生态的两款明 ...

  10. (原创)微信公众号开发的简单模板及配置流程简介

    /* *公司需要,学了一下微信公众号开发,写这篇博客的时候已经开发结束半个月了 *回来记录一下,采用php语言(现学的)进行开发,不足之处还望提出来共同探讨 */ (原创不易,转载请注明出处!) 提示 ...

最新文章

  1. 2021年大数据Kafka(八):Kafka如何保证数据不丢失
  2. Android开发笔记之:Handler Runnable与Thread的区别详解
  3. CentOS在安装配置 Ngnix_tomcat_PHP_Mysql
  4. ubuntu 破解mysql密码_Ubuntu下忘记MySQL root密码解决方法
  5. UIWebView与JS的深度交互
  6. WebRTC 聊天Demo
  7. css3三角形兼容_css3三角箭头的使用和兼容【原创】
  8. python怎么改错误代码_【新人求助】py大神们求看,一段简单代码出错,不知道如何修改...
  9. java计算器课程报告_java课程设计报告计算器设计.doc
  10. oracle11g安装程序闪退,win10安装oracle11g-client闪退
  11. 山东省枣庄高新区益洋花园地块场地环境初步调查信息公示
  12. egret的eui以及exml使用
  13. JSF——JSF 标签
  14. 显卡mx150和230哪个好_显卡mx150好吗_mx150和gt940mx对比
  15. OKPay遭到DDoS攻击,本周进一步威胁网络攻击
  16. 让小伙伴大呼过瘾的数据可视化作品!
  17. Springboot集成rabbitmq实现延时队列
  18. 布置主卧室的八大风水要点
  19. 树莓派控制57步进电机
  20. js实现键盘控制div移动(可加速)_☆往事随風☆的博客

热门文章

  1. 计算机硬故障指什么原因是,计算机常见硬故障的诊断及排除(7页)-原创力文档...
  2. 单片机c语言轻松入门 完整版,单片机C语言轻松入门
  3. QCon上海2015精彩回顾和总结
  4. 编译原理 --- 递归下降分析器
  5. AI新生 人类最后一个大问题 破解人机共存密码 Human Compatible Stuart Russell
  6. cad字体安装_为什么CAD图纸打开后会显示很多问号“???”,该怎么解决
  7. ppap文件过程流程图制作_PPAP提交范本---过程流程图
  8. php版wap浏览器,PHP 检测手机浏览器的代码
  9. 编写一个生成器函数,能够生成斐波那契数列
  10. 原创!PlusU盘病毒免疫工具,让你轻松远离伪装成文件夹的U盘病毒!