微信服务号模版消息重复发送或消息接收不到的解决方案

微信服务号模版消息重复发送或消息接收不到的解决方案

  • 问题描述
  • 解决思路

问题描述

前段时间开发的服务号,有一个功能是主动向用户推送消息,经查看文档后,发现模版消息可以实现,于是按照文档向微信申请消息模版并开发上线。
我们平台是做线上教育的,有直播功能,每次直播前会向学员推送模版消息提醒用户直播时间和链接。
但是前几天发现一个问题,因为要推送的学员量较大,调用微信接口推送模版消息时,会出现部分学员重复发送,部分学员接收不到的问题(开始的时候微信向我推送过警告,我没在意)。
看到网上其他同行也遇到类似的问题,因此,针对该问题,我的解决思路我做一个总结。

解决思路

原本做这个功能我用到两个表,一个是user,存放用户信息,其中openid 用来向微信推送模版消息,其他字段暂且不提。另一个表是用来存放微信模版的,拿到openid和模版消息,调用微信模版消息接口,即能推送成功。但是短时间内推送过多的消息,微信会报警,具体的报警信息我忘记了,然后就会出现一部分学员收到多条消息,一部分学员收不到消息。
解决这个问题我的思路是减少单位时间内向微信推送消息的频率,每推送一条消息,sleep(500)毫秒(根据个人需要设定时间),再推送下一条。要实现这个功能,需要一个中间表去存储已推送和未推送的user及相应的状态。
表结构如下:
id:主键id
user_id: 用户id,因为要用到其他用户信息,故这里存放id,也可以直接存放openid
msg_id:模版消息的id,根据该id去模版消息表中取相应的数据
status:状态,分为成功、失败、未推送、发送中(可选)
写一个定时任务,每次根据状态,取出第一条未推送的,调用微信接口,然后根据返回状态去update这张表,把状态更新掉即可。
注1:status设置发送中的状态是因为如果一个消息正在发送,下一个定时任务就开始执行了,检测出有发送中状态的,可以直接返回,等待下次定时任务的执行。也可以不设置发送中的状态,那就需要在定时任务上设置锁了,如果如果检测到上一个定时任务没有执行,下一个就不能开始。
粘上我的定时任务作为参考,具体的设置可自行百度。

*/1 * * * *  flock -xn /tmp/sendmessage.lock -c '/usr/local/php/bin/php  /项目目录/artisan SendMessage >>/tmp/sendTemp.log 2>&1'

注2:这个表如果担心后期过大,可以定期清理数据。如果不需要处理发送失败的学员,发送完毕后可立刻清空该表。
–the end–
有不明白的或者有更好解决方案的欢迎留言讨论

你可能感兴趣的:(微信服务号开发)