今天运营反映了一个问题:用户在微信小程序端提交实名认证信息时,提示“不支持信用卡”。

直觉告诉我们,既然提示是“不支持信用卡”,那看来用户输入的银行卡号是信用卡。接下来直接去auth生产库的卡bin表查证,却发现此卡是借记卡。

显然,是程序出了问题。
我们看如下用户实名信息提交的处理时序,可见,卡bin验证的链路涉及到bosskg-api、bosskg-rpc-provider、auth-gateway、auth-channel四个服务。其中,bosskg-rpc-provider、auth-gateway、auth-channel还都是双节点。查找原因要从每个服务的log文件来定位。

一顿查询后,原来竟然是由于卡号带有空格导致的。如下是auth-channel程序最终执行的sql。因为这个空格,导致未能检索到那条卡bin数据。
接着,再来看bosskg-api的请求log,果然,用户输入的卡号末尾包含了一个空格字符!而bosskg-rpc-provider的在接收到auth响应之后的判断逻辑是:如果 !"01".equals(cardBin.cardType),则返回“不支持信用卡”,而并没有判断cardBin.cardType是否为空值。这样的逻辑,最终误导了我们对问题的判断。

真相大白了!
我们有理由抱怨用户的“粗心”吗?
运营人员可以跟客户反馈,别输入空格。
之于我们程序员,之于我们的程序,我经常强调,还是要兼容用户的输入。就拿卡号来说,首先一定要先做trim处理,其次,要兼容卡号中间带有空格的情况。另一个同样不容忽视的改进点,是上面的对响应结果的判断逻辑。
否则,当我们在排查问题时,对于复杂的分布式系统,往往会非常耗费时间。
easier said than done. 这些与你的技术水平无关,日常开发中,稍加严谨一些,这些不必要的问题都可避免。
















