有些时候本地如APP客户端的当前时间与服务器时间严重不符合, 会导致诸如限时抢单、倒计时计算等场景出问题 。同样限制60秒,有的客户端可以轻松绕过限制。这就变相造成一种使用不公的现象。因此需要做规避。
采用的做法是服务器新开接口返回最新时间戳,然后与客户端的当前时间戳对比,计算客户端是相对于服务器慢还是快。从而纠正时间错位。
/**
* 本地和服务器比较 同步服务器时间戳
*/
sync_server_timestamp() {
this.post('common', 'timestamp', {}, (res) = > {
var finish_timestamp = this.timestamp(true);
if (res.status == 1) {
var server_timestamp = parseInt(res.data);
console.log("当前服务器时间:", server_timestamp);
console.log("当前本地时间:", finish_timestamp);
common.time_diff = finish_timestamp - server_timestamp;
console.log("本地与服务器时间差:", common.time_diff);
}
});
}
初始化time_diff为一个很大值 如果大于0 说明本地时间比较快
计算出实际的时间差 此处为延迟操作
var timestamp = api.timestamp(true);
//检测是否为顺路单
console.log("本地与服务器时间差:", this.g.time_diff);
var rest_sec = 0;
if (this.g.time_diff > -9999) {
//转换为服务器时间的比较
rest_sec = order.stopped_at - (timestamp - this.g.time_diff);
} else {
rest_sec = order.stopped_at - timestamp;
}
演示倒计时操作
//检测是否需要延迟显示
if (this.g.setting.take_order_downcount > 0) {
this.g.setting.take_order_downcount = parseInt(this.g.setting.take_order_downcount);
var take_order_downcount = 0;
if (this.g.time_diff > -9999) {
//转换为服务器时间的比较
take_order_downcount = this.g.setting.take_order_downcount - ((timestamp - this.g.time_diff) - order.pay_time);
} else {
fun.tips('请校对本地时间');
return false;
}
if (take_order_downcount > 0) {
order.take_order_downcount = take_order_downcount;
} else {
order.take_order_downcount = 0;
}
} else {
//不开启倒计时
order.take_order_downcount = 0;
}
为了避免有人修改本地时间恶意操作,需要在APP App.vue 文件的应用生命周期的 onHide 和 onShow 做处理 及时同步时间 保证应用每一次切换状态都会及时更新内容