最近的项目需要在
聊天,基础上加上红色的包的
功能需求:模仿微信(无
消息),但是只使用平衡送红包。这么多的微信红包,了解各种接口和业务需求,如
显示信息,
分类(个人、组、组数、拼运气)有限
公司(100)、限制(200),到期时间(24小时),然后开始发展,以下提供了所有基本的报价之后,所有的
应用程序的客户端接口,,我和。
1。设计数据表如下所示
创建表(` red_packet `
` ID ` int(10)符号的非空auto_increment,
` user_id ` int(10)符号的非空的
默认'0'comment
用户ID,
` for_id ` int(10)符号无效的默认'0'comment发行对象(用户或组ID),
` pay_status ` tinyint(1)符号的非空的默认'0'comment的付款
情况:0付,1付,
`型` tinyint(1)符号的非空的默认'0'comment型:1, 2,3,普通组,组拼运气,
`
介绍` varchar(255)不为空的默认' ' '引进来',
`数` tinyint(1)符号无效的默认'0'comment '数字',
` total_money `十进制(10,2)符号的非空的默认'0.0'comment总量,
` single_money `十进制(10,2)符号的非空的默认'0.0'comment(一个红组拼运气的量是0),
` return_money `十进制(10,2)符号不为空的默认'0.0'comment退款,
` is_cli_handle ` tinyint(1)符号的非空的默认'0'comment是否CLI退款
处理:0没有,1是,
` expend_time ` MEDIUMINT(1)消费时间得到签名无效的默认'0'comment,
` add_time ` int(10)符号无效的默认'0'comment创作时间,
` pay_time ` int(10)符号无效的默认'0'comment支付时间,
主键(id),
关键` user_id `(` user_id `),
关键` pay_status `(` pay_status `),
关键` pay_time `(` pay_time `)
)= InnoDB引擎默认的字符集utf8评论=红包分布表;
创建表(` red_packet_log `
` ID ` int(10)符号的非空auto_increment,
` rp_id ` int(10)符号的非空的默认'0'comment红包ID,
` user_id ` int(10)符号的非空的默认'0'comment收到身份,
`钱`十进制(10,2)符号的非空'0.0'comment的索赔金额的违约,
` is_od ` tinyint(1)符号的非空的默认'0'comment '是最好的运气:0或1,
` add_time ` int(10)符号的非空的默认'0'comment添加时间,
` update_time ` int(10)时间的接收符号无效的默认'0'comment,
主键(id),
关键` rp_id `(` rp_id `)
)
发动机= InnoDB默认的字符集utf8评论=红包接收日志表;
两。送红包
因为付款成功后,立即派人到红的聊天
界面,所以红包钱,信息的信封到red_packet表(支付未付),并将大量的计算,一方面打乱插入red_packet_log表后(接收和接收时间是空的),对付款成功后
确认更新red_packet表状态的付款,然后发红包。
三,引导红包(此处只对分组的红包进行分析)
所有红包的先决
条件都要核对一下,请填写你自己的脑子。这里是抢红包一组并发问题(人数红包的战斗,和MQ几十)来
解决。送红包时,先写红包数量,MQ,如3红包,然后写1, 2, 3。抓住从MQ数字值红色的信封,你是几个抢红包第一,相应的red_packet_log表几个红色,其次是更新red_packet_log表接收和接收时间和平衡加钱并保持
运行的业务流程,然后返回接收的结果;没有数字的课程,没有抢到的红包,直接慢镜头接口。早期考虑写MQ的red_packet_log表的主键,可以节省一种先取几条日志记录,但这会使消费这个字段时间更新比较麻烦;使用MQ数字存储,可以直接比较最后的红色(数字和红包的数量),然后更新消费时间。
接收结果微信红页(即有很多运气查看页面):个人和小组的结果是不一样的,红色的信封和领红包的人看到的是不一样的,在单一的一组红色过期
提示是不一样的,在这里不一一列举,是基于数据库
搜索的基本界面。
四。需求变化,新的第三方支付
当涉及到第三方支付,提到的是
同步和异步回调,回调时间和差。APP终端将发送红包的同步回调是成功时。应用程序付款同步回调直接称为回调。如果异步回调慢了一两秒,用户将以0的支付状态抓住红包,如果应用程序端调用长
连接接口来
检查异步回调是否成功,然后发送红色包,用户体验就很差。
#中间状态的介绍
修改表` red_packet `
修改列` pay_status ` tinyint(1)符号的非空默认0评论的付款状态:0支付,支付1、2等
账户后,` for_id `,
添加列` pay_type ` tinyint(1)不为空的默认0评论支付:0未知1,支付宝2,微信3,银联在` pay_status `,
添加列` trade_no ` varchar(30)不为空的默认的评论第三方支付交易号后,` pay_type `;
修改表` red_packet_log `
添加列` is_into_account ` tinyint(1)符号的非空默认0评论是否帐户:0没有,1是在` is_od `;
当用户抢红包,is_into_account的值是根据pay_status确定。
当同步回调应用程序方面,调用接口的变化pay_status付款状态2;
当异步回调到
服务器,付款状态pay_status改到1,对is_into_account = 1 red_packet_log记录处理。
但以上三个
步骤来
查询red_packet更新,否则会有
执行时间和
顺序的问题,导致一些red_packet_log记录不记入is_into_account = 0;同时允许用户抢红包的锁机制会变得很慢,由于锁的释放。
改进如下:(整个课程不更新)
当用户抢红包,is_into_account的值是根据pay_status确定。
当同步回调应用程序方面,调用接口的变化pay_status付款状态2;
当异步回调到服务器,付款状态pay_status改到1,和红色的包ID(red_packet主键)放在MQ;
背景自动
脚本,从MQ得到红包ID后,过程的红包is_into_account = 0的记录,然后延迟5秒重新写红色的包ID的MQ,并执行两处理以保证数据全部记入账户。
五。红包退款
这是一个自动脚本,根据该red_packet表pay_time确定是否超过24小时,没有拿到钱,返回用户平衡。