微信小程序-发消息

一、引言

        作者开发《目的地到了》的时候需要给用户发消息,一开始用了消息模板,后面上真机才发现微信把这个给取消掉了。后面通知用户都是通过订阅消息

二、前端

        调用wx的api,要把模板id传进去,如果用户没有点击过同意会弹出弹窗提示用户,正常如果不是选择一直同意就只能发一次。

wx.requestSubscribeMessage({
            tmplIds: ['**'],
            success(res) {
            }
        })

三、后端

1、pom

        首先要引入微信小程序的包,基于weixin-java-miniapp调用微信的api

<dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-miniapp</artifactId>
            <version>4.1.0</version>
        </dependency>

2、配置

        要在微信小程序申请模板,然后配置模板编号

# 微信模版通知配置
    # 微信模版用于通知客户或者运营者,注意配置格式;template-name,template-templateId 请参考 NotifyType 枚举值
notify:
    wx:
      enable: true
      template:
        - name: **
          templateId: **

3、订阅消息通知类

public class WxMessageSender {
    @Autowired
    private WxMaService wxMaService;

    /**
     * 发送微信消息(模板消息),不带跳转
     *
     * @param touser    用户 OpenID
     * @param templatId 模板消息ID
     * @param parms     详细内容
     */
    public void sendWechatMsg(String touser, String templatId, String[] parms) {
        sendMsg(touser, templatId, parms, "", "", "");
    }

    /**
     * 发送微信消息(模板消息),带跳转
     *
     * @param touser    用户 OpenID
     * @param templatId 模板消息ID
     * @param parms     详细内容
     * @param page      跳转页面
     */
    public void sendWechatMsg(String touser, String templatId, String[] parms, String page) {
        sendMsg(touser, templatId, parms, page, "", "");
    }

    private void sendMsg(String touser, String templatId, String[] parms, String page, String color,
                         String emphasisKeyword) {

        WxMaSubscribeMessage msg = new WxMaSubscribeMessage();
        // 要推送的用户openid
        msg.setToUser(touser);
        msg.setTemplateId(templatId);
        msg.setPage(page);
        msg.setData(createMsgData(parms));


        try {
            wxMaService.getMsgService().sendSubscribeMsg(msg);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private List<WxMaSubscribeMessage.MsgData> createMsgData(String[] parms) {
        List<WxMaSubscribeMessage.MsgData> dataList = new ArrayList<>();
        WxMaSubscribeMessage.MsgData data1 = new WxMaSubscribeMessage.MsgData();
        data1.setName("thing3");
        data1.setValue(parms[0]);
        dataList.add(data1);

        WxMaSubscribeMessage.MsgData data2 = new WxMaSubscribeMessage.MsgData();
        data2.setName("thing4");
        data2.setValue(parms[1]);
        dataList.add(data2);

        return dataList;
    }
}

4、通知处理类

public class NotifyService {

	private WxMessageSender wxMessageSender;
	private List<Map<String, String>> wxTemplate = new ArrayList<>();

	public boolean isWxEnable() {
		return wxMessageSender != null;
	}


	/**
	 * 微信模版消息通知,不跳转
	 * <p>
	 * 该方法会尝试从数据库获取缓存的FormId去发送消息
	 *
	 * @param touser
	 *            接收者openId
	 * @param notifyType
	 *            通知类别,通过该枚举值在配置文件中获取相应的模版ID
	 * @param params
	 *            通知模版内容里的参数,类似"您的验证码为{1}"中{1}的值
	 */
	@Async
	public void notifyWxTemplate(String touser, NotifyType notifyType, String[] params) {
		if (wxMessageSender == null)
			return;

		String templateId = getTemplateId(notifyType, wxTemplate);
		wxMessageSender.sendWechatMsg(touser, templateId, params);
	}


	private String getTemplateId(NotifyType notifyType, List<Map<String, String>> values) {
		for (Map<String, String> item : values) {
			String notifyTypeStr = notifyType.getType();

			if (item.get("name").equals(notifyTypeStr))
				return item.get("templateId");
		}
		return null;
	}

	public void setWxMessageSender(WxMessageSender wxMessageSender) {
		this.wxMessageSender = wxMessageSender;
	}

	public void setWxTemplate(List<Map<String, String>> wxTemplate) {
		this.wxTemplate = wxTemplate;
	}

}

四、模板申请

        要到小程序的订阅消息申请模板

a7ca716bc6b84e538a9921fe3d8c7525.png

        基本都是一次性消息,长期消息有特殊的要求,审核很难过得去        

c470dc5872e14935b489bc895a96260c.png

         点击选用然后选择要使用的关键词,发消息的时候填充这些关键词

9edfb06d29c44af194aec096bf075fdb.png

五、效果 

21251eb5a6f544278427baeacd3501cc.png

六、总结 

        微信小程序都是微信的规则,社区能看到模板消息被下掉换成订阅消息的时候,大家都是一片骂声,但是还得咬牙切换。

        只能说规则日新月异,持续研究吧。有兴趣的同学可以关注微信公众号:胖当当技术,跟作者交流分享。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多人群聊代码

服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []args){try{…

MTK平台如何debug A2DP 卡音问题

一 听auido文件 卡音问题首先要听以下3个部分的audio文件 1 .auido dump中的af_mixer_write_pcm_xxx.wav,这是auido传 给A2DP的源文件,如果这里有卡音,可以转给auido的人check • track是AudioTrack送到AudioFlinger的聲音 • mixer_pcm是AudioFlinger處理過程中的聲音 •…

Java多线程技术二:线程间通信——InheritableThreadLocal的使用

1 概述 使用InheritableThreadLocal可以在子线程中取得父线程继承下来的值。 2 ThreadLocal类不能实现值的继承 public class Tools {public static ThreadLocal t1 new ThreadLocal(); } public class ThreadA extends Thread{Overridepublic void run(){try {for (int i…

功能测试,接口测试,自动化测试,压力测试,性能测试,渗透测试,安全测试,具体是干嘛的?

软件测试是一个广义的概念&#xff0c;他包括了多领域的测试内容&#xff0c;比如&#xff0c;很多新手可能都听说&#xff1a;功能测试&#xff0c;接口测试&#xff0c;自动化测试&#xff0c;压力测试&#xff0c;性能测试&#xff0c;渗透测试&#xff0c;安全测试等&#…

【Python】流畅!一个非常好用的网络数据采集工具!

文章目录 前言一、注册二、初窥三 数据集四 自定义网站网络爬虫总结 前言 你是否曾为获取重要数据而感到困扰&#xff1f;是否因为数据封锁而无法获取所需信息&#xff1f;是否因为数据格式混乱而头疼&#xff1f;现在&#xff0c;所有这些问题都可以迎刃而解。让我为大家介绍…

2023年12月实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先&#xff0c;来看下效果图 在线体验地址&#xff1a;https://geojson.hxkj.vip&#xff0c;并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

docker的基本管理和概念

docker是什么&#xff1f; docker是开源的应用容器引擎。基于go语言开发的。运行在Linux系统中的开源的轻量级的“虚拟机”。 docker的容器技术可以在一台主机上轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器 docker的宿主机是linux系统。集装箱可以理解为相互…

Java简易版:UDP协议实现群聊

要先 运行服务端&#xff0c;在运行客户端&#xff0c;否则会报错。 服务端&#xff1a; package 二十一章;import java.io.*; import java.net.*; import java.util.ArrayList; public class T{public static ServerSocket server_socket;public static ArrayList<Socket…

EasyX图形化学习

1.EasyX是什么&#xff1f; 是基于Windows的图形编程&#xff0c;给用户提供函数接口&#xff0c;最终函数调用会由Windows的API实现。 注&#xff1a;EasyX只适配 c 。 2.头文件&#xff1a; <easyx.h>---只包含最新的函数 <graphics.h>---包含<easyx.h&g…

Vue3整合Element Plus过程

Vue 是一种流行的JavaScript框架&#xff0c;用于构建交互式和现代化的Web应用程序。Vue 3是Vue框架的最新版本&#xff0c;带来了新特性和改进。而Element Plus是一个基于Vue框架的UI组件库&#xff0c;它提供了丰富的UI组件和样式&#xff0c;能够帮助我们快速构建出漂亮且功…

Towards High-Quality and Efficient Video Super-Resolution via

code:coulsonlee/STDO-CVPR2023: [CVPR2023] Towards High-Quality and Efficient Video Super-Resolution via Spatial-Temporal Data Overfitting (github.com) 随着深度卷积神经网络&#xff08;DNN&#xff09;在计算机视觉的各个领域得到广泛应用&#xff0c;利用DNN的过…

ShellShock(CVE-2014-6271)

漏洞简介 GNU Bash 4.3及之前版本在评估某些构造的环境变量时存在安全漏洞&#xff0c;向环境变量值内的函数定义后添加多余的字符串会触发此漏洞&#xff0c;攻击者可利用此漏洞改变或绕过环境限制&#xff0c;以执行Shell命令。某些服务和应用允许未经身份验证的远程攻击者提…

电商早报 | 12月7日| 阿里巴巴分红179亿,破历史记录

阿里巴巴将派发25亿美元年度股息 12月6日消息&#xff0c;阿里巴巴发布公告&#xff0c;将向截至2023年12月21日香港时间及纽约时间收市时登记在册的普通股持有人和美国存托股持有人&#xff0c;就2023财年首次派发年度股息&#xff0c;金额分别为每股普通股0.125美元或每股美…

【EI会议征稿中】2024年第四届数字信号与计算机通信国际学术会议(DSCC 2024)

2024年第四届数字信号与计算机通信国际学术会议&#xff08;DSCC 2024&#xff09; 2024 4th International Conference on Digital Signal and Computer Communications 第四届数字信号与计算机通信国际会议(DSCC 2024)将于2024年4月12日至14日在中国-香港举行。DSCC 2024旨…

MATLAB机器人对偏导数、雅克比矩阵、行列式的分析与实践

偏导数、雅克比矩阵、行列式都是非常重要的知识点&#xff0c;为了让大家更容易看懂&#xff0c;尽量使用画图来演示。 1、偏导数Partial derivative 对于导数我们已经很清楚了&#xff0c;某点求导就是某点的斜率&#xff0c;也就是这点的变化率。那么偏导数是什么&#xff…

抖去推微信小程序版:短视频矩阵系统视频剪辑+无人直播

短视频矩阵获客工具的出现&#xff0c;给矩阵号的管理及运营带来了极大的便利&#xff0c;大家可以批量生成作品&#xff0c;并且可以实现自动发布&#xff0c;极大的节省了人力物力。 然而&#xff0c;对于中小商家来说虽然很想购买一套这样的系统&#xff0c;但考虑到费用较高…

外贸平台自建站的教程?做海洋建站的好处?

外贸平台自建站怎么做&#xff1f;搭建网站的具体流程有哪些&#xff1f; 作为外贸从业者&#xff0c;借助互联网平台自建站点已经成为推广业务、拓展市场的一种重要手段。海洋建站将为您提供一份详尽的外贸平台自建站的教程&#xff0c;助您在网络空间中展现您的企业魅力。 …

备战2024年1月AMC8美国数学竞赛新方式:刷在线真题集(附资源)

今天是2023年12月7日&#xff0c;距离暂定于2024年1月19日举办的AMC8美国数学竞赛的举办日期还有42天&#xff0c;有志于尽早出国留学&#xff0c;或者小升初冲击名校的孩子们相信已经在如火如荼地利用课余时间上辅导班或者自学。 为了帮助大家提高备考2024年1月份AMC8竞赛的效…

QxOrm 如何自定义主键?

默认情况下QxOrm的主键是long类型自增的&#xff0c;但是有时候我们不想使用这个主键&#xff0c;想使用比如string类型的主键。 可以使用QX_REGISTER_PRIMARY_KEY宏定义另一种类型&#xff08;例如&#xff0c;QString 类型&#xff09;的唯一 id&#xff08;主键&#xff09…