下发统一消息

用于通过服务号模板消息下发小程序和公众号统一的服务消息,接口文档地址:

https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-message-management/uniform-message/sendUniformMessage.html

开通模板功能:

登录公众号后台,在“新的功能/广告与服务”中开通模板消息。

access_token 获取:

调用uniform_send发送消息需要access_token,获取access_token方法有两种:使用getAccessToken或者authorizer_access_token,这里使用的是getAccessToken方式。

getAccessToken:有效期目前为 7200 秒,并且是有上限次数的(具体上限次数在公众号后台的接口权限中查看),需做缓存处理,防止超过次数导致失效。

编码

packagecom.demo.util;importcom.alibaba.fastjson2.JSONObject;importlombok.extern.slf4j.Slf4j;importorg.apache.http.client.HttpClient;importorg.apache.http.client.ResponseHandler;importorg.apache.http.client.methods.HttpGet;importorg.apache.http.client.methods.HttpPost;importorg.apache.http.entity.StringEntity;importorg.apache.http.impl.client.BasicResponseHandler;importorg.apache.http.impl.client.DefaultHttpClient;importorg.apache.http.impl.client.HttpClients;importjava.time.Duration;importjava.time.Instant;importjava.util.Objects;importjava.util.concurrent.ConcurrentHashMap;/***@ClassName:WxapiUtil.java*@ClassPath:com.demo.util.WxapiUtil.java*@Description:微信工具*@Author:tanyp*@Date:2023/9/1810:07**/@Slf4jpublicclassWxapiUtil{/***@MonthName:getToken*@Description:获取token*@Author:tanyp*@Date:2023/9/1811:07*@Param:[appid,secret]*@return:java.lang.String**/publicsynchronizedstaticStringgetToken(Stringappid,Stringsecret){JSONObjectobj=accessTokenMap.get(appid);if(Objects.isNull(obj)||Duration.between((Instant)obj.get("time"),Instant.now()).getSeconds()>7100){Stringtoken=getAccessToken(appid,secret);accessTokenMap.put(appid,JSONObject.of("token",token,"time",Instant.now()));log.info("========获取AccessToken======:{}",accessTokenMap.get(appid));returntoken;}else{log.info("========缓存取AccessToken======:{}",obj);returnobj.getString("token");}}publicstaticStringgetAccessToken(Stringappid,Stringsecret){StringAccessTokenUrl="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+secret;HttpClientclient=null;StringaccessToken=null;try{client=newDefaultHttpClient();HttpGethttpget=newHttpGet(AccessTokenUrl);ResponseHandler<String>responseHandler=newBasicResponseHandler();Stringresponse=client.execute(httpget,responseHandler);JSONObjectOpenidJSON=JSONObject.parseObject(response);accessToken=String.valueOf(OpenidJSON.get("access_token"));}catch(Exceptione){log.error("获取token异常:",e);}finally{client.getConnectionManager().shutdown();}returnaccessToken;}/***@MonthName:uniformSend*@Description:下发统一消息*@Author:tanyp*@Date:2023/9/1810:10*@return:java.lang.String**/publicstaticStringuniformSend(Stringappid,Stringsecret,StringopenId,Stringpagepath,StringmpAppId,Stringurl,StringtemplateId,JSONObjectdata){HttpClientclient=null;try{client=HttpClients.createDefault();//获取access_tokenStringtoken=getToken(appid,secret);if(Objects.isNull(token)&&Objects.equals("",token)){log.error("获取AccessToken异常");return"获取AccessToken异常";}//发送消息StringmessageUrl="https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=";HttpPosthttpPost=newHttpPost(messageUrl+token);JSONObjectparams=newJSONObject();params.put("touser",openId);//接收者openid//公众号模板消息相关的信息JSONObjectmp_template_msg=newJSONObject();mp_template_msg.put("appid",mpAppId);mp_template_msg.put("template_id",templateId);//模板跳转链接mp_template_msg.put("url",url);//跳小程序所需数据,不需跳小程序可不用传该数据JSONObjectminiprogram=newJSONObject();miniprogram.put("appid",appid);miniprogram.put("pagepath",pagepath);mp_template_msg.put("miniprogram",miniprogram);//模板数据mp_template_msg.put("data",data);params.put("mp_template_msg",mp_template_msg);httpPost.setEntity(newStringEntity(params.toString(),"UTF-8"));Stringres=client.execute(httpPost,newBasicResponseHandler());if(Objects.nonNull(res)&&!Objects.equals("",res)){JSONObjectobj=JSONObject.parseObject(res);if(Objects.equals("0",obj.getString("errcode"))){return"发送消息成功!";}returnobj.getString("errmsg");}}catch(Exceptione){log.error("发送模板消息异常:{}",e);}finally{client.getConnectionManager().shutdown();}return"发送消息失败!";}}

uniformSend 参数:

  • •appid:小程序 appid

  • •secret:小程序 secret

  • •openId:用户 openid (以是小程序的 openid,也可以是 mp_template_msg.app

  • •pagepath:小程序跳转地址,如:pages/home/home

  • •mpAppId:公众号 appid,要求与小程序有绑定且同主体

  • •url:公众号模板消息所要跳转的url(可以为空)

  • •templateId:公众号模板id

  • •data:公众号模板消息的数据,如:{"thing1":{"value":"测试"}}

注意事项

1、access_token 是用小程序的 appid 和 secret 获取的。

2、接受用的 openid 为小程序端的。

3、mp_template_msg.appid 为公众号的 appid。

4、mp_template_msg.url 不能为空,那么怕写个 xxx。

5、如果要小程序,则 miniprogram 下填充小程序的 appid 和 page。

6、统一服务消息的发送位置为公众号。

7、公众号的小程序一定要关联以下哦(不需要开放平台关联)。

欢迎关注

本篇文章来源于微信公众号: 全栈客



微信扫描下方的二维码阅读本文

此作者没有提供个人介绍
最后更新于 2023-11-02