最近几天公司有个业务需求,就是需要对指定用户通过小程序发送信息到微信消息助手,中间遇到了很多坑,跟大家分享一下。
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
}
本人水平有限如有错误之处欢迎指教。