首页 / 老黄历

取件码总对不上,先别急着重建整套流程

取件码总对不上,先别急着重建整套流程

我见过最典型的取件一次返工,是码总朋友在小区驿站折腾了一下午。他本来只想给自己店里加一个"取件码"功能,上先结果第一版把六位数字直接写在短信正文里,别急第二版改成小程序弹窗,着重第三版又想接扫码枪。建整做到第三天,套流三个入口的取件码规则不一样,老客户的码总旧短信还能点开,新客户的上先弹窗却提示"码已失效"。他问我怎么办,别急我说先停手,着重把已经发出去的建整东西盘一遍——这比再写第四版重要得多。

很多人搜"从零开始做取件码安全看什么",套流脑子里想的取件是加密算法怎么选、接口怎么签名。这些当然要看,但真正让项目卡住的,往往不是"没从零开始",而是"已经做错了还在往前推"。下面按失败后怎么回退来讲,顺序和常规教学是反的。

先把已经流出去的码列成一张清单

停手的第一步不是改代码,是盘点。把目前存在过的码形态全写下来:短信里的纯数字、贴在包裹上的手写编号、小程序弹窗、客服口头报的临时码。每一类标注三件事——谁看得到、能重复用几次、过期后系统会不会主动作废。

这张清单最容易暴露问题。比如朋友那套系统,短信码是永久有效的,因为当初图省事没设失效时间;弹窗码却有十分钟限制。同一个用户,收到短信的能用一年,用弹窗的十分钟后就打不开。这不是安全强度的问题,是规则自相矛盾,用户只会觉得"你们的码时灵时不灵"。

清单列完,通常会发现有一两类码根本没人维护,却还在被使用。这类入口应当先关停或收回,而不是等新方案上线再一起换。回退的顺序是:先停掉最不可控的入口,再谈替换。

换人核对:让没写过这段代码的人走一遍取件

自己测自己的系统,几乎必然漏。写代码的人知道"这个码要在小程序里点开",于是测试时永远从正确入口进。真实场景里,用户可能把短信转发给家人、截图发到群里、把数字念给驿站小哥。

所以失败之后要做的是换人:找一个完全没参与开发的人,只给他一条真实短信,让他完成取件。观察他第一反应点哪里、卡在哪一步、会不会把码截图发出去。这一步不需要写测试用例,需要的是旁观。很多"取件码安全"的漏洞不是被攻破的,是被正常用户的操作习惯绕开的——截图转发、口头复述、长期保存,都是设计时没考虑到的路径。

如果换人测试发现码被截图后仍能无限次使用,那就说明单码单次的设计没做到。此时不要急着加验证码,先确认业务上是否允许"一码多人用"。不允许,就得让码与收件人绑定,而不是只与包裹绑定。

回退时保留旧码的只读通道,别一刀切

反复失败的项目常犯另一个错:新方案一上线,旧入口立刻关死。结果老客户的短信点开是空白页,客服电话被打爆。

比较稳的回退方式是留一个只读通道:旧码仍然可以查询"这个包裹还在不在",但不能再凭旧码完成取件,页面提示去哪个新入口重新获取。这样既不扩大旧码的使用面,也不让用户面对一个死链接。要注意的是,只读通道本身也要有频率限制,否则会变成新的枚举入口。

另一个反例来自我见过的一个自提柜项目。他们发现问题后直接把所有旧码批量作废,没有提前通知,结果当天几十个包裹卡在柜子里,只能人工开柜。作废本身没错,错在没给过渡窗口。回退动作要配一个明确的时间点,并让驿站或客服知道这个时间点,否则一线人员只能临时想办法,反而制造出更多口头码。

用一张核对表决定"继续改"还是"换方案"

停手盘点、换人走查、留只读通道之后,再决定下一步。可以用下面这张表自检,每项只答是或否:

码是否有明确的失效时间,且失效后服务端拒绝,而不是靠前端隐藏;同一码是否限制使用次数,超限后是否有记录;码是否与收件人信息绑定,换人使用是否会被拦截;旧入口是否已停止发放新码,只保留查询;客服和驿站是否知道当前唯一有效的取码方式;日志里能否查到某个码在什么时间被谁用过。

这张表里只要有两项是否,就不建议继续在旧结构上打补丁。打补丁的典型结果是又长出一套并行规则,下一次失败只是时间问题。这时候该做的是换方案,而不是换参数。

回到开头那位朋友,他最后没有写第四版。他把短信码改成限时且一次性,弹窗码复用同一套服务端校验,旧短信只保留查询入口,然后让店里没碰过代码的店员用自己手机走了一遍取件。走完发现店员习惯把码念给驿站小哥听,于是又在页面上去掉了完整码的常驻显示,改成点击后才展开。这些调整都不复杂,但顺序对了:先停、先盘、先换人看,再动手。做取件码这件事,安全与否往往不取决于第一行代码写得多漂亮,而取决于发现不对时,愿不愿意先把手停下来。

作者:文化常识