时序图
首先,我们需要知道一件事情,小程序的模板推送分为“一次性订阅”和“长期订阅”
一次性订阅:用户订阅小程序后,程序只能对指定OpenId进行一次推送模板消息,无法多次推送
长期订阅:用户长期订阅,能够多次推送模板消息(长期订阅模板需要向微信官方发起申请)
推送模板消息前置配置
1.需要配置消息推送
2.需要根据AppId、AppSecret调用开发文档Api获取access_token
GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
2.需要使用access_token调用以下Api获取到微信用户的open_id
POST https://api.weixin.qq.com/wxa/getpluginopenpid?access_token=ACCESS_TOKEN
推送模板消息API
微信开发文档中的模板消息已经废弃不进行使用了,我们现在应该使用“订阅消息”——>“send”这个API(下方链接)
subscribeMessage.send | 微信开放文档
其中参数的data属性,需要我们在代码中与之对应:
例如:
模板格式
参数类型:
类型:(需要注意一些长度限制)
上边的准备好就可以进行代码编写。
代码实现
1.模板消息:(所要传的参数实体)
public class WxSubscribeMsg {// 接收人idprivate String touser;// 模板idprivate String template_id;// 跳转小程序private String page;// 模板数据private Map<String, WxTemplateValue> data;// 跳转小程序类型 默认正式版private String miniprogram_state;// 语言类型 默认中文private String lang = "zh_CN";public String getTouser() {return touser;}public void setTouser(String touser) {this.touser = touser;}public String getTemplate_id() {return template_id;}public void setTemplate_id(String template_id) {this.template_id = template_id;}public String getPage() {return page;}public void setPage(String page) {this.page = page;}public Map<String, WxTemplateValue> getData() {return data;}public void setData(Map<String, WxTemplateValue> data) {this.data = data;}public String getMiniprogram_state() {return miniprogram_state;}public void setMiniprogram_state(String miniprogram_state) {this.miniprogram_state = miniprogram_state;}public String getLang() {return lang;}public void setLang(String lang) {this.lang = lang;} }
2.模板内容:(API中的data属性)
public class WxTemplateValue {private String value;public String getValue() {return value;}public void setValue(String value) {this.value = value;}@Overridepublic String toString() {return "WxTemplateValue{" +"value='" + value + '\'' +'}';} }
3.返回数据接收
public class WxUserInfo {private String openid;private String session_key;private String unionid;private int errcode;private String errmsg;public String getOpenid() {return openid;}public void setOpenid(String openid) {this.openid = openid;}public String getSession_key() {return session_key;}public void setSession_key(String session_key) {this.session_key = session_key;}public String getUnionid() {return unionid;}public void setUnionid(String unionid) {this.unionid = unionid;}public int getErrcode() {return errcode;}public void setErrcode(int errcode) {this.errcode = errcode;}public String getErrmsg() {return errmsg;}public void setErrmsg(String errmsg) {this.errmsg = errmsg;} }
推送代码:
调用的API接口:
POST https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN
WxSubscribeMsg wxSubscribeMsg = new WxSubscribeMsg();wxSubscribeMsg.setTouser(openId);wxSubscribeMsg.setTemplate_id(templateId);// 模板消息到小程序跳转页面wxSubscribeMsg.setPage("pages/workbench/workbench?id=" + dto.getId()+"&pageTpye=task"); // 开发版 // wxSubscribeMsg.setMiniprogram_state("developer"); // 跳转体验版wxSubscribeMsg.setMiniprogram_state("trial"); // 跳转正式版 // wxSubscribeMsg.setMiniprogram_state("formal");// 模板消息Map<String, WxTemplateValue> map = new HashMap<>();// 发布内容WxTemplateValue keyword1 = new WxTemplateValue();keyword1.setValue(sendContent);map.put("thing1", keyword1);// 影响区域WxTemplateValue keyword2 = new WxTemplateValue();String taskArea = dto.getSecondAreaName()+dto.getThirdAreaName();if(taskArea.length() < 20){keyword2.setValue(taskArea);}else{keyword2.setValue("");}map.put("thing2", keyword2);// 发布时间WxTemplateValue keyword3 = new WxTemplateValue();String date = dto.getTaskStartTime()keyword3.setValue(date);map.put("date3", keyword3);// 发布单位WxTemplateValue keyword4 = new WxTemplateValue();String group = dto.getName();if(group.length() < 20){keyword4.setValue(group);}else{String substring = group.substring(0, 20);keyword4.setValue(substring);}map.put("thing4", keyword4);// 推送模板参数wxSubscribeMsg.setData(map);// 参数转jsonString json = JSONObject.toJSONString(wxSubscribeMsg);// 调用微信推送模板接口String doPostJson = HttpClientUtil.doPostJson(requestUrl, json);// 将获取到的数据进行判断进行日志写入JSONObject jsonObject = JSONObject.parseObject(doPostJson);LOGGER.info("调用微信模板消息回调结果:"+ com.wanwei.oneview.base.utils.JsonUtils.objectToJson(jsonObject));