一、准备工作;

需要微信小程序的appid、secretid,在小程序的开发平台上配置相应模板。传入对应的小程序用户openid。

参考微信官方开发文档:subscribeMessage.send | 微信开放文档 (qq.com)

注意:小程序的消息模板已经被废弃了,现在是长期订阅/一次订阅消息,如果需要小程序往公众号发消息模板请参考官方文档:uniformMessage.send | 微信开放文档 (qq.com)

ps: 订阅消息需要在小程序中触发用户授权。

二、流程;

与公众号推送流程是一样的。

微信小程序消息推送服务器配置指南 python 小程序开发消息推送_微信

 

三、实现;

1、获取access_token;

/**
     * 获取微信小程序的accessToken
     *
     * @return
     */
    public String getWxAccessToken() {
       
        /*1、设置请求参数,wxAppID 是微信的appid值,wxAppSecret是微信小程序的secret的值*/
        RestTemplate restTemplate = new RestTemplate();
        String params = "appid=" + wxAppID + "&secret=" + wxAppSecret;
        /*2、获取access_token和expires_in*/
        ResponseEntity<String> responseEntity = restTemplate.getForEntity(
                "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&" + params, String.class);
        String body = responseEntity.getBody();
        JSONObject object = JSON.parseObject(body);
        String wxAccessToken = object.getString("access_token");
        String wxExpiresIn = object.getString("expires_in");// 过期时长(两小时)
       // 优化,使用redis在快过期的时候进行重新调用
        return wxAccessToken;
    }

2、配置参数并推送。

/**
 * 微信小程序消息参数
 */
@Data
public class WxAppTemplate {
	
	//进行推送所需参数
    private String touser;//接收者(用户)的 openid
    private String template_id;//所需下发的订阅模板id
    private String page;//点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
    private String miniprogram_state;//跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
    private String lang;//进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN
    private Map<String, TemplateData> data;//要推送的模板内容,,形式如 { "key1": { "value": any }, "key2": { "value": any } }
}
public class TemplateData {

    private String value;//消息内容
    private String color;//消息颜色

    //构造方法(空参)
    public TemplateData() {
    }

    //构造方法(有参)
    public TemplateData(String value,String color) {
        this.value = value;
        this.color = color;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

}

 

/**
     * 微信小程序消息推送
     *
     * @param 
     * @return
     */
    @Override
    public String redEnvelopeMessagePush(MessagePushDto messagePushDto) {
     
        /*1、调用推送消息微信api*/
        RestTemplate restTemplate = new RestTemplate();
        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + getWxAccessToken();
        /*2、设置推送参数*/
        WxAppTemplate wxTe = new WxAppTemplate();
        wxTe.setTouser(messagePushDto.getOpenId());//用户的openid(接收人,这里应该传进来的)
        wxTe.setTemplate_id("xxxxx");//订阅消息模板id, 配置模板的id
        wxTe.setPage("xxxxx");//点击模板卡片后的跳转页面
        wxTe.setMiniprogram_state("developer"); //跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
        wxTe.setLang("zh_CN"); //进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN
        Map<String, TemplateData> map = new HashMap<>();
        map.put("name1", new TemplateData("xxxxx", "#173177"));
        map.put("thing2", new TemplateData("xxxxx", "#173177"));
        wxTe.setData(map);
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, wxTe, String.class);
        String body = responseEntity.getBody();
        JSONObject jsonObject = JSONObject.parseObject(body);
        return jsonObject.getString("errcode").toString();
    }
/**
 * @description 消息推送
 */
@Data
public class MessagePushDto {

    private String openId;

}

完成。