微信的token管理有时候和过期时间不一致,在收到40001错误的时候,应该重新获取token。修改api_common.js方式如下,此代码经过验证可行:
API.prototype.preRequest = function (method, args, retryed) {
var that = this;
var callback = args[args.length - 1];
// 调用用户传入的获取token的异步方法,获得token之后使用(并缓存它)。
that.getToken(function (err, token) {
if (err) {
return callback(err);
}
//修改建议,重发时清除token,重新获取
if(retryed){
token = null;
}
var accessToken;
// 有token并且token有效直接调用
if (token && (accessToken = AccessToken(token.accessToken, token.expireTime)).isValid()) {
// 暂时保存token
that.token = accessToken;
if (!retryed) {
var retryHandle = function (err, data, res) {
// 40001 重试
if (data && data.errcode && data.errcode === 40001) {
return that.preRequest(method, args, true);
}
callback(err, data, res);
};
// 替换callback
var newargs = Array.prototype.slice.call(args, 0, -1);
newargs.push(retryHandle);
method.apply(that, newargs);
} else {
method.apply(that, args);
}
} else {
// 使用appid/appsecret获取token
that.getAccessToken(function (err, token) {
// 如遇错误,通过回调函数传出
if (err) {
return callback(err);
}
// 暂时保存token
that.token = token;
method.apply(that, args);
});
}
});
};