问题重现:

在做sign加签的时候,需要时间戳,提示签名失效;问题排查得出因为本地时间和服务器时间不一致导致的

思路:

1. 首先这种时间差,越早知道越好,所以初始化项目(App.vue)时候就去请求接口获取服务器时间戳,uniapp项目
2. 然后和本地时间求差值,存起来,比如服务器时间 - 本地时间,如果结果是正的,说明本地时间落后了,封装一个类,每次请求的时候,本地时间 + 差值 = 服务器时间

服务器时间 - 本地时间 = x;
服务器时间 = 本地时间 + x;

解决过程:

  1. App.vue
 onLaunch: function () {
    loginApi["launchTime"]({})
      .then((res) => {
        var resData = JSON.parse(decrymsg(res.data.value)); //后端返回的数据是加密过得,进行解密
        if (resData.code === "200") {
          var timestamp = resData.data.timestamp; //服务器时间戳
          var myDate = (Date.now() + "").substr(0, 10); //本地时间戳
          var dateDiff = timestamp - myDate; //求差值
          uni.setStorageSync("dateDiff", dateDiff); //保存差值
        }
      })
      .catch((error) => {
        console.log(error);
      });
  },
  1. 封装公共方法
export const Query = () => {
  const dateDiff = uni.getStorageSync('dateDiff')

  let myTimestamp = (Date.now() + '').substr(0,10)
  let timestamp = (parseInt(myTimestamp) + parseInt(dateDiff))
  return {
    timestamp: timestamp,
  }
}

注意:
时间戳转为字符串类型了,所以在计算时候用parseInt()转为number类型,返回一个整数

================= 2022/6/24 ==================
另外,如果涉及到h5和客户端的交互,比如客户端给传一个时间差,这里就有两个容易出错的地方需要注意下

1)确保h5和客户端用的同一种计算方式;项目中我们用的是 客户端时间 - 服务端时间 = 时间差;客户端传给我一个计算后的时间差,我这边用同一个计算方式,所以 服务器时间 = 获取用户本机时间 - 时间差
2)单位要一致;客户端给的时间差是秒单位,我需要把客户端时间转成秒单位,再相减,这部分就是这次出错的原因,一开始用的毫秒,所以需要截取10位成为秒

Logo

前往低代码交流专区

更多推荐