PHP获取微信access_token后全局缓存与更新

access_token是微信公众号开发的全局唯一票据,公众号开发必须要用到access_token。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

access_token的请求次数是有限制的,所以不能每次都重新请求,只有将它缓存到本地了。

 

 function accessToken() {
    $tokenFile = "./access_token.txt";//缓存文件名
    $data = json_decode(file_get_contents($tokenFile));
    if ($data->expire_time < time() or !$data->expire_time) {
    $appid = "你的appid";
    $appsecret = "你的appsecret";
    $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret";
      $res = getJson($url);
      $access_token = $res['access_token'];
      if($access_token) {
        $data['expire_time'] = time() + 7000;
        $data['access_token'] = $access_token;
        $fp = fopen($tokenFile, "w");
        fwrite($fp, json_encode($data));
        fclose($fp);
      }
    } else {
      $access_token = $data->access_token;
    }
     return $access_token;
  }
   
 //取得微信返回的JSON数据
 function getJson($url){
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  $output = curl_exec($ch);
  curl_close($ch);
  return json_decode($output, true);
}

C#微信公众平access_token的获取存储与更新

要解决的问题
 
1、如何获取access_token。
 
2、由于access_token的有效期为7200秒,即2小时,并且重复获取将导致上次获取的access_token失效,获取access_token的api调用次数非常有限,所以要解决如何全局存储与更新access_token。
 
思路
 
1、将access_token存储在数据库中。
 
2、何时更新access_token呢?当access_token失效的时候更新,那么怎么判断access_token有没有失效呢?使用当前的access_token请求微信接口,获取自定义菜单,如果返回的errcode为42001,则说明access_token已经失效,这时再重新获取access_token。
 
代码:
 
1、Http请求代码(HttpRequestUtil类):

#region 请求Url,不发送数据
/// <summary>
/// 请求Url,不发送数据
/// </summary>
public static string RequestUrl(string url)
{
    return RequestUrl(url, "POST");
}
#endregion
 
#region 请求Url,不发送数据
/// <summary>
/// 请求Url,不发送数据
/// </summary>
public static string RequestUrl(string url, string method)
{
    // 设置参数
    HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
    CookieContainer cookieContainer = new CookieContainer();
    request.CookieContainer = cookieContainer;
    request.AllowAutoRedirect = true;
    request.Method = method;
    request.ContentType = "text/html";
    request.Headers.Add("charset", "utf-8");
 
    //发送请求并获取相应回应数据
    HttpWebResponse response = request.GetResponse() as HttpWebResponse;
    //直到request.GetResponse()程序才开始向目标网页发送Post请求
    Stream responseStream = response.GetResponseStream();
    StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
    //返回结果网页(html)代码
    string content = sr.ReadToEnd();
    return content;
}
#endregion

2、辅助方法(Tools类):

namespace SWX.Utils
{
    /// <summary>
    /// 工具类
    /// </summary>
    public class Tools
    {
        #region 获取Json字符串某节点的值
        /// <summary>
        /// 获取Json字符串某节点的值
        /// </summary>
        public static string GetJsonValue(string jsonStr, string key)
        {
            string result = string.Empty;
            if (!string.IsNullOrEmpty(jsonStr))
            {
                key = "\"" + key.Trim('"') + "\"";
                int index = jsonStr.IndexOf(key) + key.Length + 1;
                if (index > key.Length + 1)
                {
                    //先截逗号,若是最后一个,截“}”号,取最小值
                    int end = jsonStr.IndexOf(',', index);
                    if (end == -1)
                    {
                        end = jsonStr.IndexOf('}', index);
                    }
 
                    result = jsonStr.Substring(index, end - index);
                    result = result.Trim(new char[] { '"', ' ', '\'' }); //过滤引号或空格
                }
            }
            return result;
        }
        #endregion
 
    }
}

3、判断access_token是否过期(WXApi类):
 

#region 验证Token是否过期
/// <summary>
/// 验证Token是否过期
/// </summary>
public static bool TokenExpired(string access_token)
{
    string jsonStr = HttpRequestUtil.RequestUrl(string.Format("https://api.weixin.qq.com/cgi-bin/menu/get?access_token={0}", access_token));
    if (Tools.GetJsonValue(jsonStr, "errcode") == "42001")
    {
        return true;
    }
    return false;
}
#endregion

4、请求微信接口,获取access_token(WXApi类):
 

#region 获取Token
/// <summary>
/// 获取Token
/// </summary>
public static string GetToken(string appid, string secret)
{
    string strJson = HttpRequestUtil.RequestUrl(string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appid, secret));
    return Tools.GetJsonValue(strJson, "access_token");
}
#endregion
5、全局存储与更新access_token(AdminUtil类):
 
#region 获取access_token
/// <summary>
/// 获取access_token
/// </summary>
public static string GetAccessToken(PageBase page)
{
    string access_token = string.Empty;
 
    UserInfo user = GetLoginUser(page);
    if (user != null)
    {
        if (string.IsNullOrWhiteSpace(user.access_token)) //尚未保存过access_token
        {
            access_token = WXApi.GetToken(user.AppID, user.AppSecret);
        }
        else
        {
            if (WXApi.TokenExpired(user.access_token)) //access_token过期
            {
                access_token = WXApi.GetToken(user.AppID, user.AppSecret);
            }
            else
            {
                return user.access_token;
            }
        }
 
        MSSQLHelper.ExecuteSql(string.Format("update SWX_Config set access_token='{0}' where UserName='{1}'", access_token, user.UserName));
    }
 
    return access_token;
}
#endregion

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索存储
, string
, 数据
, 缓存
, static
代码
全局缓存access token、全局access token、java全局缓存token、微信access token缓存、java缓存access token,以便于您获取更多的相关知识。

时间: 2024-11-05 17:31:42

PHP获取微信access_token后全局缓存与更新的相关文章

PHP定时任务获取微信access_token的方法_php技巧

本文实例讲述了PHP定时任务获取微信access_token的方法.分享给大家供大家参考,具体如下: 微信access_token在开发时会变的好像是几分种不一样了,这里我们来介绍关于PHP定时任务获取微信access_token的方法. 最近开发微信公众平台,公众号调用各接口时都需使用access_token,access_token是公众号的全局唯一接口调用凭据,开发时需要进行妥善保存. access_token有效期为7200秒 ,重复获取将导致上次获取的access_token失效. 由

wx-大家感觉这种获取微信Access_Token方法如何

问题描述 大家感觉这种获取微信Access_Token方法如何 public class WxTokenUtil { private static String FileName = "WxTokenUtil.properties"; private static String APPID = "fsdafsd"; private static String APPSECRET = "dfsdsaf"; public synchronized s

PHP定时任务获取微信access_token的例子

最近开发微信公众平台,公众号调用各接口时都需使用access_token,access_token是公众号的全局唯一接口调用凭据,开发时需要进行妥善保存. access_token有效期为7200秒 ,重复获取将导致上次获取的access_token失效. 由于微信对获取access_token的api调用次数做了限制,建议开发者全局存储与更新access_token,频繁刷新access_token会导致api调用受限,影响自身业务. 那么有什么好的解决access_token存储和刷新的办法

哪位大神知道怎么获取微信群红包抢完后的结果,网页微信或者电脑微信

问题描述 哪位大神知道怎么获取微信群红包抢完后的结果,网页微信或者电脑微信我在winformC#开发的. 解决方案 解决方案二:如果有什么接口调用数据也可以..就是过不了这个难关.不知道从哪里获取解决方案三:哪位大神知道请指导一下..或者有例子发一个给我..红包答谢...解决方案四:这应该去安卓或者IOS论坛里去问吧.解决方案五:引用3楼sgyiliya的回复: 这应该去安卓或者IOS论坛里去问吧. 我是在winform里写他个程序想获取到这些红包详情,在电脑里用的,不是手机上用的.解决方案六:

微信公众号开发系列-获取微信OpenID

在微信开发时候在做消息接口交互的时候需要使用带微信加密ID(OpenId),下面讲讲述2中类型方式获取微信OpenID,接收事件推送方式和网页授权获取用户基本信息方式获取. 1.通过接收被动消息方式获取OpenId(接收事件推送方式),以下事件中都可以获取到OpenID 关注/取消关注事件 用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL.方便开发者给用户下发欢迎消息或者做帐号的解绑. 微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次 关于重试的消息排

Magicodes.WeiChat——使用OAuth 2.0获取微信用户信息

使用Magicodes.WeiChat,可以很方便的获取到微信用户的信息.在使用OAuth 2.0之前,你先需要做以下操作: 1)在开发者中心修改[网页授权获取用户基本信息],在弹出的界面输入自己的根域名.比如:weichat.chinacloudsites.cn 如下图所示: 2)配置菜单或者链接(如果使用特性"WeChatOAuth",本步骤可以略过,这里只是介绍下原理,具体请参考步骤3的说明).Magicodes.WeiChat在控制器WeiChatController中进行处理

微信公众号openid-如何获取微信公众号的openid

问题描述 如何获取微信公众号的openid 初学者,希望能有好心人详细的帮忙讲解一下,有人说网络授权可以获取,但是没有懂.最好能私聊,谢谢啦 解决方案 获取openid 有两种办法 , 一个是当用户关注的时候可以获取他的openid 在关注事件里面获得,二就是授权了,两种都可以.第一种的话就是在 用户关注的时候 你把他的openid 写到数据库中存起来备用.就算他取消关注了 也可以发红包给openid. 第二种授权就是一个按钮 上面写着 是否将头像. 信息可以让某某公众号获取(大概就是这个意思)

Android获取应用程序大小和缓存的实例代码_Android

info package com.qin.appsize; import android.content.Intent; import android.graphics.drawable.Drawable; //Model类 ,用来存储应用程序信息 public class AppInfo { private String appLabel; //应用程序标签 private Drawable appIcon ; //应用程序图像 private Intent intent ; //启动应用程序

Android获取应用程序大小和缓存的实例代码

info package com.qin.appsize; import android.content.Intent; import android.graphics.drawable.Drawable; //Model类 ,用来存储应用程序信息 public class AppInfo { private String appLabel; //应用程序标签 private Drawable appIcon ; //应用程序图像 private Intent intent ; //启动应用程序