微信推送通知之模版方法与策略模式实践

背景介绍

针对秒杀活动,产品MM提出用户预约活动之后对其推送消息通知的功能,之前同事已经接过一次A小程序的推送通知,现在需要再接入B小程序的微信推送通知,除了部分参数不一样,其他参数都没有任何变动,存在很多重复性代码,因此将重复的代码,将其共性提出来,作为一套共用的模板,另外,现在只涉及到接入两个小程序的微信推送功能,假如还需要接其他小程序的微信推送通知,这个时候,就可以用策略模式来进行优化,每一个小程序接入就是一种策略方式。

创建一个策略接口

public interface PushMessageStrategy extends InitializingBean {
  
    WechatAppletPushMessageRequest buildSeckillSubscribeMessage(SeckillSubscribeDTO seckillSubscribeDTO, int memberSubscribeSize);

    WechatAppletPushMessageRequest buildSeckillActivityNoticeMessage(SeckillSubscribeDTO seckillSubscribeDTO, Long caseId, Long sectionId);
}

创建策略抽象类

@Slf4j
public abstract class AbstractPushMessageStrategy implements PushMessageStrategy {

    public abstract void setSceneCode(MessageTemplateRequest request);

    public abstract void setPlateId(WechatAppletPushMessageRequest request);

    public abstract String getPushUrl(Long caseId, Long sectionId, Long sectionCategoryId, String channel, Long spuId);

    public abstract String getPushAdvanceUrl(Long caseId, Long sectionId, String channel);

    @Override
    public WechatAppletPushMessageRequest buildSeckillSubscribeMessage(SeckillSubscribeDTO seckillSubscribeDTO, int memberSubscribeSize) {
        WechatAppletPushMessageRequest request = new WechatAppletPushMessageRequest();
        request.setBusinessCode(ConfigureCenterHelper.getSubscribeBusinessCode());
        request.setProjectId(ConfigureCenterHelper.getProjectId());

        // 设置渠道id
        setPlateId(request);

        request.setMemberId(seckillSubscribeDTO.getMemberId());
        request.setOpenId(seckillSubscribeDTO.getOpenId());
        request.setUnionId(seckillSubscribeDTO.getUnionId());
        Map<String, String> templateMap = new HashMap<>();
        templateMap.put("activityName", ConfigureCenterHelper.getActivityName());
        templateMap.put("startTime", DateUtil.date2String(seckillSubscribeDTO.getKillStartTime(), "yyyy年MM月dd日 HH:mm:ss"));
        String spuName = seckillSubscribeDTO.getSpuName().length() > 8 ? seckillSubscribeDTO.getSpuName().substring(0, 7) + "..." : seckillSubscribeDTO.getSpuName();
        StringBuilder remarkStr = new StringBuilder();
        if (memberSubscribeSize > 1) {
            remarkStr.append("您预约的").append(spuName).append("+等秒杀即将开始了");
            templateMap.put("remark", remarkStr.toString());
        } else {
            remarkStr.append("您预约的").append(spuName).append("秒杀即将开始了");
            templateMap.put("remark", remarkStr.toString());
        }

        // 获取推送连接
        String pushUrl = getPushUrl(seckillSubscribeDTO.getCaseId(), seckillSubscribeDTO.getSectionId(), seckillSubscribeDTO.getSectionCategoryId(),
                seckillSubscribeDTO.getChannel(), seckillSubscribeDTO.getSpuId());

        templateMap.put("pushUrl", pushUrl);
        request.setTemplateMap(templateMap);
        return request;
    }

    @Override
    public WechatAppletPushMessageRequest buildSeckillActivityNoticeMessage(SeckillSubscribeDTO seckillSubscribeDTO, Long caseId, Long sectionId) {
        WechatAppletPushMessageRequest request = new WechatAppletPushMessageRequest();
        request.setBusinessCode(ConfigureCenterHelper.getSeckillAdvanceBusinessCode());
        request.setProjectId(ConfigureCenterHelper.getProjectId());

        // 设置渠道id
        setPlateId(request);

        request.setMemberId(seckillSubscribeDTO.getMemberId());
        request.setOpenId(seckillSubscribeDTO.getOpenId());
        request.setUnionId(seckillSubscribeDTO.getUnionId());
        Map<String, String> templateMap = new HashMap<>();
        templateMap.put("activityName", ConfigureCenterHelper.getActivityName());
        templateMap.put("activityStatus", ConfigureCenterHelper.getActivityStatus());
        templateMap.put("remark", "您订阅的秒杀即将开始。");

        // 获取推送连接
        String pushAdvanceUrl = getPushAdvanceUrl(caseId, sectionId, seckillSubscribeDTO.getChannel());

        templateMap.put("pushUrl", pushAdvanceUrl);
        request.setTemplateMap(templateMap);
        return request;
    }
}

A小程序推送策略

public class PushMessageStrategyA extends AbstractPushMessageStrategy {

    private static final String A_CHANNEL = "A_CHANNEL";

    @Override
    public void setSceneCode(MessageTemplateRequest request) {
        request.setSceneCode(ConfigureCenterHelper.getSceneCodeA());
    }

    @Override
    public void setPlateId(WechatAppletPushMessageRequest request) {
        request.setPlateId(ConfigureCenterHelper.getPlateIdA());
    }

    @Override
    public String getPushUrl(Long caseId, Long sectionId, Long categoryId, String channel, Long spuId) {
        String encodrUrl = null;
        try {
            encodrUrl = URLEncoder.encode(ConfigureCenterHelper.getPushBaseUrl() + caseId + "?channel=" + channel + "&sectionId=" + sectionId + "&categoryId=" + categoryId + "&spuId=" + spuId, "utf-8");
        } catch (UnsupportedEncodingException e) {
            log.info("推送链接encode异常");
        }
        return ConfigureCenterHelper.getPushMiniUrl() + encodrUrl;
    }

    @Override
    public String getPushAdvanceUrl(Long caseId, Long sectionId, String channel) {
        String encodrUrl = null;
        try {
            encodrUrl = URLEncoder.encode(ConfigureCenterHelper.getPushBaseUrl() + caseId + "?channel=" + channel + "&sectionId=" + sectionId, "utf-8");
        } catch (UnsupportedEncodingException e) {
            log.info("推送链接encode异常");
        }
        return ConfigureCenterHelper.getPushMiniUrl() + encodrUrl;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        PushMessageFactory.register(A_CHANNEL, this);
    }
}

B小程序推送策略

public class PushMessageStrategyB extends AbstractPushMessageStrategy {

    private static final String B_CHANNEL = "B_CHANNEL";

    @Override
    public void setSceneCode(MessageTemplateRequest request) {
        request.setSceneCode(ConfigureCenterHelper.getSceneCodeB());
    }

    @Override
    public void setPlateId(WechatAppletPushMessageRequest request) {
        request.setPlateId(ConfigureCenterHelper.getPlateIdB());
    }

    @Override
    public String getPushUrl(Long caseId, Long sectionId, Long categoryId, String channel, Long spuId) {
        String encodrUrl = null;
        try {
            encodrUrl = URLEncoder.encode(ConfigureCenterHelper.getPushBaseUrl() + caseId + "?channel=" + channel + "&sectionId=" + sectionId + "&categoryId=" + categoryId + "&spuId=" + spuId + "&entrance=dymes", "utf-8");
        } catch (UnsupportedEncodingException e) {
            log.info("推送链接encode异常");
        }
        return ConfigureCenterHelper.getPushMiniUrlB() + encodrUrl;
    }

    @Override
    public String getPushAdvanceUrl(Long caseId, Long sectionId, String channel) {
        String encodrUrl = null;
        try {
            encodrUrl = URLEncoder.encode(ConfigureCenterHelper.getPushBaseUrl() + caseId + "?channel=" + channel + "&sectionId=" + sectionId + "&entrance=dymes", "utf-8");
        } catch (UnsupportedEncodingException e) {
            log.info("推送链接encode异常");
        }
        return ConfigureCenterHelper.getPushMiniUrlB() + encodrUrl;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        PushMessageFactory.register(B_CHANNEL, this);
    }
}

推送策略工厂类

public class PushMessageFactory {

    private PushMessageFactory(){}

    private static final Map<String, PushMessageStrategy> PUSH_MESSAGE_STRATEGY_MAP = Maps.newConcurrentMap();

    public static PushMessageStrategy createStrategy(String channel) {
        return PUSH_MESSAGE_STRATEGY_MAP.get(channel);
    }

    /**
     * 注册策略
     *
     * @param channel             渠道
     * @param pushMessageStrategy 推松消息策略
     */
    public static void register(String channel, PushMessageStrategy pushMessageStrategy) {
        PUSH_MESSAGE_STRATEGY_MAP.put(channel, pushMessageStrategy);
    }

}

后续如果需要再接入别的小程序,只需要继承抽象类,设置它自己需要的参数即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值