November 17, 2017

一次公司产品微信客户端的BUG

公司的产品是深圳“高交会”参展,而我负责编写微信客服端出现了严重的问题。

那是一款测量身体指标,并且能播放视频广告,用户的测量操作由微信端完成。改代码以前由公司的员工维护,现在我入职并接手了客服端代码。看了原先代码,真是惨不忍睹,然后逼着自己重写接近95%的代码。

这次BUG的情况是,界面有时能显示用户消息,有时不能。iPhone出现的错误次数大于Android设备(仅仅是猜测,未做验证)。反复测试代码的时候,发现是自己代码中,把回调方法玩弄丢了。

// 三个方法都包含异步操作

function a(callback){
  const value = 1;
  callback(null, value); 
  // 程序到这就执行完毕了,方法c中的getB不会被执行,do something部分也就不执行了。
}

function b(){
  const that = this;
  a(function(err, result){
    that.value = result;
  });
}

b.property.getB = function(callback){
  callback(null, this.value);
}

function c(callback){
  new b().getB(callback);
}

c(function(err, result){
  // do something.
});

这个BUG,也不仅仅由回调方法的错误造成的。项目是前后端分离,微信客户端完全由HTMLJavaScript处理业务逻辑,请求分加密和匿名。

在加密请求中,需要在url添加timestempnoncesignature这些参数。服务器会根据timestemp判断这次请求的是否处理过长,根据服务器时间与timestemp的时差,判断请求是否超时。这是会遇到一个问题,如果服务器时间和客服端时间不同步,时差过大,就导致数据请求不通过。解决的方案就是,获取服务器时间再计算客户端timestemp参数。