前言

    由于上次的公众号测试消息推送次数太多被官方认为是推销或者是广告之类的,被微信官方给禁了,然后偶然在一次吃饭的时候扫码点餐下单之后有个弹窗勾选订单完成通知,勾选之后就餐之后就会发送一个服务通知告诉您的订单已完成,其实基于这种消息提醒也是现在最常见的消息提醒方式之一。

一、什么是消息推送

小程序订阅消息
功能介绍

消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验

  • 订阅消息推送位置: 服务通知
  • 订阅消息下发条件: 用户自主订阅
  • 订阅消息卡片跳转能力: 点击查看详情可跳转至该小程序的页面

二、整体展示

  订阅 和 推送

 

java 微信小程序给用户发送订阅消息_微信小程序

 

java 微信小程序给用户发送订阅消息_java 微信小程序给用户发送订阅消息_02

三、实现步骤

3.1 小程序开通订阅消息申请模板消息

java 微信小程序给用户发送订阅消息_json_03

java 微信小程序给用户发送订阅消息_小程序_04

 四、后台代码实现

4.1获取权限AccessToken:

/**
 * @author rwy
 * @Title:
 * @Package
 * @Description:
 * @date 2023-07-21 9:30
 */
public class WeChatUtil {
    //appId和secret 在小程序开发管理页面

    //微信小程序appId
    @Value("${wx.xcx.appId")
    private String appId;

    //微信小程序secret
    @Value("${wx.xcx.appSecret")
    private String appSecret;

    /**
     * 请求微信接口服务,获取小程序全局唯一后台接口调用凭据(access_token)
     * @param appid
     * @param secretKey
     * @return
     */
    public static JSONObject  getAccessToken(String appid, String secretKey) {
        String result = null;
        try {
            String baseUrl = "https://api.weixin.qq.com/cgi-bin/token";
            HashMap<String, Object> requestParam = new HashMap<>();
            // 小程序 appId
            requestParam.put("grant_type", "client_credential");
            // 小程序唯一凭证id appid:(换成自己的)
            requestParam.put("appid", appid);
            // 小程序 appSecret(小程序的唯一凭证密钥,换成自己的)
            requestParam.put("secret", secretKey);
            // 发送GET请求读取调用微信接口获取openid用户唯一标识
            result = HttpUtil.get(baseUrl, requestParam);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return JSONUtil.parseObj(result);
    }
}

4.2请求发送使用hutool中的HttpUtil,引入的依赖如下:

<dependency>
       <groupId>cn.hutool</groupId>
       <artifactId>hutool-all</artifactId>
       <version>5.2.4</version>
   </dependency>

4.3发送消息具体逻辑:

@PostMapping("/program")
    public Result<?> program(){
        log.info("发微信小程序消息模板");

        // 接口调用凭证:accessToken
        String accessToken = weChatUtil.getAccessToken();
        System.out.println(accessToken);
        String weChatUrl = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken;

        // 构建请求参数
        Map<String, Object> params = new HashMap<>();
        // 用户openId
        params.put("touser","og2qF64Sx8ZoEuxWKsxxxxxxxxxx");
        // 模板Id
        params.put("template_id","hXCYU9OvCxYcJpc3iVzwtORGaxxxxxxxxxxxx");
        // 点击消息跳转地址
        params.put("page","/pagesC?sceneId=1");
        // 跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
        params.put("miniprogram_state","trial");
        // 进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN
        params.put("lang","zh_CN");

        // 封装参数
        Map<String, Object> data = new HashMap<>();
        Map<String, Object> thing3 = new HashMap<>();
        thing3.put("value","xxxx");
        data.put("thing3",thing3);

        Map<String, Object> time4 = new HashMap<>();
        time4.put("value", "12:00");
        data.put("time4", time4);

        Map<String, Object> thing5 = new HashMap<>();
        thing5.put("value", "已生成");
        data.put("thing5", thing5);

        params.put("data",data);

        // 执行请求
        String jsonSting= HttpUtil.post(weChatUrl, new JSONObject(params).toString());
        System.out.println(jsonSting);

        return Result.OK(jsonSting);
    }

请求与返回示例:

// 请求示例
{
  "touser": "xxxxxxx",
  "template_id": "TEMPxxxxLATExxx_ID",
  "page": "index",
  "miniprogram_state":"developer",
  "lang":"zh_CN",
  "data": {
      "thing3": {
          "value": "sdads"
      },
      "time4": {
          "value": "12:00"
      },
      "thing5": {
          "value": "xxxx"
      }
      
  }
}


// 返回参数
{
    "errcode":0,
    "errmsg":"ok"
}

发送订阅消息 | 微信开放文档