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

article/2025/9/10 17:19:16

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

1.微信发消息流程

在这里插入图片描述

因为微信算是比较正式的社交软件,主动向用户发信息这个动作很容易被一些商家作为推销的手段,为了避免用户被骚扰所以就由用户直接来决定是否要接受该消息,这样设计很不错!

2.订阅消息

2.1 消息模板

发送消息必须使用微信小程序官方提供的消息模板。消息模板可以在微信公众号平台获取(前提是你得注册过了),如下图:
在这里插入图片描述
选好模板后,点击操作栏的选用按钮即可。如下图:
在这里插入图片描述

在这里插入图片描述

2.1.1 消息内容说明:

在这里插入图片描述

(1)模板id: 模板的唯一标识,微信小程序端服务器端都需使用,来确定使用那个模板。
(2)详细内容: 这里就是消息的内容,上图所示中的 温馨提示 就是标题,{{ting6.DATA}}就是值。

剩余模板中的内容都不重要,在此不作赘述。

2.2 消息类型

(1)一次性订阅:用户自主订阅后,可不限时间地下发一条对应的服务消息;每次订阅只能发送一条消息。

(2)长期订阅:用户订阅一次后,可长期下发多条消息。长期订阅对资质的要求很高,目前长期性订阅消息仅向政务民生、医疗、交通、金融、教育等线下公共服务开放,后期将逐步支持到其他线下公共服务业务。本文选用的时一次性订阅。

2.3 消息发送

(1)方法:wx.requestSubscribeMessage(Object object)(微信官方文档入口)该wx.requestSubscribeMessage()用在微信小程序端,用于调起订阅消息界面。如下图:
在这里插入图片描述

2.3.1 注意事项:

(1)触发方式: wx.requestSubscribeMessage(Object object)只能用于点击按钮触发。

(2)一次性消息: 在消息类型中提及到,一次性订阅消息在用户自主订阅后,只能发送一次消息。

3.前端端代码

3.1 前端代码

(1)前端Html代码:

  ...//由点击事件调出订阅消息界面<button bindtap="subScriptionMessage"></button>...

(2) 前端JS代码:

...
//调出 模板消息界面subScriptionMessage(){wx.requestSubscribeMessage({//模板id,可以写多个tmplIds:['sn12-c51f_1PCY52t0u5UZbqKaS7z4G7U1mV-4ZH']//成功回调success(res){console.log(res);},//失败回调fail(res){console.log(res);}})} 
...

3.2 后端代码

(1)代码

import lombok.extern.slf4j.Slf4j;//微信小程序idprivate final String appId = "xxx";//微信小程序密钥private final String appSecret = "xxx";//模板idprivate final String templateId = "xxx";//用户openidprivate final String openUserId = "xxxx";//消息内容-温馨提示private final String warmTip = "hello,tough gay!";//跳转页面地址private final String pageUrl = "pages/index/index";//获取token接口private final String getTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ appId + "&secret=" + appSecret;//发送消息接口private final String sendWxUserMsgUrl = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=";public void sendMessage(){//获取tokenString accessTokenResult = HttpClientUtil.doGet(getTokenUrl);String accessToken = JSONObject.parseObject(accessTokenResult).getString("access_token");SendMsgToWxUserRequestDTO sendMsgToWxUserRequestDTO = new SendMsgToWxUserRequestDTO();sendMsgToWxUserRequestDTO.setAccessToken(accessToken);sendMsgToWxUserRequestDTO.setTouser(openUserId);sendMsgToWxUserRequestDTO.setTemplate_id(templateId);JSONObject key = new JSONObject();//温馨提醒JSONObject thing6OfValue = new JSONObject();thing6OfValue.put("value",warmTip);key.put("thing6",thing6OfValue);//当前时间JSONObject time2 = new JSONObject();time2.put("value", DateUtil.dateToString(new Date(),DateUtil.DATETIME_FORMATTER));key.put("time2",time2);sendMsgToWxUserRequestDTO.setData(key);sendMsgToWxUserRequestDTO.setPage(pageUrl);String sendMessageUrl = sendWxUserMsgUrl + accessToken;log.info("发送消息参数:{}",JSONObject.toJSONString(sendMsgToWxUserRequestDTO));String s = HttpClientUtil.doPost(sendMessageUrl, JSONObject.toJSONString(sendMsgToWxUserRequestDTO));log.info("发送消息参数,返回值:{}",s);}

SendMsgToWxUserRequestDTO 类:

import com.alibaba.fastjson.JSONObject;
import lombok.Getter;
import lombok.Setter;@Getter
@Setter
public class SendMsgToWxUserRequestDTO {/*** token*/private String accessToken;/*** 接收方openId*/private String touser;private String template_id;private String page;/*** 小程序模板数据*/private Object data;private String miniprogram_state;
}

(2)发送消息效果:

在这里插入图片描述

3.2.1 步骤分解:

(1)调用获取token接口:

接口:

GET: https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APP_ID&secret=APP_SECRET

请求参数:

appidsecret
小程序id小程序密钥

参数说明:

appidsecret两个的值,可以在微信小程序后台找到。在这里插入图片描述

返回值:

access_tokenexpires_in
token值有效时间

(2)调用发送消息接口:

接口:

POST : https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=TOKEN

请求参数:

accessTokentousertemplate_idpagedata
token消息接收人消息模板id点击消息详情跳转页面消息内容

参数说明:

token: 通过步骤1获取

toUser:是微信用户的openId,在微信小程序登陆获取用户信息时可以拿到。

page:是点击消息进入小程序查看后跳转的页面。

在这里插入图片描述
data:是消息模板中的内容。需要注意消息模板中的内容都是以keyvalue的形式进行赋值并且展示的,拿下面的一个工作通知模板做例子:
在这里插入图片描述
我们可以看到该消息模板中的消息内容只有两个:温馨提示时间,分别对应的keything6time2

切记,key一定要保持和模板中的一致!!!

3.3 可能遇到的问题

3.3.1 参数不合法:

错误内容:

{"errcode":47003,"errmsg":"argument invalid! data.thing6.value invalid rid: 63904a7c-774dbdca-33bce62d"}

原因:

(1)消息模板中的值为空。凡是在消息模板中展示的字段都是必填的。
(2)代码中的key和目标中的不对应。
(3)key对应的value内容过长。

4.实际应用

通过上述介绍,我想大家对微信小程序发送模板消息有两个大概的认识。
我们知道用户同意订阅消息后,服务器端只能发一条消息给用户,后面如果想再次发送,还需要去询问用户是否订阅。那么如果我们想持续的给用户发消息呢?我们该如何应对这样的场景呢?

4.1 “总是保持以上选择”

在询问用户是否同意接收消息时,下方有个总是保持以上选择,如果用户勾选了,并点击确定,那么后面如果再次询问用户是否同意接收消息时,就不会弹出订阅消息界面
在这里插入图片描述

我们该如何判断用户勾选了保持以上选择呢?

可以通过微信小程序的wx.getSetting({})方法。这个方法会在勾选了保持以上选择后,会打印出模板id。所以我们需要在订阅界面成功回调方法中,判断下setting中是否包含模板id。
在这里插入图片描述

4.2 实现思路

  • 在后台数据库中给微信用户添加一个字段:check_flag表示,表示是否勾选 总是保持以上选择true:勾选了false:未勾选
  • wx.requestSubscribeMessage()成功回调方法中调用wx.setting()中判断用户是否勾选了总是保持以上选择
  • 如果是,修改check_flag=true
  • 微信小程序中必点击的地方,添加调用wx.requestSubscribeMessage()方法。
  • 如果check_flagtrue时调用wx.requestSubscribeMessage()

然后就可以实现用户在登陆界面点击一次发送多条消息给用户。如果用户不想再次接收消息。可以在我小程序右上角三个点设置中修改即可。

4.3 代码:


//在用户必点的地方,调用订阅消息方法
clickSubscribeMessage(){let flag = wx.getStorageSync('checkFlag');console.log(false);//订阅消息if(flag == 1){let workTaskTemplateId = app.globalData.workTaskTemplateId;wx.requestSubscribeMessage({tmplIds: [workTaskTemplateId],success(res){console.log(res);},fail(res){console.log(res);}})}}
...
//订阅消息subScriptionMessage(){var that = this;//模板idlet workTaskTemplateId = 'xxx';wx.requestSubscribeMessage({tmplIds: [workTaskTemplateId],success (res) { if(JSON.stringify(res).indexOf("reject") != -1){console.log("拒绝")} if(JSON.stringify(res).indexOf("accept") != -1){console.log("接受")wx.getSetting({withSubscriptions: true,success (res) {console.log(res.subscriptionsSetting)if(JSON.stringify(res.subscriptionsSetting).indexOf(workTaskTemplateId) != -1){console.log("用户选择了“保持以上选择”")that.checkFlag();}}})} },fail(res){console.log(res);}})},...//请求后台接口,修改check_flag checkFlag(){//请求后台修改check_flag 字段为truewx.request({url: 'xxxx',...success:function(res){//如果修改成功将check_status字段放到storage中wx.setStorageSync("checkFlag",true)},fail:function(res){},})}

如果大家有更好的方法请留言。上面截图例子来自于我做的一个微信小程序TaskPlan。链接如下,欢迎来参观:

☞ ☞ ☞ 人总会改变的,那为什么不往好处变呢?—— TaskPlan


http://chatgpt.dhexx.cn/article/O68dEeVY.shtml

相关文章

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

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

小程序模板消息

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

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

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

小程序无限插屏广告实现方法

大家好啊&#xff0c;最近突然想到一个问题&#xff0c;自己做为一个程序员&#xff0c;每天发的公众号文章和程序根本没半毛钱关系&#xff0c;靠分享一些破解软件浑浑度日&#xff0c;再这样下去恐怕要废。所以今天给自己技术群的狗子们分享一个小知识点&#xff0c;如何让你…

我做的小程序,昨天赚了 2.06 元广告费

我做的小程序&#xff0c;昨天赚了 2.06 元广告费 先看一下广告上线三天的收益&#xff0c;虽然不多&#xff0c;但很快乐hhh。 2020 年 6月接触了小程序云开发&#xff0c; 那时候还不太会写太复杂的小程序界面&#xff0c;于是就找了几个开源的框架改了改。 因为当时所处的行…

小程序流量主运营

个人和小微企业可通过小程序流量主进行变现&#xff0c;如果你擅长推广&#xff0c;有较多的粉丝那么小程序变现无疑是一种很好的收入渠道。小程序流量主的开通渠道门槛并不高——满1000人即可开通流量主。 那么我们运营什么样的小程序开通流量主进行流量变现呢&#xff1f;以…

Uni-app 小程序 APP 的广告变现之路:插屏广告

插屏广告 插屏广告组件是由客户端原生的图片、文本、视频控件组成的&#xff1b;一般来说&#xff0c;插屏广告可以实现比传统信息流广告和banner广告展现更大的广告尺寸&#xff0c;同样能够满足您对大量曝光和用户转化的需求。 平台差异说明 AppH5微信小程序支付宝小程序百…

小程序进入首页时弹出广告

项目需求&#xff0c;判断用户是否开通会员&#xff0c;没开通会员的话每次进入小程序弹出一个引导开通会员的弹窗&#xff0c;已经开通会员的不在弹 先看下效果图 wxml代码 <!-- 广告展示 --><view class"mask" hidden"{{showAd}}"><view…

uniapp 小程序 加载显示激励视频广告

uniapp激励广告文档&#xff1a;uni-app官网https://uniapp.dcloud.io/api/a-d/rewarded-video微信官网激励广告文档&#xff1a;激励视频广告 | 微信开放文档微信开发者平台文档https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/ad/rewarded-video-a…

微信 小游戏/小程序 广告组件被驳回 审核不通过

最近做微信小游戏开发&#xff0c;接入广告时遇到一些问题&#xff0c;被驳回了好几次。 相信大家接过微信小游戏或者小程序广告都晓得&#xff0c;接入很简单&#xff0c;不论是banner广告还是激励视频广告只要在合适的位置合适的时机去展示广告&#xff0c;都会顺利审核通过…

微信小程序添加激励式广告

目录 微信小程序创建项目配置底部导航栏 微信小程序滚动播放内容 微信小程序功能中心模块开发 微信小程序个人中心页面开发 微信小程序获取电话号码 微信小程序显示列表数据 微信小程序显示分页列表 微信小程序添加插屏广告 微信小程序添加激励式广告 最终效果可扫码查看 遇…

微信小程序添加插屏广告

目录 微信小程序创建项目配置底部导航栏 微信小程序滚动播放内容 微信小程序功能中心模块开发 微信小程序个人中心页面开发 微信小程序获取电话号码 微信小程序显示列表数据 微信小程序显示分页列表 微信小程序添加插屏广告 微信小程序添加激励式广告 最终效果可扫码查看 遇…

小程序banner广告和激励广告

小程序banner广告和激励广告 1、小程序banner广告 1.1、先要在小程序公众后台获取广告位ID 代码片 <view class"empty"><ad unit-id"广告id"></ad></view>注意事项&#xff1a; Banner 广告不允许直接设置样式属性&#xff0c;…

小程序也能接广告了,微信小程序广告位投放指南!

小程序也能接广告了&#xff0c;微信小程序广告位投放指南! 3月15日消息&#xff0c;据爆料&#xff0c;微信已经开始秘密测试在小程序中投放广告&#xff0c;并且流传出了一份《微信小程序广告位投放指引》&#xff0c;意味着微信小程序已经准备开启广告投放权限。面向10亿用户…

做了个小程序,广告收益2.60元广告费

呜呜呜&#xff0c;做了个小程序&#xff0c;广告收益好少啊&#xff01; 第一天投放&#xff0c;曝光了一千多&#xff0c;只有两块的收益ecmp好低&#xff01;&#xff01;&#xff01; 这收入实在太低了&#xff0c;一千多的曝光量才两块哎 用的banner和视频广告两个 视频…

小程序流量主申请,如何增加小程序广告的点击率?

小程序开发者千千万&#xff0c;真正赚$的却没有多少&#xff0c;尤其是像我这种个人业余开发者。不过&#xff0c;有想法不去实现一把总会觉得心有不甘&#xff0c;送大家一句话&#xff1a;为道者&#xff0c;虽千万人吾往矣&#xff01; 相信大多数小程序开发者和我一样&am…

小程序设置激励广告

1、申请好广告&#xff0c;获取广告代码 2、在要放广告的wxml页面&#xff0c;放入点击弹出激励广告按钮 <view wx:if"{{isshow 0}}" bindtap"adshow" style"text-align: center;background-color: #F8F8F8;height: 70rpx;margin-top: 34rpx;lin…

微信小程序——添加广告

微信小程序——添加广告 要想在微信小程序中加入广告&#xff0c;首先要在微信小程序后台开通流量主 流量主需要满足&#xff1a;1、累计独立访问&#xff08;uv)不低于1000&#xff1b;2、有严重违规的小程序不与开通。 广告主要有&#xff1a;banner广告、激励视频广告、卡…

微信小程序广告接入

个人推荐: &#x1f4e2;&#x1f4e2;&#x1f4e2; 前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下 "通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。点击跳转到教程。 1.广告接入 前天看了看以前写的微信小程序&am…

小程序中插入广告

一、小程序广告种类简介&#xff1a; 小程序流量主可开通广告位包括&#xff1a;小程序Banner广告位、激励式广告位、视频前贴广告位&#xff08;仅限非游类目小程序&#xff09;、视频广告&#xff08;仅限非游类目小程序&#xff09;、小程序格子广告、小程序原生模板广告。…