java 微信小程序-发送模板消息

article/2025/9/11 3:06:02

开发前准备工作

  1. 登录微信公众平台-小程序后台,在模板消息里面设置需要发送的模板,拿到模板id。
    地址: https://mp.weixin.qq.com
    在这里插入图片描述
  2. 找到微信官方文档-小程序开发-下发小程序和公众号统一的服务消息接口。
    地址: https://developers.weixin.qq.com/miniprogram/dev/api-backend/
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190910163537962.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Jvb2tpZVRh,size_16,color_FFFFFF,t_70
    3.下发小程序和公众号统一的服务消息接口需要接口调用凭证。
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190910164758597.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Jvb2tpZVRh,size_16,color_FFFFFF,t_70
    4.接口调用凭证需要小程序的appid 和 secret,在小程序后台获取。
    在这里插入图片描述
    代码编写
    调用接口凭证,获取access_token
    注意:access_token 的有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效;
    建议开发者使用中控服务器统一获取和刷新 access_token;
	/**  * 获取access_token* @param appid 凭证  * @param appsecret 密钥  * @return  */    public static AccessToken getAccessToken() {    AccessToken accessToken = null;    String requestUrl = WeChatConstants.WECHAT_ACCESS_TOKEN_URL.replace("APPID", WeChatConstants.WECHAT_APPID).replace("APPSECRET", WeChatConstants.WECHAT_APPSECRET);    JSONObject jsonObject = WeChatUtil.httpRequest(requestUrl, "GET", null);  //调用通用的https请求方法  // 如果请求成功    if (null != jsonObject) {    try {    accessToken = new AccessToken();    accessToken.setToken(jsonObject.getString("access_token"));    accessToken.setExpiresIn(jsonObject.getInteger("expires_in"));accessToken.setCreatedate(new Date());weixincache.put("accessToken", accessToken);} catch (JSONException e) {    accessToken = null;    // 获取token失败    log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInteger("errcode"), jsonObject.getString("errmsg"));}    }    return accessToken;    }

配置类

public class WeChatConstants {public static final String WECHAT_TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi"; public static final String WECHAT_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";// 待支付课程提醒public static final String  UNPAID_PAY_TEMPLATE_ID = "需要发送的小程序后台模板id";// 支付成功课程提醒public static final String  PAY_SUCCEED_TEMPLATE_ID = "需要发送的小程序后台模板id";public static final String WECHAT_APPID = "小程序appid";public static final String WECHAT_APPSECRET = "小程序secret密钥";}

公众平台通用接口工具类

public class WeChatUtil {    private static Logger log = LoggerFactory.getLogger(WeChatUtil.class);/**  * 发起https请求并获取结果  *   * @param requestUrl 请求地址  * @param requestMethod 请求方式(GET、POST)  * @param outputStr 提交的数据  * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)  */    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) {    log.error("Weixin server connection timed out.");    } catch (Exception e) {    log.error("https request error:{}", e);    }    return jsonObject;    }    } 

发送模板消息接口

	/*** @param orderId 订单id* @param openid 用户openid* @param formId 表单ID* @param templateId 模板ID* @param keywords {与模板字段一一对应}* @return*/public static Map<String,String> pushOneUser(Long orderId, String openid, String formId,String templateId,String[] keywords) {Map<String,String> map = new HashMap<>();String msg = null;try {//如果access_token为空则从新获取String access_token = RedisUtil.getString("access_token");if (access_token == null) {AccessToken accessToken = getAccessToken();access_token = accessToken.getToken();RedisUtil.setString("access_token", access_token, (60 * 120));}if (RedisUtil.exists(access_token)){AccessToken accessToken = getAccessToken();access_token = accessToken.getToken();RedisUtil.setString("access_token", access_token, (60 * 120));}String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send" +"?access_token=" + access_token;//拼接推送的模版WxMssVo wxMssVo = new WxMssVo();wxMssVo.setTouser(openid);//用户openidwxMssVo.setForm_id(formId);//formIdwxMssVo.setTemplate_id(templateId);//模版idwxMssVo.setPage(wxMssVo.getPage()+"?orderId="+orderId);Map<String, TemplateDataVo> m = new HashMap<>();//封装数据if(keywords.length>0){for(int i=1;i<=keywords.length;i++){TemplateDataVo keyword = new TemplateDataVo();keyword.setValue(keywords[i-1]);m.put("keyword"+i, keyword);}wxMssVo.setData(m);}else{log.error("keywords长度为空");return null;}log.info("发送模板消息请求参数"+JSONObject.toJSONString(JSONObject.toJSONString(wxMssVo)));JSONObject jsonObject = WeChatUtil.httpRequest(url, "POST", JSONObject.toJSONString(wxMssVo));  //调用通用的https请求方法log.info("发送模板消息返回"+JSONObject.toJSONString(jsonObject));map.put("content",JSONObject.toJSONString(m));map.put("returnMsg",JSONObject.toJSONString(JSONObject.toJSONString(jsonObject)));map.put("errcode",jsonObject.getString("errcode"));// 如果请求成功if (null != jsonObject) {msg =  jsonObject.getString("errmsg");}}catch (Exception e){e.printStackTrace();}return map;}

封装模板类

public class WxMssVo {private String touser;//用户openidprivate String template_id;//模版idprivate String page = "pages/MyOrder/MyOrderDetail";// 订单详情页private String form_id;//收集到的用户formid//    private String emphasis_keyword = "keyword1.DATA";//放大那个推送字段private Map<String, TemplateDataVo> 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 getPage() {return page;}public void setPage(String page) {this.page = page;}public String getForm_id() {return form_id;}public void setForm_id(String form_id) {this.form_id = form_id;}public Map<String, TemplateDataVo> getData() {return data;}public void setData(Map<String, TemplateDataVo> data) {this.data = data;}
}
public class TemplateDataVo {//字段值例如:keyword1:content,keyword2:课程名称,keyword3:创建时间,keyword4:订单金额private String value;//依次排下去
//    private String color;//字段颜色(微信官方已废弃,设置没有效果)public String getValue() {return value;}public void setValue(String value) {this.value = value;}
}

测试发送模板消息
关于获取formid
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/template-message.html

    /*** @param orderEntity* @param openid 用户openid,可以是小程序的openid,也可以是mp_template_msg.appid对应的公众号的openid* @param formId 小程序模板消息formid*/public  void pushOneUser(OrderEntity orderEntity,String openid,String formId){try {SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String template = WeChatConstants.PAY_SUCCEED_TEMPLATE_ID; // 需要发送的模板idString price = "12.30";  // 订单金额Date orderDate = orderEntity.getCreateTime(); // 创建时间String dateString = formatter.format(orderDate);String courseName = "测试发送模板消息"; // 课程名称String content = "您的课程已支付,我们会在1-3个工作日内联系您,安排开课~";String[] keywords = {content, courseName, dateString, price};WeChat.pushOneUser(orderEntity.getId(),openid,formId,template,keywords);}catch (Exception e){e.printStackTrace();}}

官方返回值
在这里插入图片描述
程序调用成功返回值
在这里插入图片描述
程序调用失败返回值
在这里插入图片描述
发送模板消息记录表
在这里插入图片描述


http://chatgpt.dhexx.cn/article/90k4fuFE.shtml

相关文章

【微信小程序】模板消息推送(测试成功)。

note&#xff1a; 这几天想做微信小程序消息推送的功能&#xff0c;然后在网上找了好多教程&#xff0c;都没解决问题&#xff0c;官方文档写的教程由不够详细&#xff0c;所以走了好多弯路。 现在问题解决了&#xff0c;记录一下。 我在网上找的好多教程都不详细&#xff0c;虽…

微信小程序模板订阅消息推送

尚未接触这块之前&#xff0c;以为是比较麻烦的&#xff0c;经研究并实现后&#xff0c;大致可以分为三个阶段&#xff1a; 申请模板&#xff08;明确推送卡片的格式及内容&#xff09;前端订阅&#xff08;打开可推送开关&#xff0c;允许推送&#xff09;后端推送&#xff0…

微信小程序——发送模板消息

步骤一&#xff1a;获取模板ID 1、通过模版消息管理接口获取模版ID&#xff08;详见模版消息管理&#xff09; 2、在微信公众平台手动配置获取模版ID 登录 https://mp.weixin.qq.com 获取模板&#xff0c;如果没有合适的模板&#xff0c;可以申请添加新模板&#xff0c;审核通…

微信小程序的模板消息与小程序订阅消息

小程序订阅消息功能介绍消息能力是小程序能力中的重要组成&#xff0c;我们为开发者提供了订阅消息能力&#xff0c;以便实现服务的闭环和更优的体验。 订阅消息推送位置&#xff1a;服务通知订阅消息下发条件&#xff1a;用户自主订阅订阅消息卡片跳转能力&#xff1a;点击查…

《微信小程序——发送模板消息》详细步骤

第一步&#xff1a;获取access_token 第一步详情&#xff1a;因为access_token在微信公众号还是小程序&#xff0c;在一个月之内都有获取次数的限制&#xff0c;并且一个access_token只有2小时的有效期&#xff1b;所以每当我们获取一次access_token,就要反复利用&#xff1b;…

微信小程序给公众号发送模板消息

参考文献&#xff1a;小程序如何向公众号推送消息_fbbqt的博客-CSDN博客_小程序给公众号发信息小程序如何向公众号推送消息https://blog.csdn.net/fbbqt/article/details/122167097 前置条件&#xff1a; 微信公众号:AppId和APPSecret(必须认证) 微信小程序:AppId和APPSecret…

微信小程序模板消息实现(PHP+小程序)

参考官方文档和部分资料&#xff0c;总结小程序模板消息推送以及相关注意事项&#xff0c;楼主踩过的坑&#xff0c;特来与大家分享。 一、开发准备&#xff1a; 1. 在微信公众平台 - 小程序的模板中心申请消息模板 二、实现原理&#xff1a; 文档示例&#xff1a;小程序 接…

微信小程序订阅模板消息

1.登录管理员后台&#xff0c;订阅消息&#xff0c;选择模板或者申请模板 2. 开发管理&#xff0c;开发设置&#xff0c;开启消息推送&#xff0c;并验证服务器 3. 开发获取获取模板列表接口&#xff0c;和 测试消息发送接口 4. 前端根据接口配置授权弹窗页&#xff0c;获取用…

微信小程序|如何设置模板消息提醒

管理员如何设置模板消息提醒&#xff0c;管理员如何查看。回复用户咨询信息 使用管理员模板消息提醒&#xff0c;首先配置模板消息 第一步&#xff0c;设置模板消息&#xff0c;配送员通过微信模板消息接收配送信息&#xff0c;需要在平台——微信公众号——模板消息设置&#…

小程序之模板消息

使用模板消息 获取模板 id 登录https://mp.weixin.qq.com获取模板&#xff0c;如果没有合适的模板&#xff0c;可以申请添加新模板&#xff0c;审核通过后可使用&#xff0c;详见模板审核说明 页面的 <form/> 组件&#xff0c;属性report-submit为true时&#xff0c;可…

微信小程序模板消息的两种实现方式

最近在做微信小程序&#xff0c;为了让用户能更加方便的获取到小程序内部的通知&#xff0c;便想着用模板消息来解决此类问题。首先介绍一下两种方法 第一种是传统的按照微信开发文档来实现模板消息的获取&#xff0c;首先要明确的是你要有一个第三方的服务器&#xff0c;因为…

微信小程序实例:创建下发模板消息实例

鉴于目前网络上都还找不到小程序下发模板消息的相关资源&#xff0c;在多次阅读了官方文档今天终于把小程序的模版消息给测通了&#xff0c;接下来介绍在不使用服务器的情况下&#xff0c;前端开发人员在本地怎么测试模板消息的发送。 1、在微信公众平台-小程序的模板中心先申请…

小程序配置模板消息

1.登录微信公众号平台&#xff0c;需要有权限的工作人员进行扫码登录。 2.登录进去点击订阅消息。 3.点击添加按钮&#xff0c;可以在搜索框进行搜索想要的模板类型&#xff0c;然后点击选用即可。 4.选择提醒模板消息的参数&#xff0c;需要跟客户沟通需要什么参数就配什么参…

小程序 发送模板消息的功能实现

☹. 背景 - 小程序开发的过程中&#xff0c;绝大多数会满足微信支付 - 那么&#xff0c;作为友好交互的体现&#xff0c;自然就会考虑到支付后的消息通知咯 - 所以&#xff0c;我的小程序项目也要求完成这个效果&#xff0c;so.分享一下自己的实现步骤&#xff0c;以方便道友们…

微信小程序-----消息模版(最全解释)

最近小程序在码界里嫌弃腥风血雨&#xff0c;每一个码奴都感觉世界给自己又多开一个扇窗&#xff0c;本菜鸟也眼红不已&#xff0c;就尝试着写了一个小程序&#xff0c;今天跟大家分享一下自己在写消息模版时候遇到的坑&#xff0c;希望能帮助每一位路过踩坑的道友&#xff1b;…

微信小程序模板消息推送

时序图 ​​​​​​​ 首先&#xff0c;我们需要知道一件事情&#xff0c;小程序的模板推送分为“一次性订阅”和“长期订阅” 一次性订阅&#xff1a;用户订阅小程序后&#xff0c;程序只能对指定OpenId进行一次推送模板消息&#xff0c;无法多次推送 长期订阅&#xff1a…

小程序发送模板消息给用户 —— 一次性模板实现“长期订阅”

大家好&#xff01;我是我玩亚索我会C&#xff0c;在写小程序时&#xff0c;我们会有向用户发送消息的需求&#xff0c;比如发送提醒通知&#xff0c;或者是一些重要通知来形成一个服务的闭环。这就要用到微信的发送消息功能了&#xff0c;下面我使用Java语言来详细演示下如何使…

小程序发送模板消息详细步骤

小程序发送通模板消息详细步骤 步骤一&#xff1a;获取模板id步骤二&#xff1a;页面的form组件&#xff0c;属性report-submit为true时&#xff0c;可以声明为需发模板消息&#xff0c;此时点击按钮提交表单可以获取formId&#xff0c;用于发送模板消息。或者当用户完成支付行…

小程序模板消息

一,制定小程序订阅消息模板 示例图片 (图1) 首先我们来讲一下如何获取制定微信小程序的订阅消息模板, 如图1所示我们首先要登录到微信公众平台,如图 而后进入到图1所示的订阅消息这个页面, 如果你是首次进入的话那么需要开通, 这里比较简单就不用讲解了, 如果说进入之后…

微信小程序能实现盈利的7大流量主广告组件及其分成模式概览

前段时间涉足了微信小程序流量主广告的接入&#xff0c;所以就学习和了解了一下相关的介绍与接入场景。因此做一下笔记记录。 概览 微信小程序流量主广告组件有Banner 广告、激励视频广告、插屏广告、小程序视频广告、视频前贴广告、Grid 广告、原生模板广告等。 基础介绍 什…