微信开发(三)微信模板消息界面设计

电脑杂谈  发布时间:2020-07-08 11:30:13  来源:网络整理

调用微信扫一扫接口_微信接口调用次数限制_0元调用微信支付接口

在公司微信项目的开发中微信接口调用次数限制,我主要负责消息中心的模板消息接口的设计和实现. 主要是将微信公众号的推送模板消息功能放入公司的消息中心系统,微信后台项目通过RMI调用该接口来实现推送功能. 记录并总结当时的设计和实施思想.

该公司使用Hessian实现RMI,因此该接口被设计为Hessian接口.

接口的设计必须首先确定接口的名称,参数和返回值. 考虑到将来的扩展,可以使用多个公共帐户,因此接口参数的设计更加具体.

0元调用微信支付接口_调用微信扫一扫接口_微信接口调用次数限制

public interface IWechatMessageService {
    public int sendTempMsg(String spid, Integer templateId, String data);
}

通过阅读微信开发文档,我们知道在推送模板消息时,您必须具有Access_Token,templateid,openId和要发送的数据. 这些数据形成一个json字符串,并发送到微信服务器. 微信服务器返回一个包含相应信息的json包.

消息推送的设计思路:

0元调用微信支付接口_微信接口调用次数限制_调用微信扫一扫接口

通过微信后台项目的远程调用界面,公共帐户ID,模板ID(ID是表中的主键)和推送的数据作为参数传递. 消息中心接收到参数后,首先根据公众号ID来确定是否存在公众账号信息,然后根据模板ID来确定是否存在模板信息,如果没有问题,这些参数数据将被组装到DTO中,放入消息队列中,然后完成接口方法,返回状态码. 放入消息队列后,队列的一些订户处理消息(即,将数据发送到微信服务器),并且推送模板消息的过程结束.

上述想法有几个问题:

对于公共帐户和模板信息的验证,这些信息存储在中微信接口调用次数限制,您是否需要在每次调用接口验证时从查询数据?对于推送的数据,此参数为多用户数据,即一次传输一批用户的数据,每个用户推送的内容不同,因此数据格式为JsonArray,何时为发布到消息队列中,它是一批post,一个DTO,还是将每个用户的数据分为多个DTO进行传递?消息数据进入队列后,如何消费以及如何向微信服务器发送数据?推送时,需要Access_Token. 该令牌与微信后台项目共享,令牌具有有效期. 过期后,消息推送失败,我该如何处理?

调用微信扫一扫接口_微信接口调用次数限制_0元调用微信支付接口

接下来,记录每个问题当时的解决方案:

发送模板消息时,需要Access_Token和相应的模板ID. 获取Access_Token需要公共账号的appid和秘密,自定义模板需要应用到微信官方,非常严格. 当操作多个公共帐户时,有必要通过表记录该公共帐户的信息,并且用于不同推送内容的模板有所不同,还需要记录所使用的模板信息. 因此,传递的参数应记录在表中. 为了避免每次验证时都查询,采用了将公众账号信息和模板信息加载到内存中的方法. 具体地说,在项目启动时,使用侦听器从查询数据并将其存储在内存中. 这里,HashMap用作存储的数据结构,键是主键,值是对应的实体类对象.

//加载模板信息
private static Map<Integer,Template> ALL_TEMPLATE = new HashMap<Integer, Template>();
List<Template> templateList = templateService.getAll();
if (templateList != null && templateList.size() > 0) {
    for (Template template : templateList) {
        nteger templateid = template.getTemplateid();
        ALL_TEMPLATE.put(templateid,template);
    }
}

调用微信扫一扫接口_微信接口调用次数限制_0元调用微信支付接口

开始设计时,我曾经直接将数据组装到DTO中并将其发送到队列中. 消费时,我接受了一批用户数据. 发送时,我处理了数据并拆分了每个用户的数据. 数据一一发送. 但是,在审查时,主管说应事先将其拆分,将单个用户的DTO存储在列表中,调用该方法以列表的形式发送它,然后以多个形式发送它. 消费时采用螺纹方式. 我为什么要这样做?主管告诉我,这可以防止大量数据丢失. 如果一次将一个DTO放入队列中,则当队列出现问题时,很多数据将丢失. 该公司使用RabbitMQ并封装了管理类RabbitmqManager. 通过阅读源代码,可以发现当以列表的形式发送源代码时,它仍然在该方法中一个接一个地发送到队列.

//将一批消息中的所有用户消息以list放入队列
        List<WechatTempMsgDTO> dataList = new ArrayList<WechatTempMsgDTO>();
        for(int i = 0; i < dataArray.size(); i++){
            JSONObject dataOfUser = dataArray.getJSONObject(i);
            WechatTempMsgDTO wechatTempMsgDTO = new WechatTempMsgDTO(accessToken,templateId,dataOfUser.toJSONString(),batchid,0,spid);
            dataList.add(wechatTempMsgDTO);
        }
        int status = queueManager.sendMessageObject(GlobalVars.WECHAT_QUEUE_NAME,dataList);

发送到队列的源代码

    public <T> int sendMessageObject(String queueName, List<T> messgaes) {
        try {
            MessageProperties properties = messgaes != null && messgaes.size() > 0 ? this.getTypeProperties(messgaes.get(0).getClass()) : null;
            Iterator it = messgaes.iterator();
            while(it.hasNext()) {
                T expectedBody = it.next();
                this.mqTemplate.convertAndSend(queueName, new Message(JSON.toJSONString(expectedBody).getBytes(Charsets.UTF_8), properties));
            }
            return 1;
        } catch (Exception var6) {
            return -1;
        }
    }

这里使用消息队列的发布和订阅模型. 项目启动时,侦听器将订阅队列,等待从队列中获取消息进行处理. 在此,使用多线程方法进行推送. 通过阅读源代码,发现多线程的实现是订户订阅了一个线程池,并且每个线程代表一个消费者消费者


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-272863-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...