微信小程序消息推送

实现步骤:

  1. 申请消息模板
  2. 订阅对应模板消息
  3. 获取用户登入code
  4. 获取用户openId
  5. 获取access_token
  6. 进行消息推送

说明:

code是用户登录凭证(有效期五分钟)。

openid 是小程序用户唯一标识。

access_token是小程序全局唯一后台接口调用凭据。

实现效果:

具体实现:

1.申请消息模板
首先登入微信公众平台,选择自己的小程序,进入到小程序页面。
如图操作:

 

2.订阅对应模板消息
找到申请的模板,复制模板ID,小程序调用wx.requestSubscribeMessage接口订阅模板消息。
如图操作:


3.获取用户登入code
小程序调用wx.login接口获取用户code。
如图操作:


4.获取用户登入code

使用获取到的code调用后端用户授权接口获取用户openid。
官方接口文档:
auth.code2Session | 微信开放文档 (qq.com)
如图操作:

public UserAuthRes userAuth(String code) {
    Map<String, Object> requestParams = new HashMap<>();
    requestParams.put("appid", "wx4a6ad6d7e5e6xxxx"); //小程序appid
    requestParams.put("secret", "eb05b4885d3fbe18d46b1822fca7xxxx"); //小程序secret
    requestParams.put("js_code", code); //用户登入code
    requestParams.put("grant_type", "authorization_code"); //授权类型这里填写authorization_code


    UserAuthRes userAuthRes = restTemplate.getForObject("https://api.weixin.qq.com/sns/jscode2session?" +
            "appid={appid}&secret={secret}&js_code={js_code}&grant_type={grant_type}", UserAuthRes.class, requestParams);
    if (null != userAuthRes) {
        log.info("授权用户信息:{}", userAuthRes);
        //TODO 可以记录用户信息到mysql/redis(openid、session_key、unionid)备注:session_key 有效期为三天
        return userAuthRes;
    } else {
        throw new RuntimeException("用户授权失败");
    }
}

返回值结构:

public class UserAuthRes {
    private String openid; //用户唯一标识openid


    private String session_key; //用户会话密钥session_key


    private String unionid; //用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台帐号下会返回


    private String errcode; //错误码


    private String errmsg; //错误信息
}

5.获取access_token
后端调用接口传入appid、secret、grant_type获取access_token。
官方接口文档:
获取接口调用凭据 | 微信开放文档 (qq.com)
如图操作:

public String getUserAccessToken() {

    Map<String, Object> requestParams = new HashMap<>();
    requestParams.put("appid", "wx4a6ad6d7e5e6xxxx"); //小程序appid
    requestParams.put("secret", "eb05b4885d3fbe18d46b1822fca7xxxx"); //小程序secret
    requestParams.put("grant_type", "client_credential"); //授权类型这里填写client_credential

    JSONObject result = restTemplate.getForObject("https://api.weixin.qq.com/cgi-bin/token?grant_type={grant_type}&appid={appid}&secret={secret}", JSONObject.class, requestParams);
    if (null == result) {
        throw new RuntimeException("获取access token失败");
    }
    String accessToken = result.get("access_token").toString();
    if (StringUtils.isNoneBlank(accessToken)) {
        log.info("获取access token成功:{}", accessToken);
        return accessToken;
    } else {
        throw new RuntimeException("获取access token失败");
    }
}

6.进行消息推送
打开要要推送的模板详情,查看模板占位符、后端调用接口传入touser、template_id、data,进行消息推送。注意请求参数data里的属性名一定要与模板占位符保持一致!
官方文档:
subscribeMessage.send | 微信开放文档 (qq.com)
如图操作: 

 

  后端接口:

private void sendMessage() {

    MessageTemplateEntity messageTemplateEntity = new MessageTemplateEntity();
    String time = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date());
    messageTemplateEntity.setMessageData(new MessageValueEntity("项目名称"), new MessageValueEntity(time), new MessageValueEntity("这是描述"));

    Map<String, Object> paramsMap = new HashMap<>();
    paramsMap.put("touser", "wx4a6ad6d7e5e6xxxx"); //用户openid
    paramsMap.put("template_id", "h7eKu5vOSbbObOxg9psqYZ-NiRyiiPi9wMuWqExxxx"); //推送消息模板id
    paramsMap.put("data", messageTemplateEntity); //消息体:{{"thing1":"项目名称"},{"time2":"2022-08-23"},{"thing3":"这是描述"}}
    HttpHeaders headers = new HttpHeaders(); //构建请求头
    headers.setContentType(MediaType.APPLICATION_JSON); //设置内容类型为json
    HttpEntity<Map<String, Object>> request = new HttpEntity<>(paramsMap, headers); //构建http请求实体

    //发送请求路径拼接获取到的access_token
    SendMessageVo sendMessageVo = restTemplate.postForObject("https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" +
            "60_mrPc2IpScFl8b8a9fhsPVw4nbMxxxx...", request, SendMessageVo.class);

    if (null == sendMessageVo) {
        throw new RuntimeException("推送消息失败");
    }

    if (sendMessageVo.getErrcode() != 0) {
        log.error("推送消息失败,原因:{}", sendMessageVo.getErrmsg());
        throw new RuntimeException("推送消息失败");
    }
    log.info("推送消息成功");
}


MessageTemplateEntity实体类结构:

@Data
public class MessageTemplateEntity {

    private MessageValueEntity thing1;

    private MessageValueEntity time2;

    private MessageValueEntity thing3;

    public void setMessageData(MessageValueEntity thing1, MessageValueEntity time2, MessageValueEntity thing3) {
        this.thing1 = thing1;
        this.time2 = time2;
        this.thing3 = thing3;
    }

}


MessageValueEntity实体类结构:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class MessageValueEntity {

    private String value;
}


注意事项:
(1)本篇消息推送教学为一次性订阅消息,也就是订阅一次可以推送一次消息,不订阅推送消息会失败,长期订阅消息如有需要,请去小程序官方申请长期消息模板。
(2)推送消息data属性值格式一定要严格按照官方给的格式,不然会报错,47003错误码说明有某个字段为null或者格式不正确。如果不清楚可以去官方文档查看对应格式。
官方文档:
subscribeMessage.send | 微信开放文档

关于我们:
创作不易,如有问题、疑难杂症,欢迎评论区交流病情(包治百病)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340