在处理类似alipay支付callback的时候,假如一种极限情况,2次callback之间只差几毫秒,如何只让第一次callback生效。 正常逻辑是只要成功callback后,就会把订单给标记为已处理状态,但是假如出现了极限情况(实际中应该是没有的,就是怕有人恶意刷),就是两次callback的间隔时间很短,在第一次callback处理后还没来得及把订单改为已处理状态,这个时候第二次callback又进来。 如何保证只生效一次呢?
支付callback不可能上一次请求还没有完成相差几毫秒就请求第二次。重要的应该是做好callback接口的安全吧,都能被人知道了,可以先关站了。。
一般支付的接口肯定提供了去重的方法,你说的极限几毫秒,基本不可能;假如有这种情况,可以先用标志位或者其他方式“锁”住订单状态,处理完成之后放开。可以考虑使用队列或redis一类的来缓存请求,重复请求过滤掉。这只是我的一点点想法,错了不负责0.0
@DevinXian 其实我想问的技术点就是队列相关的技术点。 有相关的资料吗? 想了解了解
锁住呗。 队列相关知识点?具体点?
@alsotang 能把这个锁住具体点吗? 一般是怎么锁呢? 数据库里锁吗? 还是有哪些常用的技术呢?
redis setnx 可以锁
@magicdawn 多谢,我看看
这个概念在编程领域就叫锁,你只要知道要用锁的概念解决就走上正道了。
@stonephp 嗯,谢谢。但是就是一直没找到相关的资料。
@imhered 其实利用mysql的update就能简单的实现。 操作前先对记录执行update操作,修改lock字段,当修改成功,并且告诉你影响了一行数据,说明你申请锁成功,之后去执行操作。mysql因为有写锁,所以利用这个就可以了。
所有涉及到金钱的地方都要这么做,否则很容易被高频攻击利用你的漏洞。 比如充值,充值成功你会修改用户账户余额,如果你不做锁,那么同一时刻人家向你发起1w次请求,想想看你的程序会如何。搞不好真会给用户充值一万次。
mark