微信公众号开发推送事件排重

问题描述

在处理用户领卡的推送的时候,我们的数据库对同一个新的用户,会出现两条数据,比如两条用户,两条用户领卡数据

问题分析

出现这种的原因在于以下两点:

  • 服务器有点卡,没有来得及在5秒之内回复微信服务器,导致微信服务器重发请求
  • 虽然在插入数据之前有所检查有无重复数据,但是可能服务器很卡,在检查的时候,前一条请求的数据还没有插入数据库

处理方法

参考微信开发文档,利用FromUserName + CreateTime排重,将其作为一个key,存放在memcached里面,然后每次有推送或者消息来得时候,先去判断一下是否存在,如果存在,表示是重复推送,直接return空串,否则表示是第一次推送,将其作为一个key,简要代码如下:

mc = memcached_wrapper.getMemcached()
FromUserName = self.decrypt_msg.find("FromUserName").text
CreateTime = self.decrypt_msg.find("CreateTime").text
mc_key_str = Util.unicode2str(FromUserName + CreateTime)
mc_value_str = mc.get(mc_key_str)
if mc_value_str:
    mc.disconnect_all()
    return ""
else:
    mc.set(mc_key_str, 1, 60)
    mc.disconnect_all()
# 备注
# unicode2str将unicode字符串转化为bytes串
# memcached_wrapper一个处理memcached的py文件,主要作用是连接memcached和复用连接等功能

好了,就先到这里了,记录下来以便下次查阅,如果对于你也有帮助的话,那真是最好不过的了

    原文作者:Hwan
    原文地址: https://segmentfault.com/a/1190000013147699
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞