微信小程序推送订阅消息代码实例

最近几天公司有个业务需求,就是需要对指定用户通过小程序发送信息到微信消息助手,中间遇到了很多坑,跟大家分享一下。

1.首先在微信公众平台发起验证,这不详细说了,网上一大堆案例。

2.然后在微信公众平台申请消息模板

3.申请appid和appSerect用户获取acess_token,工具类所需方法代码如下

/**
 * 获取access token
 * @return
 */
public static com.alibaba.fastjson2.JSONObject getWXAccessToken() {
    //拼接微信官方的url来获取access_token
    String urlResult= HttpClientUtil.doGet("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + APPID + "&secret=" + SECRET,null);
    //转为json
    com.alibaba.fastjson2.JSONObject jsonObject = JSON.parseObject(urlResult);
    return jsonObject;
}
/**
     * 发送订阅消息
     *
     * @param accessToken
     * @param openId
     * @param templateId
     * @param json
     * @return
     */
    public static String messageSubscribeSend(String accessToken, String openId, String templateId, String forwardPage, com.alibaba.fastjson2.JSONObject json) {
        com.alibaba.fastjson2.JSONObject body = new com.alibaba.fastjson2.JSONObject();
        body.put("touser", openId);//接受人的openId
        body.put("template_id", templateId);//模版ID
        body.put("page", forwardPage);//默认跳转到小程序首页
        body.put("data", json);//入参
        String requestUrl = MESSAGE_SUBSCRIBE_SEND.replace("ACCESSTOKEN", accessToken);

        String post = HttpUtil.post(requestUrl, body.toString());
        return post;
    }

4.根据消息模板构造入参,因为access_token有效期是7200秒,我这里利用Redis缓存把它临时保存,防止频繁请求获取access_token,具体的json数据格式因不同模板而异。我申请的模板是这样的

JSONObject json = new JSONObject();
JSONObject thing27 = new JSONObject();
thing27.put("value", p.getBusinessProperty());
JSONObject number28 = new JSONObject();
number28.put("value", p.getLicenceNum());
JSONObject time29 = new JSONObject();
time29.put("value", p.getPreInstallDate());
JSONObject thing30 = new JSONObject();
thing30.put("value", p.getInstallAddress());
json.put("thing27", thing27);
json.put("car_number28", number28);
json.put("time29", time29);
json.put("thing30", thing30);
String accessToken;
if (redisCache.hasKey("access_token")) {
    accessToken = redisCache.getCacheObject("access_token");
} else {
    accessToken = WeChatUtil.getWXAccessToken().get("access_token").toString();
    log.info("本次请求accessToken为:{}", accessToken);
    redisCache.setCacheObject("access_token", accessToken, 7200, TimeUnit.SECONDS);
}
String res = WeChatUtil.messageSubscribeSend(accessToken, openId, Constants.JOB_ORDER_TEMPLATE_ID, "pages/mine", json);
log.info("发送微信信息结束{}", res);
JSONObject result = (JSONObject) JSON.parse(res);
Integer errcode = Integer.valueOf(result.get("errcode").toString());

errcode返回值代码如果是0,如下所示则证明发送成功

{

    "errcode": 0,

    "errmsg": "ok",

    "msgid": 3571565693835345924

}

本人水平有限如有错误之处欢迎指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ws1198979270

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值