第一步:申请模板获取模板ID: 登录微信公众平台 -> 功能 -> 订阅消息 -> 对里面的模板进行选用或者自定义

公共模板库里面的模板分为一次性订阅 和永久订阅,这个是根据你创建小程序时选择的行业进行区分的。
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.html 官方文档中有详细说明

第二步: 消息订阅接口:需要在小程序端调起订阅接口,需要前端完成。官方地址:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/subscribe-message/wx.requestSubscribeMessage.html
第三步: 服务端发送消息到服务通知,官方文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
我这里采用的是https的调用方式

代码实现:

  • 核心代码
package com.minapp.management.service;import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Strings;
import com.minapp.management.config.WxProperties;
import com.minapp.management.entity.dto.AppletTemplateMessageSendDTO;
import com.minapp.management.utils.CacheManager;
import com.minapp.management.utils.HttpClientUtil;
import lombok.Synchronized;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.io.IOException;
import java.util.Map;@Component
public class WxAppletRemoteService {private Logger logger = LoggerFactory.getLogger(WxAppletRemoteService.class);private static final String WXAPPLETURl="https://api.weixin.qq.com/cgi-bin";@Autowiredprivate WxProperties properties;@Autowiredprivate ObjectMapper objectMapper;/*** 获取AccessToken* @return*/@Synchronizedpublic String getAccessToken() {String appid=null;String secret=null;// 这里我是从配置文件中取得appid和appsecretappid=properties.getAppId();secret=properties.getAppSecret();//查询token是否存在String key="dowin"+appid+"_AccessToken";// 使用缓存先查询AccessToken是否存在,我这里使用的是本地缓存,如果只是存一个token,本地缓存足以,不需要使用专门缓存的服务,比如reids。String accessToken = CacheManager.getData(key);// 存在直接返回,不存在重新获取AccessTokenif (!Strings.isNullOrEmpty(accessToken)){return accessToken;}// 获取AccessToken的urlString grantType="client_credential";String url=WXAPPLETURl+"/token?grant_type="+grantType+"&appid="+appid+"&secret="+secret;// 获取到AccessTokenString token = HttpClientUtil.get(url);Map<String,Object> map = null;try {map = objectMapper.readValue(token, Map.class);} catch (IOException e) {logger.error("小程序异常通知-获取AccessToken-转化异常",e);}String access_token = String.valueOf(map.get("access_token"));// 把AccessToken存入缓存中,并设置过期时间,因为access_token的过期时间是两小时,我们缓存的时间一定要小于两小时,CacheManager.setData(key,access_token,5000);if (map.get("errcode")!=null || map.get("errmsg")!=null){String errcode = String.valueOf(map.get("errcode"));String errmsg = String.valueOf(map.get("errmsg"));if (!errcode.equals("0")){logger.error("获取token失败:code="+errcode+"msg="+errmsg);return null;}}return access_token;}/*** 同一消息发送接口* AppletTemplateMessageSendDTO   是一个传输类*/public String uniformMessageSend(AppletTemplateMessageSendDTO data) {String token = getAccessToken();// 调用发型接口String url=WXAPPLETURl+"/message/subscribe/send?access_token="+token;String returnData = HttpClientUtil.post(url,JSON.toJSONString(data));Map<String,Object> map = null;try {map = objectMapper.readValue(returnData, Map.class);} catch (IOException e) {logger.error("小程序异常通知-同一消息发送-转化异常",e);}String errcode = String.valueOf(map.get("errcode"));String errmsg = String.valueOf(map.get("errmsg"));if (!errcode.equals("0")){logger.error("消息发送失败:code="+errcode+"msg="+errmsg);}return errcode;}}
  • 传输实体类
package com.minapp.management.entity.dto;import lombok.Data;import java.io.Serializable;//小程序模板消息发送模板
@Data
public class AppletTemplateMessageSendDTO implements Serializable {//接收者(用户)的 openidprivate String touser;//所需下发的订阅模板idprivate String template_id;//所跳转的页面private String page;//模板消息内容private Object data;}
  • 本地缓存类
package com.minapp.management.utils;import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;// 本地缓存类
public class CacheManager {private static Map<String, CacheData> CACHE_DATA = new ConcurrentHashMap<>();public static <T> T getData(String key, Load<T> load, int expire) {T data = getData(key);if (data == null && load != null) {data = load.load();if (data != null) {setData(key, data, expire);}}return data;}// 根据key获取数据public static <T> T getData(String key) {CacheData<T> data = CACHE_DATA.get(key);if (data != null && (data.getExpire() <= 0 || data.getSaveTime() >= System.currentTimeMillis())) {return data.getData();}return null;}// 存入数据并设置过期时间public static <T> void setData(String key, T data, int expire) {CACHE_DATA.put(key, new CacheData(data, expire));}// 根据key清除数据public static void clear(String key) {CACHE_DATA.remove(key);}// 清除所有缓存数据public static void clearAll() {CACHE_DATA.clear();}public interface Load<T> {T load();}private static class CacheData<T> {CacheData(T t, int expire) {this.data = t;this.expire = expire <= 0 ? 0 : expire * 1000;this.saveTime = System.currentTimeMillis() + this.expire;}private T data;private long saveTime; // 存活时间private long expire;   // 过期时间 小于等于0标识永久存活public T getData() {return data;}public long getExpire() {return expire;}public long getSaveTime() {return saveTime;}}
}

测试:

AppletTemplateMessageSendDTO appletTemplateMessageSendDTO = new AppletTemplateMessageSendDTO();appletTemplateMessageSendDTO.setTouser("openid");appletTemplateMessageSendDTO.setTemplate_id("模板id");appletTemplateMessageSendDTO.setPage("跳转的页面");Map<String,Object> map = new HashMap<>();Map<String,Object> thing6 = new HashMap<>();Map<String,Object> time8 = new HashMap<>();Map<String,Object> phone_number7 = new HashMap<>();Map<String,Object> thing10 = new HashMap<>();thing6.put("value","xqd");time8.put("value","2020-12-29");phone_number7.put("value", "17600026666");thing10.put("value","测试一下订阅消息");map.put("thing6",thing6);map.put("time8",time8);map.put("phone_number7",phone_number7);map.put("thing10",thing10);appletTemplateMessageSendDTO.setData(map);wxAppletRemoteService.uniformMessageSend(appletTemplateMessageSendDTO);

发送成功

微信小程序订阅消息通过服务通知发送相关推荐

  1. 微信小程序模板消息(服务通知消息)原始post工具封装(不使用jar包--坑比较多),解决47001(JSON格式)和中文乱码问题

    微信小程序模板消息(服务通知消息)原始post工具封装(不使用jar包--坑比较多),解决47001(JSON格式)和中文乱码问题 参考文章: (1)微信小程序模板消息(服务通知消息)原始post工具 ...

  2. 化繁为简,我用”知晓推送”开发微信小程序订阅消息

    知晓云在2019年十月份左右就上线了微信小程序订阅消息这个服务,后来迭代升级,又相继提供了相应的sdk插件,然而这之前,我却没有很认真,花精力去使用这些服务,刚好国庆几天假,我就熬了两个通宵,将这个小 ...

  3. 【Node.js】实现微信小程序订阅消息推送功能

    实战项目名称:实现微信小程序订阅消息通知 文章目录 一.实战步骤 1. 登录微信小程序管理端,添加订阅消息模板 2. 定义好需要发送的消息 3.获取小程序的access_token 4. 发起请求,向 ...

  4. 微信小程序订阅消息定时发送消息

    微信小程序订阅消息定时发送消息 本人专注使用云开发,实现一个前端可以做后端以及整个项目的部署与上线. 如果觉得我讲的好就可以给我点个赞.也可以加我微信了解详情. 1.我们先要了解什么是订阅消息 而现在 ...

  5. 微信小程序订阅消息失败

    微信小程序订阅消息失败 之前测试微信小程序订阅消息都是正常的,并且支持开发工具的调试,但是同样的方法换到另一个页面通过表单提交触发就没有效果.调试之后发现报错信息,errMsg: "requ ...

  6. 使用Java实现微信小程序订阅消息

    首先到微信小程序的官网,选择合适自己的订阅消息模板. 寻找到适合自己的模板之后,记住模板ID,点开详情,记住每个字段id 微信小程序订阅消息官网文档介绍地址:小程序订阅消息 | 微信开放文档 (qq. ...

  7. 微信小程序 订阅消息授权

    wx.requestSubscribeMessage({tmplIds: ['9SgmLcxEfKMfS48xRYqBap3n3o8tFYGcg1RY5_mswCA', 'LUxUBwDrB3OTZB ...

  8. uni-app微信小程序订阅消息功能开发(流程讲解篇)

    温馨提示 微信小程序中废弃了"模板消息",,微信小程序模板消息 使用场景 首先我们需要明白微信订阅消息使用场景,比如客户点了一份美团外卖客户需要知道当前订单商家是否接单,或订单是否 ...

  9. 【实战】微信小程序订阅消息,后台SpringBoot实现

    消息能力是小程序能力中的重要组成,以便实现服务的闭环和更优的体验. 此前的小程序模板消息接口于2020年1月10日下线(我们开发者太难了-),2.10.0 版本开始,开发版和体验版小程序将禁止使用模板 ...

  10. 微信小程序订阅消息功能

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

最新文章

  1. Spring Boot + Redis 实现各种操作,写得太好了吧!
  2. 论文笔记:Triplet Network
  3. gradle的多项目构建(九)
  4. [Java基础]List集合子类特点
  5. Silverlight + WCF异步调用 例子
  6. 【Gitlab】GIT回滚master分支到指定tag版本 并提交远程仓库
  7. 用封装的栈回溯类捕获段错误
  8. java查看链表指定元素_Java 实例 – 链表元素查找
  9. php提取汉字拼音首字母,php获取汉字拼音首字母的函数(真正可以使用的)
  10. 初接触RTMP流媒体实时消息传输协议
  11. FTP和SSH的区别
  12. 5.0在python中是一个整数常量_python学习之路,基础篇-变量和常量
  13. 分享一个好用的网页pdf打印插件
  14. 如何(不开百度会员进行下载提速)合作双赢之路
  15. php右下角弹窗代码,2019畅言最新去除隐藏右下角弹窗广告!代码添加彻底隐藏畅言右下角广告代码...
  16. 两计算机网线连接打印机共享打印机共享打印机,打印机、资源共享、协同工作、一根网线连接两电脑的方...
  17. 跑马灯实现的三种方式
  18. 国内数字藏品交易平台开发市场会开放二级市场吗
  19. picpick设置自动截屏方法
  20. python连乘函数_(Python3) 连加 连乘 代码

热门文章

  1. 计算机设备码的功能,多功能修改电脑机器码序列号工具
  2. 什么是Word2Vec?如何有效的表征文本的?
  3. RHEL 7 新特性
  4. chrome插件开发基础以及如何防止劫持
  5. lora终端连接云服务器_云服务器如何连接LoRa网关
  6. DelphiIE插件开发
  7. PHP基础PPT课件,《php基础》PPT课件.ppt
  8. 全国火车高铁站及车次数据爬虫(内含100W+数据,免费领取!)
  9. 今日头条推广视频教程自媒体推广短视频教程今日头条引流小白入门视频解析下载支持今日头条快手抖音火...
  10. 3种实现CSS 上下居中的方法