发布网友 发布时间:2022-03-02 09:34
共1个回答
热心网友 时间:2022-03-02 11:03
设计合理的红包流程,如下图所示,展示了用户侧的相关操作,此次活动用户最多只有一次获奖机会,另一方面,服务器开启定时轮询服务,用于发放红包.
设计数据库表结构设计及红包队列机制
repacket 表是红包基础信息表,用户摇红包时,会在该表中创建一条记录,此时stat状态是0。另一方面,服务器上有轮询程序,5秒轮询一次,每次从表redpacket 中取出stat=0的10条记录,进行红包发放操作,每发放成功一个,对于的stat设置为1。为了确保红包送到,我们设计了ntrytimes 字段,每次发送如果未成功,则 该字段增1,值到该字段数值高于某值,一般为5wxlog 表用来记录红包发放反馈细节,用于红包发放会碰到很多突发问题,该表记录每次发放的细节,有利于提高我们的服务质量
如何防止被微信支付拒绝
微信红包被拒有很多情况,如下是其中最常见的三种,
3.3.1 发放失败,此请求可能存在风险,已被微信拦截 该情况一般是因为用户帐号存在异常,比如微信监控机制发现用户利用红包在*,则会屏蔽。此类问题没有解决方法。
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[发放失败,此请求可能存在风险,已被微信拦截]]></return_msg>
<result_code><![CDATA[FAIL]]></result_code>
<err_code><![CDATA[NO_AUTH]]></err_code>
<err_code_des><![CDATA[发放失败,此请求可能存在风险,已被微信拦截]]></err_code_des>
<mch_billno><![CDATA[re20160318191917528]]></mch_billno>
<mch_id>12377502</mch_id>
<wxappid><![CDATA[公众号APPID]]></wxappid>
<re_openid><![CDATA[okoQctzL9-fRrRlr-gIj4cEazNFM]]></re_openid>
<total_amount>100</total_amount>
</xml>
3.3.2 超过频率*,请稍后再试,公众帐号对某一个用户发放红包频次不能太多,否则会出现这种情况。另外系统发放红包对微信API请求不能过于频繁。此类问题解决方法就是控制用户红包数目,并且控制API请求频率
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[超过频率*,请稍后再试]]></return_msg>
<result_code><![CDATA[FAIL]]></result_code>
<err_code><![CDATA[FREQ_LIMIT]]></err_code>
<err_code_des><![CDATA[超过频率*,请稍后再试]]></err_code_des>
<mch_billno><![CDATA[re2016032110454813571]]></mch_billno>
<mch_id>12377502</mch_id>
<wxappid><![CDATA[公众号APPID]]></wxappid>
<re_openid><![CDATA[okoQctyDbaPvyPKSXq9QberLnPUM]]></re_openid>
<total_amount>200</total_amount>
</xml>
3.2 帐号余额不足,请到商户平台充值后再重试. 一种可能是真没钱了,另外一种可能是并发太大,微信会返回此种情况,解决方案是将请求变成顺序的。后面章节会单独说明
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[帐号余额不足,请到商户平台充值后再重试]]></return_msg>
<result_code><![CDATA[FAIL]]></result_code>
<err_code><![CDATA[NOTENOUGH]]></err_code>
<err_code_des><![CDATA[帐号余额不足,请到商户平台充值后再重试]]></err_code_des>
<mch_billno><![CDATA[re2016032110460657709]]></mch_billno>
<mch_id>12377502</mch_id>
<wxappid><![CDATA[公众号APPID]]></wxappid>
<re_openid><![CDATA[okoQct14A0OYz_bx0Spe0P-6HNTw]]></re_openid>
<total_amount>100</total_amount>
</xml>
3.3 如果发放成功,则返回如下信息
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[发放成功]]></return_msg>
<result_code><![CDATA[SUCCESS]]></result_code>
<mch_billno><![CDATA[re2016032417512098479]]></mch_billno>
<mch_id>12377502</mch_id>
<wxappid><![CDATA[公众号APPID]]></wxappid>
<re_openid><![CDATA[okoQct7fPhd1JqtDz0LqTUxf1kNU]]></re_openid>
<total_amount>200</total_amount>
<send_listid><![CDATA[00101733201603240631676524]]></send_listid>
<send_time><![CDATA[20160324175121]]></send_time>
</xml>
3.3.4 其他错误码说明请参考微信官方给出的错误提示及解决方案
设计红包发放定时器
我们之所以要启用定时器操作,是为了保证我们能及时地响应红包发放操作。同时也为了保证任意时间我们向微信支付平台调用支付请求最多只有一个http请求。在win系统下,我们需要添加定时任务,如下俩张图展示了windows下定时器配置
在创建定时任务的时候,我们最好先创建一个bat(hongbao.bat)文件,内容如下
C:\phpStudy\php53\php.exe C:\WWW\task.php Index/hongbao
task.php 是一个php文件, Index/hongbao 是Index模块下的 hongbao发放方法
该示例采用THINKPHP框架,CGI模式
linux下定时器使用crontab,考虑到时间*,我们一般一次拉取10个红包,并10秒循环一次
crontab -e 编辑crontab服务文件
*/2 * * * * /bin/sh /home/admin/jiaoben/hongbao.sh
保存文件并并退出
关于crontab相应的资料很多,可以自行百度。
hongbao.sh 里的内容是thinkphp cgi模式的php 接口
php /var/WWW/task.php Index/hongbao
h5实现摇动代码解析
如何获得流畅自然的的声音
该应用有俩个音乐,一个是摇中的音乐,一个是摇动中的,何时播放,如何流畅地播放,这是个大问题,本章节采用如下js 很好地解觉了该问题
php实现红包发放核心函数,以thinkphp为例