【订阅消息】微信小程序发送服务通知

2023-11-17

前言

    由于上次的公众号测试消息推送次数太多被官方认为是推销或者是广告之类的,被微信官方给禁了,然后偶然在一次吃饭的时候扫码点餐下单之后有个弹窗勾选订单完成通知,勾选之后就餐之后就会发送一个服务通知告诉您的订单已完成,其实基于这种消息提醒也是现在最常见的消息提醒方式之一。

一、什么是消息推送

小程序订阅消息
功能介绍

消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验

  • 订阅消息推送位置: 服务通知
  • 订阅消息下发条件: 用户自主订阅
  • 订阅消息卡片跳转能力: 点击查看详情可跳转至该小程序的页面

二、整体展示

  订阅 和 推送

 

 

三、实现步骤

3.1 小程序开通订阅消息申请模板消息

 四、后台代码实现

4.1获取权限AccessToken:

/**
 * @author rwy
 * @Title:
 * @Package
 * @Description:
 * @date 2023-07-21 9:30
 */
public class WeChatUtil {
    //appId和secret 在小程序开发管理页面

    //微信小程序appId
    @Value("${wx.xcx.appId")
    private String appId;

    //微信小程序secret
    @Value("${wx.xcx.appSecret")
    private String appSecret;

    /**
     * 请求微信接口服务,获取小程序全局唯一后台接口调用凭据(access_token)
     * @param appid
     * @param secretKey
     * @return
     */
    public static JSONObject  getAccessToken(String appid, String secretKey) {
        String result = null;
        try {
            String baseUrl = "https://api.weixin.qq.com/cgi-bin/token";
            HashMap<String, Object> requestParam = new HashMap<>();
            // 小程序 appId
            requestParam.put("grant_type", "client_credential");
            // 小程序唯一凭证id appid:(换成自己的)
            requestParam.put("appid", appid);
            // 小程序 appSecret(小程序的唯一凭证密钥,换成自己的)
            requestParam.put("secret", secretKey);
            // 发送GET请求读取调用微信接口获取openid用户唯一标识
            result = HttpUtil.get(baseUrl, requestParam);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return JSONUtil.parseObj(result);
    }
}

4.2请求发送使用hutool中的HttpUtil,引入的依赖如下:

   <dependency>
       <groupId>cn.hutool</groupId>
       <artifactId>hutool-all</artifactId>
       <version>5.2.4</version>
   </dependency>

4.3发送消息具体逻辑:

@PostMapping("/program")
    public Result<?> program(){
        log.info("发微信小程序消息模板");

        // 接口调用凭证:accessToken
        String accessToken = weChatUtil.getAccessToken();
        System.out.println(accessToken);
        String weChatUrl = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;

        // 构建请求参数
        Map<String, Object> params = new HashMap<>();
        // 用户openId
        params.put("touser","og2qF64Sx8ZoEuxWKsxxxxxxxxxx");
        // 模板Id
        params.put("template_id","hXCYU9OvCxYcJpc3iVzwtORGaxxxxxxxxxxxx");
        // 点击消息跳转地址
        params.put("page","/pagesC?sceneId=1");
        // 跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
        params.put("miniprogram_state","trial");
        // 进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN
        params.put("lang","zh_CN");

        // 封装参数
        Map<String, Object> data = new HashMap<>();
        Map<String, Object> thing3 = new HashMap<>();
        thing3.put("value","xxxx");
        data.put("thing3",thing3);

        Map<String, Object> time4 = new HashMap<>();
        time4.put("value", "12:00");
        data.put("time4", time4);

        Map<String, Object> thing5 = new HashMap<>();
        thing5.put("value", "已生成");
        data.put("thing5", thing5);

        params.put("data",data);

        // 执行请求
        String jsonSting= HttpUtil.post(weChatUrl, new JSONObject(params).toString());
        System.out.println(jsonSting);

        return Result.OK(jsonSting);
    }

请求与返回示例:

// 请求示例
{
  "touser": "xxxxxxx",
  "template_id": "TEMPxxxxLATExxx_ID",
  "page": "index",
  "miniprogram_state":"developer",
  "lang":"zh_CN",
  "data": {
      "thing3": {
          "value": "sdads"
      },
      "time4": {
          "value": "12:00"
      },
      "thing5": {
          "value": "xxxx"
      }
      
  }
}


// 返回参数
{
    "errcode":0,
    "errmsg":"ok"
}

发送订阅消息 | 微信开放文档

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【订阅消息】微信小程序发送服务通知 的相关文章

  • Spring - Path 的工厂方法

    我正在尝试生成一个代表的 beanjava nio file Path使用静态方法Paths get String path 我当前的 Spring 设置如下
  • MyBatis:在一个查询中通过注释收集

    我有一个 xml 映射器 一个选择映射器和一个结果映射器 它工作没有问题 但我想使用注释 我的映射器
  • 在 JUnit 中使用 Spring 测试服务时如何回滚数据库事务?

    我测试我的 DAO 和服务没有问题 但是当我测试时INSERTs or UPDATE我想回滚事务而不影响我的数据库 我在用着 Transactional在我的服务中管理交易 我想知道 是否有可能知道事务是否正常 但回滚它以防止更改数据库 这
  • JVM如何处理不同版本的重复JAR

    当存在不同版本的重复 JAR 时 行为会非常不一致 有谁知道 JVM 如何处理重复项 类加载器按顺序搜索类路径 并使用它找到的第一个匹配的类
  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写

随机推荐

  • 解决pyqt中mainwindow界面最大化按钮是灰色(不能最大化)的问题

    解决方法 将maximumSize的值设置为16777215x16777215即可使窗口打开时最大化按钮可用 MAIN SIZE MAX QSize 16777215 16777215 self setMaximumSize MAIN SI
  • 系统服务器迁移,应用系统和服务器迁移云

    应用系统和服务器迁移云 内容精选 换一换 公有云通常指第三方供应商为用户提供的能够通过Internet使用的云端基础设施和服务 其核心属性是共享资源服务 华为云是公有云品牌 在SAP系统迁移的过程中 您可以单独使用这些华为云云服务 也可以组
  • Python方便又强大的日志记录器——loguru

    Python方便又强大的日志记录器 loguru Loguru是一个旨在使Python日志记录变得愉快的库 该库通过添加一系列有用的功能来解决标准记录器的警告 从而减少Python日志记录的痛苦 日志记录对每个应用程序都是基本的 它简化了调
  • rosserial_arduino

    rosserial arduino 一级目录 二级目录 三级目录 wiki tutorials 1 安装arduino IDE 2 Installing the Software 2 1 Installing on the ROS work
  • linux charg修改目录,Thinkpad在GUN/linux(ubuntu)下修改电池充电阈值

    详见 http www thinkwiki org wiki Tp smapi 安装tp smapi aptitude install tp smapi dkms modprobe tp smapi 更改充电阈值 设置开始充电阈值 如从 6
  • 02

    1 克隆镜像 前提 centos 7 选择 管理 gt 克隆 选择 下一步 选择 虚拟机中的当前状态 选择 创建完整克隆 设置 虚拟机名称 和 位置 克隆完成界面 2 导入镜像 打开虚拟机 选择对应的克隆文件 导入后的结果 3 网络设置 3
  • 铨顺宏RFID:根据UWB技术性的矿山开采人员精准定位系统

    计划方案环境及总体目标 伴随着智能技术的持续发展趋势 矿山开采生产模式不断创新 翠绿色 绿色生态 智能化慢慢变成煤业的追求完美 煤业智能化系统 智能化针对矿山开采而言十分关键 不但可以产生生产量的提升 还能够协助减少资金投入和产品成本 提高
  • 科技云报道:震惊!4K、8K画质背后,竟然少不了AI的助力

    科技云报道原创 对于视频的画质 我现在最低只能够接受720P 最好是1080p 早五年前 身边就已经有人提出了这样的要求 随着科技的进步 我们进入了一个视频内容快速增长的时代 从社交媒体到在线教育 从直播购物到虚拟会议 视频正逐渐成为主流的
  • Jiu Yuan Wants to Eat【2018焦作网络赛】【树链剖分】

    题目链接 树链剖分学习笔记 可以看这里 这道题还真挺好的 以前不会做 现在想了发现 学过树链剖分之后 剩下的部分就是处理去反那块比较的不容易些了 但是想了一下午 现在还是给我敲出来了 我们主要难处理的就是关于求反 那么怎么处理求反 一开始读
  • antd-select下拉框如何同时获取所选值ID和名字属性

    其中传过去的e为 从antd官网可以看到select组件的onchange属性传参 第一个参数为value 第二个参数可为所选中的那一项的所有信息 其中的props属性内有一个children属性 即存储了所选项的名称
  • JWT快速入门及所需依赖

    目录 1 JWT 1 1什么是JWT 1 2JWT的构成 jwt的头部 payload signature 1 3JWT快速入门案例 2Jwt认证 微服务 2 1微服务下统一权限认证 2 2应用认证 3 无状态的JWT令牌如何实现续签功能
  • 蓝桥杯2022年第十三届省赛真题-最优清零方案--java语言

    题目链接 https www dotcpp com oj problem2689 html 一开始没仔细看题目 以为是自然连续数 搞得我还发了篇提问 怪尴尬的 https ask csdn net questions 7913935 spm
  • MongoDB、Elasticsearch分组统计性能比较

    环境参数 CentOS 7 6 虚拟机 4核 8GB Elasticsearch 5 6 16 MongoDB 5 0 9 数据结构 userId rkyao searchId 6e1c409ed7484a6a8a795e750bef9e2
  • 空间向量及值插值相关函数

    1 两个向量之间插值 float3 slerpBetweenVector float3 from float3 to float delta quatf model start quatf fromDirectedRotation norm
  • 算法分析与设计编程题 回溯法

    装载问题 题目描述 解题代码 递归回溯 goods i 表示货物i的重量 c1 c2分别表示货船1和货船2的载重量 vector
  • 关于项目报错Error:Cannot build Artifact :war exploded because it is included into a circular depency

    报个这个错的意思 你大概在编译项目的时候 你构建项目的时候 你点的是build project 而不是选择rebuild project 导致重复的依赖 这时候找到项目目录中的 idea目录 在进入artifacts文件目录 发现里面有两个
  • siammask_e 安装和使用

    基于siammask e的成绩 验证下demo效果 https paperswithcode com sota visual object tracking on vot2019 p fast visual object tracking
  • 值得拥有的5 款功能强大的免费 PDF 编辑器

    编辑 PDF 文件可能是一个真正的挑战 尤其是当您找不到合适的工具时 此外 如今大多数工具都需要大量订阅 这意味着您必须在口袋里烧一个洞才能对 PDF 文件进行更改 但是等等 这是一个转折点 有一些免费使用的 PDF 编辑器可以帮助您毫无后
  • 微信好友大数据分析

    微信好友数据分析 这里很多工作量 参考了该篇博客 在此致谢 传送门如下 一件有趣的事 我用 Python 爬了爬自己的微信朋友 不过原博客代码不是特别全 有些没有放出来 而且代码都是图片截图 比较模糊 所以我来整理一下我的代码 贴上来 同时
  • 【订阅消息】微信小程序发送服务通知

    前言 由于上次的公众号测试消息推送次数太多被官方认为是推销或者是广告之类的 被微信官方给禁了 然后偶然在一次吃饭的时候扫码点餐下单之后有个弹窗勾选订单完成通知 勾选之后就餐之后就会发送一个服务通知告诉您的订单已完成 其实基于这种消息提醒也是