前言:
公众号模板消息推送,只有认证后的服务号(订阅号无模板消息发送功能)才可以申请模板消息的使用权限。
※:另外一定要进行认证,才允许申请模板消息。(认证费300元,认证流程参考官方文档)
如需小程序关联服务号推送模板消息还需要以下准备
- 小程序应用编号和秘钥
- 服务号应用编号和秘钥
- 小程序与服务号绑定在同一个微信开发平台
- 小程序、服务号、微信平台三者都要认证
- 获取服务号的access_token
- 获取已关注服务号的所有用户的openId
- 获取已关注用户的用户信息
- 小程序登录时获取用户的unionId
- 服务号的模板消息推送
- applet关联数据库设计
样例:
使用规则:
- 所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,但只有认证后的服务号才可以申请模板消息的使用权限并获得该权限;
- 需要选择公众账号服务所处的2个行业,每月可更改1次所选行业;
- 在所选择行业的模板库中选用已有的模板进行调用;
- 每个账号可以同时使用25个模板。
- 当前每个账号的模板消息的日调用上限为10万次,单个模板没有特殊限制。【2014年11月18日将接口调用频率从默认的日1万次提升为日10万次,可在MP登录后的开发者中心查看】。当账号粉丝数超过10W/100W/1000W时,模板消息的日调用上限会相应提升,以公众号MP后台开发者中心页面中标明的数字为准。
关于接口文档:
- 模板消息调用时主要需要模板ID和模板中各参数的赋值内容;
- 模板中参数内容必须以".DATA"结尾,否则视为保留字;
- 模板保留符号""。
申请步骤:
第一步:在功能 → 添加功能插件处申请模板消息使用权限。
第二步,选择公众账号服务所处的两个行业,每月可更改一次所选行业。
第三步,在所选择行业的模板库中选用已有的模板进行调用(调用详见接口文档)。
第四步,管理该账号自己选用的模板(每个账号可以同时使用10个模板)。 ※ 模板id发送消息的时候会用到
对于模板消息,腾讯提供了很多的消息模板进行选择,基本上涵盖当前大部分的消息提醒需求,直接按照内容进行搜索添加就可以,如果当前的业务消息提醒确定没有也可以进行添加,审核通过后会添加到模板库中,所有开发者都能使用
自定义添加模板消息入口(先搜索,搜索不到才会显示入口):
添加模板消息发送接口:
1.1 获取权限AccessToken
- 公众号支持的接口基本上都需要权限认证,所以首先要获取AccessToken.获取方式如下:
public String getWxgAccessToken() {
// 服务号的appid以及秘钥
String appid="服务号的appid";
String Wxgsecret="服务号的秘钥";
String requestUrl = StrUtil.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}", appid, Wxgsecret);
String returnMsg = HttpUtil.get(requestUrl);
cn.hutool.json.JSONObject responseJsonObject = JSONUtil.parseObj(returnMsg);
if(ObjectUtil.isNull(responseJsonObject)) throw new Exception("响应异常:获取信息为空!");
String accessToken = responseJsonObject.getStr("access_token");
return accessToken;
}
请求发送使用hutool中的HttpUtil,引入的依赖如下:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.2.2</version>
</dependency>
1.2获取要发送的用户的openId
使用官方在线的接口文档,获取方式如下:
官方文档中有获取关注公众号的所有用户信息接口.调用入口如下:
其中的openId中会显示所有关注公众号的用户openId.
1.3 给指定用户发送消息
请求参数:
public class WxgMessageDto {
// 消息接收者openId
@NotBlank(message = "微信公众平台不允许为空!")
private String openId;
// 认证token
@NotBlank(message = "accessToken不允许为空!")
private String accessToken;
// 省略get/set
控制层:
@PostMapping("/sendWxgMessage")
public ApiResult sendWxgMessage(@RequestBody @Validated WxgMessageDto wxgMessageDto) throws Exception {
smallProgressService.sendWxgMessage(wxgMessageDto);
return ApiResult.ok();
}
发送消息具体逻辑:
public void sendWxgMessage(WxgMessageDto wxgMessageDto) {
// 组装消息内容
String templateId="模板id"; // 模板id
String url="https://www.baidu.com/"; // 跳转路径(小程序之外)
String appid=""; // 小程序appid
String pagepath=""; // 小程序跳转路径
String client_msg_id=""; // 防重入id
String first="朋友,****通知待查收"; // 副标题
String keyword1=""; // 关键词1
String remark="更多详情信息请点击查看"; // 备注
String keyword1Value="阿里巴巴****"; // 信息
String keyword2Value="****"; // 信息
String keyword3Value="152****3986"; // 信息
String keyword4Value="总想把世界上最好的给你,却发现世界上最好的是你.........."; // 信息
String color=""; // 颜色
String messageStr="{\n" +
" \"touser\":"+"\""+wxgMessageDto.getOpenId()+"\""+",\n" +
" \"template_id\":"+"\""+templateId+"\""+",\n" +
" \"url\":"+"\""+url+"\""+", \n" +
" \"miniprogram\":{\n" +
" \"appid\":"+"\""+appid+"\""+",\n" +
" \"pagepath\":"+"\""+pagepath+"\""+"\n" +
" },\n" +
" \"client_msg_id\":\"MSG_000001\",\n" +
" \"data\":{\n" +
" \"first\": {\n" +
" \"value\":"+"\""+first+"\""+",\n" +
" \"color\":\"#173177\"\n" +
" },\n" +
" \"keyword1\":{\n" +
" \"value\":"+"\""+keyword1Value+"\""+",\n" +
" \"color\":\"#173177\"\n" +
" },\n" +
" \"keyword2\": {\n" +
" \"value\":"+"\""+keyword2Value+"\""+",\n" +
" \"color\":\"#173177\"\n" +
" },\n" +
" \"keyword3\": {\n" +
" \"value\":"+"\""+keyword3Value+"\""+",\n" +
" \"color\":\"#173177\"\n" +
" },\n" +
" \"keyword4\": {\n" +
" \"value\":"+"\""+keyword4Value+"\""+",\n" +
" \"color\":\"#173177\"\n" +
" },\n" +
" \"remark\":{\n" +
" \"value\":"+" \""+remark+"\""+",\n" +
" \"color\":\"#173177\"\n" +
" }\n" +
" }\n" +
" }";
// 发送消息
String accessToken=wxgMessageDto.getAccessToken();
String returnMsg = HttpUtil.post(StrUtil.format("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={}", accessToken), messageStr);
cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(returnMsg);
String errmsg = jsonObject.getStr("errmsg");
if(!StrUtil.equals("ok",errmsg)) throw new BusinessException("消息发送失败!");
}
※ 请求参数拼接直接使用的是官方给出的请求示例, 传参 需要进行引号的转义.
1.4.移动端查看是否接收到已发送消息
测试发送消息接口:
查看消息接收情况:
以上为公众号(服务号)消息推送, 待更新...