Heim  >  Artikel  >  WeChat-Applet  >  C# WeChat öffentliche Plattformentwicklung, Erwerb, Speicherung und Aktualisierung von access_token

C# WeChat öffentliche Plattformentwicklung, Erwerb, Speicherung und Aktualisierung von access_token

高洛峰
高洛峰Original
2017-01-17 10:46:262147Durchsuche

1. Was ist access_token?

access_token ist das global eindeutige Ticket des öffentlichen Kontos. Das öffentliche Konto muss beim Aufruf jeder Schnittstelle access_token verwenden. Unter normalen Umständen ist das access_token 7200 Sekunden lang gültig. Eine wiederholte Erfassung führt dazu, dass das letzte access_token ungültig wird. Da die Anzahl der API-Aufrufe zum Abrufen von access_token sehr begrenzt ist, wird empfohlen, dass Entwickler access_token global speichern und aktualisieren. Eine häufige Aktualisierung von access_token schränkt API-Aufrufe ein und beeinträchtigt ihr eigenes Geschäft.

2. Zu lösende Probleme

1. So erhalten Sie access_token.

2. Da die Gültigkeitsdauer von access_token 7200 Sekunden, also 2 Stunden, beträgt und eine wiederholte Erfassung dazu führt, dass das letzte access_token ungültig wird, ist die Anzahl der API-Aufrufe zum Abrufen von access_token sehr begrenzt ist notwendig, um zu lösen, wie access_token global gespeichert und aktualisiert wird.

3. Ideen

1. Access_token in der Datenbank speichern.

2. Wann wird das access_token aktualisiert? Aktualisieren, wenn access_token abläuft. Wie kann man also feststellen, ob access_token abgelaufen ist? Verwenden Sie das aktuelle access_token, um die WeChat-Schnittstelle zum Abrufen des benutzerdefinierten Menüs anzufordern. Wenn der zurückgegebene Fehlercode 42001 ist, bedeutet dies, dass das access_token abgelaufen ist. Rufen Sie zu diesem Zeitpunkt erneut das access_token ab.

Datenbankdesign (Tabellenname SWX_Config):

C# WeChat öffentliche Plattformentwicklung, Erwerb, Speicherung und Aktualisierung von access_token

4. Code:

1. HTTP-Anfragecode (HttpRequestUtil-Klasse):

#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. Hilfsmethode (Tools-Klasse):

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(&#39;"&#39;) + "\"";
    int index = jsonStr.IndexOf(key) + key.Length + 1;
    if (index > key.Length + 1)
    {
     //先截逗号,若是最后一个,截“}”号,取最小值
     int end = jsonStr.IndexOf(&#39;,&#39;, index);
     if (end == -1)
     {
      end = jsonStr.IndexOf(&#39;}&#39;, index);
     }
 
     result = jsonStr.Substring(index, end - index);
     result = result.Trim(new char[] { &#39;"&#39;, &#39; &#39;, &#39;\&#39;&#39; }); //过滤引号或空格
    }
   }
   return result;
  }
  #endregion
 
 }
}

3. Bestimmen Sie, ob das access_token abgelaufen ist (WXApi-Klasse):

#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. Fordern Sie die WeChat-Schnittstelle an, erhalten Sie access_token (WXApi-Klasse):

#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. Globaler Speicher und aktualisieren Sie access_token (AdminUtil-Klasse):

#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=&#39;{0}&#39; where UserName=&#39;{1}&#39;", access_token, user.UserName));
 }
 
 return access_token;
}
#endregion

Das Obige ist der gesamte Inhalt dieses Artikels , Ich hoffe, es wird für alle hilfreich sein, die bei der Entwicklung der öffentlichen WeChat-Plattform helfen.

Weitere Artikel zum Erwerb, zur Speicherung und Aktualisierung von access_token in der Entwicklung öffentlicher C#-WeChat-Plattformen finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn