发送订阅消息通知(记一次笔记)

发送订阅消息通知

  1. 举枚类

    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;
        }
    
    
    }
    
    
  2. 小程序订阅接口

//小程序订阅消息接口
public static final String WX_SUBSCRIBE_SEND = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN";
  1. 发送订阅消息

     /**
         * 微信服务通知
         * @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 订单中台 订单状态通知异常");
            }
        }
    
  2. 小程序推送相关

    /**
     * 小程序消息推送相关
     */
    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);
    }
    
    
  3. 实现类

    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;
        }
    
    }
    
    

猜你喜欢

转载自blog.csdn.net/qq_38893133/article/details/111195293