发送订阅消息通知
-
举枚类
package com.cloudyoung.jun.ucenter.enums; import java.util.Optional; import java.util.stream.Stream; public enum WxMiniDataEnum { WX_MINI("mini","ssss","sssss"), ; private WxMiniDataEnum(String programName, String appId, String appSecret) { this.appId = appId; this.programName = programName; this.appSecret = appSecret; } private String programName; private String appId; private String appSecret; public int getIndex() { return this.ordinal(); } public static WxMiniDataEnum getMiniDataByName(String programName) { if (programName == null){ return null; } Optional<WxMiniDataEnum> miniDataEnum = Stream.of(WxMiniDataEnum.values()).filter(miniData -> miniData.getProgramName().equals(programName) ).findFirst(); return miniDataEnum.isPresent() ? miniDataEnum.get() : null; } public String getProgramName() { return programName; } public void setProgramName(String programName) { this.programName = programName; } public String getAppId() { return appId; } public void setAppId(String appId) { this.appId = appId; } public String getAppSecret() { return appSecret; } public void setAppSecret(String appSecret) { this.appSecret = appSecret; } }
-
小程序订阅接口
//小程序订阅消息接口
public static final String WX_SUBSCRIBE_SEND = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN";
-
发送订阅消息
/** * 微信服务通知 * @param userId * @param orderSn * @param carTypeName * @param */ public void wechatServiceNotification(Long userId ,String orderSn ,String carTypeName,Integer orderStatus,String dealerCode){ //已交车状态推送服务评价 try { String accessToken = wxAuthApi.getWxAccessToken(WxMiniDataEnum.BAOJUN_WX_MINI.getProgramName(), false); String reqUrl = WxConstants.WX_SUBSCRIBE_SEND.replace("ACCESS_TOKEN", accessToken); Map<String, WxMiniSubscribeItem> dataMap = new HashMap<>(); //添加订阅 // wxMiniMessageApi.addWxMiniSubscribeMessage(userId,data.getUserOpenId(),"aF-7FL6ijP-Z7tpY7LVvX4MewKJKcVj5AMEskFP0yCk"); //查询该订单的供应商编码 MessageVo<DealerInfoVo> dealerInfoByDealerCode = dealerInfoApi.getDealerInfoByDealerCode(dealerCode); if(dealerInfoByDealerCode.getResult() && Objects.nonNull(dealerInfoByDealerCode.getData())){ DealerInfoVo dealerInfo = dealerInfoByDealerCode.getData(); if(Objects.nonNull(dealerInfo)){ dataMap.put("thing9",new WxMiniSubscribeItem(dealerInfo.getDealerFullname())); } } dataMap.put("character_string1",new WxMiniSubscribeItem(orderSn)); dataMap.put("thing8",new WxMiniSubscribeItem(StringUtils.isEmpty(carTypeName)?"未知车型":carTypeName)); if(OrderCenterCarStateEnum.ALREADY_CONFIRM_STATE.getValue()==orderStatus){ //订单已确认 dataMap.put("thing5",new WxMiniSubscribeItem("您的购车订单已确认")); }else if(OrderCenterCarStateEnum.ALREADY_CANCEL_STATE.getValue()==orderStatus){ //订单已确认 dataMap.put("thing5",new WxMiniSubscribeItem("您的购车订单已取消")); }else if(OrderCenterCarStateEnum.ALREADY_GIVE_STATE.getValue()==orderStatus){ //待评价 dataMap.put("thing5",new WxMiniSubscribeItem("您的购车订单已完成,快去对订单评价吧")); } dataMap.put("pagePath",new WxMiniSubscribeItem("pages/myorder/myorder")); LogUtil.info(logger,"sendWxMiniSubscribeMessage dataMap:{0}",JsonUtil.Object2Json(dataMap)); MessageVo<Boolean> ret=wxMiniMessageApi.sendWxMiniSubscribeMessage(reqUrl,userId, "aF-7FL6ijP-Z7tpY7LVvX4MewKJKcVj5AMEskFP0yCk",dataMap); LogUtil.info(logger,"sendWxMiniSubscribeMessage result:{0}",JsonUtil.Object2Json(ret)); if(ret.getErrorCode().equals(String.valueOf(WxConstants.TOKEN_INVALID_STATE))){ //token失效,重试 accessToken = wxAuthApi.getWxAccessToken(WxMiniDataEnum.BAOJUN_WX_MINI.getProgramName(), true); reqUrl = WxConstants.WX_SUBSCRIBE_SEND.replace("ACCESS_TOKEN", accessToken); ret=wxMiniMessageApi.sendWxMiniSubscribeMessage(reqUrl,userId, "aF-7FL6ijP-Z7tpY7LVvX4MewKJKcVj5AMEskFP0yCk",dataMap); LogUtil.info(logger,"sendWxMiniSubscribeMessage result:{0}",JsonUtil.Object2Json(ret)); } } catch (RestClientException e) { e.printStackTrace(); LogUtil.error(logger, e, "wechatServiceNotification-error 订单中台 订单状态通知异常"); } }
-
小程序推送相关
/** * 小程序消息推送相关 */ public interface WxMiniMessageApi { /** * 用户同意授权后,添加小程序订阅消息 * @param userId 用户ID * @param openId 用户openId * @param templateId 所需下发的订阅模板id * @return */ MessageVo<Boolean> addWxMiniSubscribeMessage(Long userId,String openId,String templateId); /** * 推送小程序订阅消息 * @param requestUrl http请求调用的url,需包含accessToken。为避免dubbo循环调用,所以未在api内部获取 * @param userId 用户id * @param templateId 模板ID * @param dataMap 推送的数据 * @return */ MessageVo<Boolean> sendWxMiniSubscribeMessage(String requestUrl,Long userId,String templateId, Map<String, WxMiniSubscribeItem> dataMap); /** * 推送公众号模板消息 * @param requestUrl http请求调用的url,需包含accessToken。为避免dubbo循环调用,所以未在api内部获取 * @param userId 用户id * @param openId 用户openId * @param mpTemplateEnum 公众号模板信息 * @param mpTemplateData 推送的数据 * @return */ MessageVo<Boolean> sendMpTemplateMessage(String requestUrl,Long userId,String openId, MpTemplateEnum mpTemplateEnum, MpTemplateData mpTemplateData); }
-
实现类
package com.cloudyoung.jun.message.api.service.impl; import com.alibaba.dubbo.config.annotation.Service; import com.cloudyoung.jun.message.api.service.WxMiniMessageApi; import com.cloudyoung.jun.message.enums.MessageErrCodeEnum; import com.cloudyoung.jun.message.enums.MpTemplateEnum; import com.cloudyoung.jun.message.enums.WxMiniSubscribeEnum; import com.cloudyoung.jun.message.model.MpTemplateMessage; import com.cloudyoung.jun.message.model.WxminiSubscribeMessage; import com.cloudyoung.jun.message.param.MpTemplateData; import com.cloudyoung.jun.message.param.WxMiniSubscribeItem; import com.cloudyoung.jun.message.service.MpTemplateMessageService; import com.cloudyoung.jun.message.service.WxMiniMessageService; import com.google.common.collect.Maps; import com.llb.cloudyoung.tool.utils.HttpUtils; import com.llb.cloudyoung.tool.utils.JsonUtil; import com.llb.cloudyoung.tool.utils.LogUtil; import com.llb.cloudyoung.tool.utils.StringUtil; import com.llb.cloudyoung.tool.vo.MessageVo; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @Service(interfaceClass = WxMiniMessageApi.class, version = "1.0.1") @Component public class WxMiniMessageApiImpl implements WxMiniMessageApi { private static final Logger logger = LoggerFactory.getLogger(WxMiniMessageApiImpl.class); @Autowired private WxMiniMessageService wxMiniMessageService; @Autowired private MpTemplateMessageService mpTemplateMessageService; @Override public MessageVo<Boolean> addWxMiniSubscribeMessage(Long userId,String openId, String templateId) { if(StringUtil.isEmpty(templateId)||openId==null){ return new MessageVo<>(false, MessageErrCodeEnum.MESSAGE_ERR_1300000.getCode(),MessageErrCodeEnum.MESSAGE_ERR_1300000.getMsg()); } try{ WxminiSubscribeMessage wxminiSubscribeMessage=new WxminiSubscribeMessage(); wxminiSubscribeMessage.setUserId(userId); wxminiSubscribeMessage.setOpenId(openId); wxminiSubscribeMessage.setTemplateId(templateId); WxMiniSubscribeEnum wxMiniSubscribeEnum=WxMiniSubscribeEnum.getWxMiniSubscribeEnum(templateId); if(wxMiniSubscribeEnum!=null){ wxminiSubscribeMessage.setPage(wxMiniSubscribeEnum.getPage()); wxminiSubscribeMessage.setTemplateTitle(wxMiniSubscribeEnum.getTemplateTitle()); } wxminiSubscribeMessage.setSendFlag(false); wxminiSubscribeMessage.setCreateTime(new Date()); Boolean res=wxMiniMessageService.addWxMiniSubscribeMessage(wxminiSubscribeMessage); if(res){ return new MessageVo<>(true,true); } }catch (Exception e){ LogUtil.error(logger,e,"addWxMiniTemplateMessage error。userId:{0},formId:{1}", userId,templateId); } return new MessageVo<>(false, MessageErrCodeEnum.MESSAGE_ERR_1300021.getCode(),MessageErrCodeEnum.MESSAGE_ERR_1300021.getMsg()); } @Override public MessageVo<Boolean> sendWxMiniSubscribeMessage(String requestUrl, Long userId, String templateId, Map<String, WxMiniSubscribeItem> dataMap) { LogUtil.info(logger,"sendWxMiniSubscribeMessage param:{0},{1},{2},{3}",requestUrl,userId,templateId,JsonUtil.Object2Json(dataMap)); if(StringUtil.isEmpty(requestUrl)||StringUtil.isEmpty(templateId)||dataMap==null||userId==null){ return new MessageVo<>(false,MessageErrCodeEnum.MESSAGE_ERR_1300000.getCode(),MessageErrCodeEnum.MESSAGE_ERR_1300000.getMsg()); } WxminiSubscribeMessage param = new WxminiSubscribeMessage(); param.setTemplateId(templateId); param.setUserId(userId); param.setSendFlag(false); try{ WxminiSubscribeMessage wxminiSubscribeMessage = wxMiniMessageService.getWxMiniSubscribeMessage(param); LogUtil.info(logger,"getWxMiniSubscribeMessage result:{0}",JsonUtil.Object2Json(wxminiSubscribeMessage)); if(wxminiSubscribeMessage==null){ return new MessageVo<>(false,MessageErrCodeEnum.MESSAGE_ERR_1300019.getCode(),MessageErrCodeEnum.MESSAGE_ERR_1300019.getMsg()); } if(dataMap.containsKey("pagePath")){ wxminiSubscribeMessage.setPage( dataMap.get("pagePath").getValue()); } wxminiSubscribeMessage.setData(JsonUtil.Object2Json(dataMap)); Map response = pushWxMiniSubscribeMessage(requestUrl,wxminiSubscribeMessage,dataMap); if(Integer.parseInt(response.get("errcode").toString())!=0){ LogUtil.error(logger,"小程序服务通知推送出错 request param:{0},response:{1}",JsonUtil.Object2Json(wxminiSubscribeMessage),JsonUtil.Object2Json(response)); return new MessageVo<>(false,response.get("errcode").toString(),response.get("errmsg").toString()); } wxminiSubscribeMessage.setSendFlag(true); wxminiSubscribeMessage.setSendTime(new Date()); wxMiniMessageService.updateWxMiniSubscribeMessage(wxminiSubscribeMessage); return new MessageVo<>(true,true); }catch (Exception e){ LogUtil.error(logger,e,"sendWxMiniSubscribeMessage error.param{0},dataMap:{1}", JsonUtil.Object2Json(param),JsonUtil.Object2Json(dataMap)); } return new MessageVo<>(false,MessageErrCodeEnum.MESSAGE_ERR_1300022.getCode(),MessageErrCodeEnum.MESSAGE_ERR_1300022.getMsg()); } @Override public MessageVo<Boolean> sendMpTemplateMessage(String requestUrl,Long userId, String openId, MpTemplateEnum mpTemplateEnum, MpTemplateData mpTemplateData) { if(StringUtil.isEmpty(requestUrl)||mpTemplateEnum==null||userId==null||mpTemplateData==null){ return new MessageVo<>(false,MessageErrCodeEnum.MESSAGE_ERR_1300000.getCode(),MessageErrCodeEnum.MESSAGE_ERR_1300000.getMsg()); } try{ MpTemplateMessage mpTemplateMessage = new MpTemplateMessage(); mpTemplateMessage.setUserId(userId); mpTemplateMessage.setOpenId(openId); mpTemplateMessage.setUrl(mpTemplateEnum.getUrl()); if(mpTemplateEnum.getMiniprogram()!=null){ mpTemplateMessage.setMiniprogram(JsonUtil.Object2Json(mpTemplateEnum.getMiniprogram())); } mpTemplateMessage.setTemplateId(mpTemplateEnum.getTemplateId()); Map<String, MpTemplateData.Item> dataMap = new HashMap<>(); dataMap.put("first",mpTemplateData.getFirst()); List<MpTemplateData.Item> keywords=mpTemplateData.getKeywords(); if(!CollectionUtils.isEmpty(keywords)){ for (int i = 0; i < keywords.size(); i++) { dataMap.put("keyword"+(i+1),keywords.get(i)); } } dataMap.put("remark",mpTemplateData.getRemark()); mpTemplateMessage.setData(JsonUtil.Object2Json(dataMap)); Map response = pushMpTemplateMessage(requestUrl,mpTemplateMessage); if(Integer.parseInt(response.get("errcode").toString())!=0){ LogUtil.error(logger,"小程序服务通知推送出错 request param:{0},response:{1}",JsonUtil.Object2Json(dataMap),JsonUtil.Object2Json(response)); return new MessageVo<>(false,response.get("errcode").toString(),response.get("errmsg").toString()); } mpTemplateMessage.setCreateTime(new Date()); mpTemplateMessageService.updateMpTemplateMessage(mpTemplateMessage); return new MessageVo<>(true,true); }catch (Exception e){ LogUtil.error(logger,e,"sendWxMiniTemplateMessage error.mpTemplateEnum{0},mpTemplateData:{1},userId:{2}", JsonUtil.Object2Json(mpTemplateEnum),JsonUtil.Object2Json(mpTemplateData),userId); } return new MessageVo<>(false,MessageErrCodeEnum.MESSAGE_ERR_1300018.getCode(),MessageErrCodeEnum.MESSAGE_ERR_1300018.getMsg()); } /** * 推送小程序订阅通知消息 * @param subscribeMessage 消息内容 */ private Map pushWxMiniSubscribeMessage(String requestUrl,WxminiSubscribeMessage subscribeMessage,Map<String, WxMiniSubscribeItem> dataMap){ //构建header Map<String, String> headerMap = Maps.newHashMap(); headerMap.put("Content-Type", "application/json"); //组装参数 Map<String,Object> paramMap = Maps.newHashMap(); paramMap.put("touser", subscribeMessage.getOpenId()); paramMap.put("template_id",subscribeMessage.getTemplateId()); paramMap.put("page",subscribeMessage.getPage()); paramMap.put("data",dataMap); String bodyJsonParam = JsonUtil.Object2Json(paramMap); //发送请求 LogUtil.info(logger,"pushWxMiniSubscribeMessage request:{0}",bodyJsonParam); String response = HttpUtils.requestPost(requestUrl, bodyJsonParam, headerMap); LogUtil.info(logger,"pushWxMiniSubscribeMessage response:{0}",response); Map data = Maps.newHashMap(); if (StringUtils.isNotBlank(response)) { data = JsonUtil.Json2Object(response, Map.class); } return data; } /** * 推送公众号服务通知消息 * @param mpTemplateMessage */ private Map pushMpTemplateMessage(String requestUrl,MpTemplateMessage mpTemplateMessage){ //构建header Map<String, String> headerMap = Maps.newHashMap(); headerMap.put("Content-Type", "application/json"); //组装参数 Map<String,Object> paramMap = Maps.newHashMap(); paramMap.put("touser", mpTemplateMessage.getOpenId()); Map<String,String> mpTemplateMsg = Maps.newHashMap(); //TODO appid需要等服务号申请下来后填写 mpTemplateMsg.put("appid",""); mpTemplateMsg.put("template_id",mpTemplateMessage.getTemplateId()); mpTemplateMsg.put("url",mpTemplateMessage.getUrl()); mpTemplateMsg.put("miniprogram",mpTemplateMessage.getMiniprogram()); mpTemplateMsg.put("data",mpTemplateMessage.getData()); paramMap.put("mp_template_msg", mpTemplateMsg); String bodyJsonParam = JsonUtil.Object2Json(paramMap); //发送请求 LogUtil.info(logger,"pushMpTemplateMessage request:{0}",bodyJsonParam); String response = HttpUtils.requestPost(requestUrl, bodyJsonParam, headerMap); LogUtil.info(logger,"pushMpTemplateMessage response:{0}",response); Map data = Maps.newHashMap(); if (StringUtils.isNotBlank(response)) { data = JsonUtil.Json2Object(response, Map.class); } return data; } }