背景
最近项目开发进入前后端联调阶段,本次联调小程序前端和PHP后端,场景是前端输入手机号发送手机验证码,输入3次后必须输入图形验证码,防止机器人暴力枚举。
场景流程前端请求手机验证码发送接口后端判断手机号是否注册过经过3次未验证判断第四次请求会触发验证码验证前端请求验证码后端生成验证码放进去然后直接输出一张图片到浏览器前端带上验证码再次请求手机验证码发送接口后端对发送的验证码进行验证通过后再次进行手机号验证遇到的问题
本地测试的时候一切正常,但是放到测试环境联调的时候发现服务端获取不到,为null
联合调试 Bug 排查
详细故障排除步骤如下
1.查看日志
本来想远程使用,但是由于测试服务器不能直接访问,所以只能通过跳转服务器访问,只能通过日志来排查问题。
在code中添加log,记录每次生成(服务端生成的验证码)以及用户输入的code,本次测试远程测试环境还好,但是上一节请求的时候发现每次都能正常生成,但是获取到的code都是null
2. 前端故障排除
检查了前端,前端可以请求后端接口,可以正常生成验证码,初步确定问题不在前端。
3. 后端故障排除

后端在本地测试和测试环境都一切正常,看上去没什么问题。
4.深入分析
后端可以正常访问,本地测试和测试服务器也都通过了,我想后端应该没有问题,但是前端也说他那边的请求没有问题,显得有些不合理。
于是我深入思考了一下机制,按照机制,服务端采用pair来区分,前端能正常发出请求,后端就能生成,这个过程很顺利,第二次前端发code跟后端比对,后端为null,这个大概就是两次请求不一致导致的。
5. 数据访问
原来是这个原因,由于微信小程序的请求是先经过微信服务器,再由微信服务器转发到我们的接口,并且不附带任何内容,所以每次请求后端接口都是不一样的,这就导致了之前出现的验证码可以正常生成,而在验证阶段无法获取到的原因
6.解决问题
既然用不了,那就用模拟吧,具体思路如下
前端请求手机验证码发送接口,后端判断手机号是否注册过3次都没有验证,第四次请求之后会触发验证码验证,前端请求获取验证码API,请求头带上JWT,后端生成验证码,放到基于JWT生成的key中,存入(key,)中,然后返回图片的编码字符串,前端渲染验证码,再次请求手机验证码发送接口,后端必须带上从前端获取的code,与前端发送的code进行比对,通过后进行后续的代码汇总
这次联调我最大的收获有两点:
1.一定要养成写日志的习惯,如果项目已经部署上线,只有通过日志才能快速定位bug。
2. 善于思考,深入研究一些根本的东西。如果你能从根本上理解某件事,你就能更快地找到解决方案。