微信公众号开发——向指定用户发送模板消息

news2024/11/30 6:43:26
😊 @ 作者: 一恍过去
💖 @ 主页: https://blog.csdn.net/zhuocailing3390
🎊 @ 社区: Java技术栈交流
🎉 @ 主题: 微信公众号开发——向指定用户发送模板消息
⏱️ @ 创作时间: 2022年12月14日

目录

  • 准备工作
  • 1、定义消息模板
  • 2、定义模板消息发送请求实体类
  • 3、定义订单模板消息实体雷
  • 4、配置RestTemplate请求
  • 6、请求工具类
  • 5、发送模板消息示例

准备工作

1、调用微信公众号接口,需要实现获取AccessToken,参考《获取AccessToken接口调用凭据》
2、在本地进行联调时,为让微信端能够访问到本地服务,需要进行内网穿透,参考《本地服务器内网穿透实现(NATAPP)》
3、配置微信接口配置信息,用于告诉微信接收消息的回调地址
在这里插入图片描述

1、定义消息模板

比如新增一个用于订单的模板消息:
在这里插入图片描述

订单编号:{{orderId.DATA}} 订单金额:{{amount.DATA}} 订单时间:{{time.DATA}}

2、定义模板消息发送请求实体类

SendMessageRep:

@EqualsAndHashCode(callSuper = true)
@Data
public class SendMessageRep extends BaseRep {
    /**
     * 接收者openid
     */
    private String touser;

    /**
     * 模板ID
     */
    private String template_id;

    /**
     * 模板跳转链接(海外帐号没有跳转能力),非必须
     */
    private String url;

    /**
     * 防重入id。对于同一个openid + client_msg_id, 只发送一条消息,10分钟有效,超过10分钟不保证效果。若无防重入需求,可不填
     */
    private String client_msg_id;

    /**
     * 跳小程序所需数据,不需跳小程序可不用传该数据,非必须
     */
    private Miniprogram miniprogram;

    /**
     * 模板数据
     */
    private OrderMessageDataRep data;

    /**
     * 跳小程序所需数据
     */
    @Data
    public class Miniprogram {
        /**
         * 所需跳转到的小程序appid(该小程序 appid 必须与发模板消息的公众号是绑定关联关系,暂不支持小游戏)
         */
        private String appid;

        /**
         * 所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar),要求该小程序已发布,暂不支持小游戏,非必须
         */
        private String pagepath;
    }
}

SendMessageDataRep:

@Data
public class SendMessageDataRep {
    /**
     * 模板数据
     */
    private String value;

    /**
     * 模板内容字体颜色,不填默认为黑色
     */
    private String color;
}

3、定义订单模板消息实体雷

业务实体类需要根据实际清情况进行定义

OrderMessageDataRep:

/**
 * @Description: 推送的订单数据,模板消息,具体字段根据定义的模块来设置
 * 订单编号:{{orderId.DATA}} 订单金额:{{amount.DATA}} 订单时间:{{time.DATA}}
 **/
@Data
public class OrderMessageDataRep {
    /**
     * 订单编号
     */
    private SendMessageDataRep orderId;

    /**
     * 订单金额
     */
    private SendMessageDataRep amount;

    /**
     * 订单时间
     */
    private SendMessageDataRep time;
}

4、配置RestTemplate请求

@Component
public class RestHttpRequest {

    private final RestTemplate restTemplate;

    public RestHttpRequest(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }
    
    public Map doHttp(String url, HttpMethod method, Object obj) {
        HttpHeaders headers = new HttpHeaders();
        HttpEntity entity = new HttpEntity(obj, headers);
        ResponseEntity<Map> exchange = restTemplate.exchange(url, method, entity, Map.class);
        return exchange.getBody();
    }
}

6、请求工具类

public class MapUtils {
    /**
     * 将Map参数转换为字符串
     *
     * @param map
     * @return
     */
    public static String mapToString(Map<String, Object> map) {
        StringBuffer sb = new StringBuffer();
        map.forEach((key, value) -> {
            sb.append(key).append("=").append(value.toString()).append("&");
        });
        String str = sb.toString();
        str = str.substring(0, str.length() - 1);
        return str;
    }

    /**
     * 将Bean对象转换Url请求的字符串
     *
     * @param t
     * @param <T>
     * @return
     */
    public static <T> String getUrlByBean(T t) {
        String pre = "?";
        Map<String, Object> map = entityToMap(t);
        return pre + mapToString(map);
    }
}

5、发送模板消息示例

说明:

//测试接口:/wechat/sendMsg(向指定用户发送模板消息)
//正常流程:用户在公众号进行操作(购物成功)后,向当前用户发送模板消息
//消息模板的定义如下:其中DATA为固定写法
订单编号:{{orderId.DATA}}
订单金额:{{amount.DATA}}
订单时间:{{time.DATA}}
//在推送完成后,微信服务器会向消息接口发送消息
//orderId、amount、time表示一个属性(名称任意),value为该属性的值,color为显示时的颜色
{	
           "touser":"OPENID",
           "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
           "url":"http://weixin.qq.com/download",       
           "data":{
                   "orderId": {
                       "value":"xxxxxxxxxx",
                       "color":"#173177"
                   },
					"amount": {
                       "value":"33.33元",
                       "color":"#F6067A"
                   },
					"time": {
                       "value":"2022-12-12 12:12:12",
                       "color":"#FF6931"
                   }
           }
}

示例代码 :

@Slf4j
@Controller
public class MessageController {
    /**
     * 发送模板消息
     * url和 miniprogram 都是非必填字段,若都不传则模板无跳转;
     * 若都传,会优先跳转至小程序。开发者可根据实际需要选择其中一种跳转方式即可。
     * 当用户的微信客户端版本不支持跳小程序时,将会跳转至url。
     */
    @PostMapping(value = "/sendMsg")
    @ApiOperation(value = "发送模板消息", notes = "发送模板消息")
    @ResponseBody
    public Map sendMsg() {
        String url = wxBean.getApiUrl() + InterfaceConstant.SEND_MSG;
        SendMessageRep rep = new SendMessageRep();
        rep.setAccess_token(weChantService.getAccessToken());
        url = url + MapUtils.getUrlByBean(rep);
        rep.setTouser("推送给具体用户的openId");
        rep.setTemplate_id("定义的模板Id");
        rep.setUrl("http://weixin.qq.com");
        rep.setClient_msg_id(UUIDUtils.getUuId());
        OrderMessageDataRep orderMessage = new OrderMessageDataRep();
        // 封装模板数据
        SendMessageDataRep orderId = new SendMessageDataRep();
        orderId.setValue(String.valueOf(System.currentTimeMillis()));
        orderId.setColor("#173177");
        orderMessage.setOrderId(orderId);
        SendMessageDataRep amount = new SendMessageDataRep();
        amount.setValue("3.33");
        amount.setColor("#F6067A");
        orderMessage.setAmount(amount);
        SendMessageDataRep time = new SendMessageDataRep();
        time.setValue("2022-12-12 12:12:12");
        time.setColor("#FF6931");
        orderMessage.setTime(time);
        rep.setData(orderMessage);
        return restHttpRequest.doHttp(url, HttpMethod.POST, rep);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/87623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ArrayList源码解析与相关知识点

ArrayList源码解析于相关知识点&#xff08;超级详细&#xff09; 文章目录ArrayList源码解析于相关知识点&#xff08;超级详细&#xff09;ArrayList的继承关系Serializable标记接口Cloneable标记接口RandomAccess标记接口AbstractList类属性构造函数无参构造函数指定初始容量…

网络工程毕业设计 SSM疫情期间医院门诊管理系统(源码+论文)

文章目录1 项目简介2 实现效果2.1 界面展示3 设计方案3.1 概述3.2 系统开发流程3.3 系统结构设计4 项目获取1 项目简介 Hi&#xff0c;各位同学好呀&#xff0c;这里是M学姐&#xff01; 今天向大家分享一个今年(2022)最新完成的毕业设计项目作品&#xff0c;【基于SSM的疫情…

测试人生 | 转行测试开发,4年4“跳”年薪涨3倍,我的目标是星辰大海(附大厂面经)!

image1080500 66.1 KB 编者按&#xff1a;本文来自霍格沃兹测试学院优秀学员 TesterC&#xff0c;**从运营岗位转行外包测试&#xff0c;再到测试开发&#xff0c;从待业在家到4年4“跳”进入 BAT 大厂&#xff0c;年薪涨了3倍&#xff01;**他是如何完成如此励志的华丽转身的…

12.4、后渗透测试--内网主机数据包流量嗅探

攻击主机&#xff1a; Kali 192.168.11.106靶机&#xff1a;windows server 2008 r2 192.168.11.134Metasploitable2-Linux&#xff1a; 192.168.11.105当成功获取目标机器的会话后&#xff0c;可以使用嗅探手段获取更多信息。前提&#xff1a;获得 meterpreter shell1、加载s…

centos7 安装 zsh + fzf(历史命令搜索神器)

文章目录zsh 安装用 oh-my-zsh 配置 zshfzf 安装结语zsh 安装 参考 用 yum 自动下载安装 zsh yum install -y zsh 安装完成后查看系统可以用的 shell cat /etc/shells 将 zsh 设置为系统默认 shell chsh -s /bin/zsh 退出终端重新登录 查看当前使用的shell echo $0 用 oh-my-z…

大二Web课程设计——美食网站设计与实现(HTML+CSS+JavaScript)

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

ArcGIS:按属性选择要素、按位置选择要素、空间和属性的组合查询;属性表中长度、面积等的量算

目录 01 说明 02 实验目的及要求 03 实验设备及软件平台 04 实验内容与步骤 4.1 由属性选择要素 4.2 由位置选择要素 4.3 查询四川省乐山市范围内的气象站点。 4.4 查询与乐山市相邻的地市州有哪些 4.5 计算四川省各个地市州的面积。 4.6 查询单一栅格或者多个栅格的不同方法。…

HTML+CSS篮球静态网页设计(web前端网页制作课作业)NBA杜兰特篮球运动网页

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

WPF入门第六篇 WPF的Binding

WPF的Binding 在传统的Windows软件中&#xff0c;大部分都是UI驱动程序的模式&#xff0c;也可以说事件驱动程序。WPF作为Winform的升级&#xff0c;它把UI驱动程序彻底改变了&#xff0c;核心回到了数据驱动程序的模式上面&#xff0c;这样&#xff0c;程序就回到了算法和数据…

[附源码]Python计算机毕业设计服装销售商城系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

【ESP8266-NodeMCU软硬串口通讯】

1. 前言 SoftwareSerial库允许在Arduino板的其他数字引脚上进行串行通信,使用软件复制功能(因此得名“SoftwareSerial”)。可以有多个软件串行端口,速度高达115200 bps。参数为需要该协议的设备启用反向信令。 1.1 要使用此库 请执行以下操作: #include <SoftwareS…

Prometheus的PromQL语法讲解和使用示例

目录1. PromQL介绍2. 基本用法2.1 查询时间序列2.2 范围查询2.3 时间位移操作2.4 聚合操作2.5 标量和字符串3. 表达式的合法格式4. PromQL操作符4.1 数学运算4.2 布尔运算4.3 集合运算符4.4 操作符优先级4.5 聚合操作1. PromQL介绍 PromQL提供对时间序列数据进行逻辑运算、过滤…

SpringBoot 配置文件

哈喽呀&#xff0c;你好呀&#xff0c;欢迎呀&#xff0c;快来看一下这篇宝藏博客吧~~~ 1. 配置文件的作用 对于Spring Boot项目而言,所有重要的数据都是在配置文件中配置的,比如: 项目的启动端口;数据库的连接信息(包含用户名和密码的设置);用于发现和定位问题的普通日志和异…

第09讲:路由开发

一、使用脚手架创建vue路由项目 项目的创建步骤参考&#xff1a; 在预设中选择Router 这里输入n&#xff0c;表示不使用history模式 选择In dedicated config files表示将配置分开存放 项目已经创建完成&#xff0c;使用VSCode打开&#xff08;部分win10 以上机型请用管理员…

[GO] 图书管理系统API

图书管理系统 1. 创建项目 2. 配置goproxy GOPROXYhttps://goproxy.cn 3. 添加格式化工具 4. 定义目录结构 |---- Readme.md //项目说明 |---- config // 配置文件(mysql配置,ip,端口,用户名,密码等) |---- controller // CLD服务入口,负责处理路由,参数校验,请求转发 |----…

缓存实现方式

为啥需要缓存&#xff1f; mysql关系型数据库&#xff0c;查询时需要磁盘IO&#xff0c;会消耗系统性能并且耗时&#xff0c;当数据变化量较小&#xff0c;并且响应要快的话&#xff0c;可以考虑使用缓存 服务端缓存方式有哪些&#xff1f; 服务端缓存方式&#xff1a; ①可以使…

git push/pull 超时问题解决

使用代理&#xff0c;发现git仓库浏览器可以访问到&#xff0c;但是本地 push/pull 时提示超时&#xff0c;这里提供一个方案供参考&#xff08;亲测有效&#xff09;&#xff1a; 修改系统的DNS为&#xff1a;114.114.114.114

基于java SSM框架的校园二手交易平台设计

一、项目介绍 游客&#xff1a;浏览商品&#xff0c;登录、注册 用户&#xff1a;浏览商品&#xff0c;发布&#xff0c;评论商品&#xff0c;我的订单&#xff0c;收藏&#xff0c;修改个人信息&#xff0c;搜索&#xff0c;回复评论 管理员&#xff1a;商品分类管理&#xff…

基于MATLAB开发AUTOSAR软件应用层模块-part13.AUTOSAR Dictionary-3 编辑AUTOSAR元素-SWC 和PORTS

配置SWC 此处可以配置SWC的名字和类型,类型包含: Application 应用组件 ComplexDiviceDriver 复杂驱动组件 EcuAbstraction ECU 抽象组件 SensorActuator 传感器执行器组件

学会python可以做哪些兼职?

前言 以我差不多四年的 Python 使用经验来看&#xff0c;大概可以按以下这些路子来赚到钱&#xff0c;但编程技能其实只是当中必不可少的一部分&#xff0c;搭配其它技能栈食用风味更佳。 1、爬虫 很多人入门 Python 的必修课之一一定是 Web 开发和爬虫&#xff0c;但这两项…