关于微信获取access_token在同一服务器覆盖的解决方法

今天公司要求做一个接微信硬件,代码完成后,测试时(使用的不同的公众号),发现一台手机关注后计入应用界扫描成功后,其他的都无法扫描成功,进过测试,发现了一个坑,就是access_token的覆盖。当一台手机扫描后,如果使用其他手机再次扫描,由于access_token的有效时间还在,那么就会使用之前的access_token,这样扫描不会成功,因此解决这个坑就需要在每个不同公众号id下管理一个access_token,这样就不会出现问题。

之前我们保存了access_token是这样的;

 private static string mToken = "";//微信access_token
 private static DateTime mGetTokenTime;//本次获取access_token的时间 access_token每110分钟超时一次

这样不同的公众号id其实在7200秒内是相同的access_token,会出现覆盖的问题

因此修改变量代码;

 private static Dictionary<string, string> mTokenList = new Dictionary<string, string>();//微信access_token集合 解决同一台服务器变量替换的问题 
 private static Dictionary<string, DateTime> mTokenTimeList = new Dictionary<string, DateTime>();//本次获取access_token的时间集合 access_token每100分钟超时一次

这样一来的每一个键值都保存不同的access_token。

在获取access_token时就应该通过键值对来获取:

 private static string getMToken(string appId)
  {
            string access_token= (mTokenList.Count > 0 && mTokenList.ContainsKey(appId) ? mTokenList[appId] : "");
            return access_token;
  }

时间差

private static bool timeOut(string appId)
        {
            if (mTokenTimeList.Count == 0) {
                return true;
            }
            if (!mTokenTimeList.ContainsKey(appId))
            {
                return true;
            }
            TimeSpan ts = new TimeSpan(DateTime.Now.Ticks - mTokenTimeList[appId].Ticks);
            return ts.Minutes > 110;
 }

获取access_token:

public static void GetAccessToken(string  appId, string appSecret)
        {
            string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;
            string content = WebApply.GET(url);
            if (!content.Contains("errcode"))
            {
                string wxtoken=content.Replace("\"", "").Split(new char[] { ',' })[0].Split(new char[] { ':' })[1];
                if (mTokenList.ContainsKey(appId))
                {
                    mTokenList.Remove(appId);
                }
                mTokenList.Add(appId, wxtoken);
                if (mTokenTimeList.ContainsKey(appId))
                {
                    mTokenTimeList.Remove(appId);
                }
                mTokenTimeList.Add(appId, DateTime.Now);
            }
        }

同理在获取jsapi_ticket的时候也需要使用键值对来保存。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值