微信公众号订阅通知,【一次性订阅】

2025-05-10 10:34:38 世界杯2019

首先

设置订阅功能:服务号可以在图文消息、网页等场景设置订阅功能。下发条件:用户在前述场景主动订阅后,服务号可通过接口向用户发送订阅通知,如信用卡动账提醒、物流到货通知等。下发位置:对已关注服务号的用户,通知下发到号内,未关注的下发到服务通知。跳转能力:可以跳转到公众号图文消息、网页和小程序。通知类型:分为一次性订阅和长期订阅——

一次性订阅,指用户订阅一次,服务号可不限时间地下发一条对应的订阅通知;长期订阅,指用户订阅一次,服务号可长期多次下发通知,长期订阅通知仅向政务民生、医疗等公共服务领域开放。

首先,本人第一次接触公众号,对公众号后台不熟悉,有几个注意点:

1.公众号的服务找半天,一般在公众号后台,点击新的功能,就能看到已开通和未开通的,首先,需要确保微信认证,并且开通公众号,不然她不会显示订阅通知这些服务,一般是在这(我的已经开通了):

2. 然后我们需要根据订阅通知文档操作,开通,选用模版等

文档地址:订阅通知 / 订阅通知介绍 (qq.com)

根据文档,我们查看订阅通知的详情 > 公共模版 > 选择模版 > 选择关键字并提交

这几个步骤有几个注意的点

(1)在选用公共模版之前,我们需要通过设置服务类目查看我们的服务类目是否通过并状态不是已失效,如果失效,我们可以通过公众号管理员身份进行添加,以下是服务类目的链接能查看分类及其资质要求:

订阅通知 / 服务类目 (qq.com)

(2)在选择公共模板的时候需选择我们服务类目未失效且已通过的,比如我这里,我的软件服务提供商就已经失效了,而信息查询是新添加的状态为已通过。

3.我们根据订阅通知的接口来写代码:

基础消息能力 / 公众号一次性订阅消息 (qq.com)

(1)

com.github.binarywang

weixin-java-mp

3.2.0

public static void main(String[] args) {

// 配置公众号信息

WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();

wxStorage.setAppId("appId");

wxStorage.setSecret("secret");

wxStorage.setTemplateId("一次性授权模板ID");

// 服务

WxMpService wxMpService = new WxMpServiceImpl();

wxMpService.setWxMpConfigStorage(wxStorage);

WxMpSubscribeMsgService subscribeMsgService = new WxMpSubscribeMsgServiceImpl(wxMpService);

// 切记这里跳转路径和reserved微信这个类已经帮我们UrlEecode过了不需要二次,本人就在这栽过跟头

String res = subscribeMsgService.subscribeMsgAuthorizationUrl("跳转的路径", scene, "reserved");

System.out.println(res);

}

开发者id

一次性订阅消息的id是这个

还有域名的话也是需要根据文档上的要求设置业务域名

这里我们会得到一个链接,

让用户在手机微信端打开如下链接信息,替换下方内容即可。

https://mp.weixin.qq.com/mp/subscribemsg?action=get_confirm&appid=公众号的APPID&scene=1000&template_id=订阅通知的模板ID&redirect_url=重定向的地址&reserved=test#wechat_redirect

我们可以引导客户在微信打开,在微信打开后是这样的:

(2)我们可以通过我们传的域名这个跳转拿到我们想要的数据

发送订阅通知消息。详情可见官方文档。

用户授权完成,即可调接口发送订阅通知一次。

http请求方式: post

https://api.weixin.qq.com/cgi-bin/message/template/subscribe?access_token=ACCESS_TOKEN

// 请求的API地址

String url = "https://api.weixin.qq.com/cgi-bin/message/template/subscribe";

// API token

String accessToken = "accessToken 微信也有接口可以拿到";

// 准备内容数据 --消息主体内容

Map data = Maps.newHashMap();

data.put("content", Maps.immutableEntry("value", "test\123\123"));

// 准备请求数据

Map req = Maps.newHashMap();

req.put("touser", "发送用户的open_id"); //必须

req.put("template_id", "第一步里授权模板ID"); //必须

req.put("title", "我是标题"); //必须

req.put("scene", "1000"); //必须 不传的话 也会出现43101 user refuse to accept the msg

req.put("miniprogram", Maps.immutableEntry("appid", "自己的小程序APPID")); //非必须

req.put("data", data); //必须

// 发送请求

String sendRes = HttpUtil

.createPost(url + "?access_token=" + accessToken)

.body(JSONObject.toJSONString(req)).execute().body();

System.out.println(sendRes);

// 正常返回结果{ "errcode":0, "errmsg":"ok" }

以下是我拿access_token的代码,详情见官网文档:开始开发 / 获取 Access token (qq.com)

String accessTokenRequestUrl = WxUrlConstant.ACCESS_TOKEN_URL + "?grant_type=client_credential&appid="+ "你的 APP_ID "+"&secret=" + "你的 APP_SECRET";

String tokenResponse = HttpUtil.get(accessTokenRequestUrl);

JSONObject jsonObj = JSONObject.parseObject(tokenResponse);

if (Objects.nonNull(jsonObj.get("access_token"))){

String access_token = jsonObj.get("access_token").toString();

}

System.out.println("tokenResponse = " + tokenResponse);