网站一旦涉及在线收款,安全就从数据别泄露升级到钱别出错。少收一笔是损失,多发一次货是损失,被人刷出免费订单更是直接的漏洞。这一块没有试错空间。
## 一、金额永远不能由前端说了算
最经典的漏洞:下单时把商品价格从前端传给后端,后端拿到多少就按多少收。结果有人把页面里的数字从 1980 改成 0.01,顺利成交。
正确做法只有一条:前端只传商品编号和数量,价格、折扣、运费全部由服务端根据数据库和当前生效的活动规则重新计算。任何从浏览器过来的金额都不可信。
## 二、回调通知必须验签
收款渠道会在付款成功后回调你的接口通知结果。这个接口是公开的,任何人都能往上面发请求。如果不验签,伪造一条支付成功就能白拿货。
所以回调处理的第一步永远是验证签名,确认这条通知确实来自渠道方且未被篡改。验签通过后还要做第二件事:拿订单号去渠道方主动查一次真实状态,以查询结果为准,而不是完全信任推送内容。
## 三、幂等处理不能少
回调会重复推送——网络抖动、你的接口超时未响应,渠道方就会重试,同一笔支付可能收到五六次通知。
如果每收到一次就发一次货、加一次会员时长,损失是实打实的。处理办法是给订单加状态机:只有处于待支付状态的订单才能被置为已支付,已经处理过的重复通知直接返回成功但不做任何业务动作。关键位置要加数据库层面的唯一约束和行锁,光靠代码判断挡不住并发。
## 四、订单号的设计有讲究
自增数字做订单号,等于把你的日成交量公开给所有人,还方便别人遍历试探。建议用时间戳加随机段的组合,不连续、不可猜。
## 五、对账是最后一道保险
再严密的系统也会有异常单:付了钱状态没更新、回调丢了、退款没同步。所以必须有每日对账机制,把渠道方的流水和自己库里的订单逐笔比对,差异单自动列出来人工处理。
没有对账,问题会一直积累到客户投诉才被发现,那时已经很被动了。
## 六、日志要留但不能乱留
收款全链路的关键节点都要记日志,出问题才能还原。但日志里绝不能出现完整卡号、密钥、签名私钥这类信息,而且日志文件本身不能被外部访问到——这两点栽过跟头的站点不在少数。
商城、订单、收款对接这类定制开发我们做了很多年,安全细节都是踩出来的经验,需要就聊。
—
担心网站被黑、被挂马、被打挂?安全防御、SSL 证书托管、网站加速、插件定制我们都能接。微信 jeans2045、QQ 361611074,先说说你的情况,我们给判断和方案。