


Entwicklung der ?ffentlichen WeChat-Plattform: Automatischer Verwaltungsmechanismus von AccessToken
Feb 27, 2017 pm 01:40 PMIn ?WeChat Public Platform Development: Allgemeine Schnittstellenbeschreibung“ habe ich die Methode zum Erhalten von AccessToken (universelle Schnittstelle) vorgestellt.
Im eigentlichen Entwicklungsprozess müssen alle High-Level-Schnittstellen AccessToken bereitstellen. Daher müssen wir jedes Mal, wenn wir die High-Level-Schnittstelle aufrufen, eine Methode ausführen, um das AccessToken zu erhalten, zum Beispiel:
var accessToken = AccessTokenContainer.TryGetAccessToken(appId, appSecret);
Oder nachdem Sie appId und appSecret global registriert haben, k?nnen Sie auch Folgendes tun:
var accessToken = AccessTokenContainer.GetAccessToken(_appId);
Dann verwenden Sie dieses accessToken, um es in die Methode der erweiterten Schnittstelle einzugeben. Wir k?nnen das Menü so erhalten:
var result = CommonApi.GetMenu(accessToken);
Normalerweise ist dies bereits ein sehr einfacher API-Aufrufprozess. Aber damit wollen wir nicht aufh?ren, wir werden fast alle API-Aufrufe auf eine Zeile kürzen.
Dabei haben wir neben der Vereinfachung des Codes auch zwei Wünsche:
Lassen Sie die API das ge?nderte AccessToken automatisch verarbeiten (wenn mehrere Server gleichzeitig arbeiten, z. B. beim Laden). Balancing) Im Falle eines offiziellen WeChat-Kontos kann das AccessToken extern aktualisiert werden, wodurch das lokale AccessToken ungültig wird. Das endgültige korrekte API-Ergebnis muss erneut abgerufen und zurückgegeben werden.
?ndert die aktuelle API-Aufrufmethode nicht und ist vollst?ndig abw?rtskompatibel.
Aufrufcode
Nach der ?nderung k?nnen wir die API wie folgt direkt in einer Zeile aufrufen und müssen jedes Mal nur eine App-ID angeben:
var result = CommonApi.GetMenu(appId);
Derzeit in Vor der Ausführung müssen wir appId und appSecret wie zuvor global registrieren:
AccessTokenContainer.Register(_appId, _appSecret);//全局只需注冊一次,例如可以放在Global的Application_Start()方法中。
Wie Sie sehen k?nnen, wird das ursprüngliche accessToken durch appId ersetzt (die neue Version unterstützt weiterhin die Eingabe von accessToken). Dadurch entf?llt die Notwendigkeit, den AccessToken-Prozess abzurufen. Der spezifische Prozess wird im Folgenden erl?utert.
SDK-Quellcode-Implementierungsprozess
Um (unerwartet) abgelaufene AccessToken automatisch zu verarbeiten, stellte das SDK bisher die Methode Senparc.Weixin.MP/AccessTokenHandlerWapper.Do() bereit. Durch dieses Upgrade wurde AccessTokenHandlerWapper.cs in ApiHandlerWapper.cs umbenannt, die Do()-Methode abgeschafft und die TryCommonApi()-Methode hinzugefügt. Der Code lautet wie folgt:
namespace Senparc.Weixin.MP { /// <summary> /// 針對AccessToken無效或過期的自動處理類 /// </summary> public static class ApiHandlerWapper { /// <summary> /// 使用AccessToken進行操作時,如果遇到AccessToken錯誤的情況,重新獲取AccessToken一次,并重試。 /// 使用此方法之前必須使用AccessTokenContainer.Register(_appId, _appSecret);或JsApiTicketContainer.Register(_appId, _appSecret);方法對賬號信息進行過注冊,否則會出錯。 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="fun"></param> /// <param name="accessTokenOrAppId">AccessToken或AppId。如果為null,則自動取已經(jīng)注冊的第一個appId/appSecret來信息獲取AccessToken。</param> /// <param name="retryIfFaild">請保留默認值true,不用輸入。</param> /// <returns></returns> public static T TryCommonApi<T>(Func<string, T> fun, string accessTokenOrAppId = null, bool retryIfFaild = true) where T : WxJsonResult { string appId = null; string accessToken = null; if (accessTokenOrAppId == null) { appId = AccessTokenContainer.GetFirstOrDefaultAppId(); if (appId == null) { throw new WeixinException("尚無已經(jīng)注冊的AppId,請先使用AccessTokenContainer.Register完成注冊(全局執(zhí)行一次即可)!"); } } else if (ApiUtility.IsAppId(accessTokenOrAppId)) { if (!AccessTokenContainer.CheckRegistered(accessTokenOrAppId)) { throw new WeixinException("此appId尚未注冊,請先使用AccessTokenContainer.Register完成注冊(全局執(zhí)行一次即可)!"); } appId = accessTokenOrAppId; } else { //accessToken accessToken = accessTokenOrAppId; } T result = null; try { if (accessToken == null) { var accessTokenResult = AccessTokenContainer.GetAccessTokenResult(appId, false); accessToken = accessTokenResult.access_token; } result = fun(accessToken); } catch (ErrorJsonResultException ex) { if (!retryIfFaild && appId != null && ex.JsonResult.errcode == ReturnCode.獲取access_token時AppSecret錯誤或者access_token無效) { //嘗試重新驗證 var accessTokenResult = AccessTokenContainer.GetAccessTokenResult(appId, true); accessToken = accessTokenResult.access_token; result = TryCommonApi(fun, appId, false); } } return result; } } }
Der Quellcode der entsprechenden API sah ursprünglich aus so:
/// <summary> /// 獲取當前菜單,如果菜單不存在,將返回null /// </summary> /// <param name="accessToken"></param> /// <returns></returns> public static GetMenuResult GetMenu(string accessToken) { var url = string.Format("https://api.weixin.qq.com/cgi-bin/menu/get?access_token={0}", accessToken); var jsonString = HttpUtility.RequestUtility.HttpGet(url, Encoding.UTF8); //var finalResult = GetMenuFromJson(jsonString); GetMenuResult finalResult; JavaScriptSerializer js = new JavaScriptSerializer(); try { var jsonResult = js.Deserialize<GetMenuResultFull>(jsonString); if (jsonResult.menu == null || jsonResult.menu.button.Count == 0) { throw new WeixinException(jsonResult.errmsg); } finalResult = GetMenuFromJsonResult(jsonResult); } catch (WeixinException ex) { finalResult = null; } return finalResult; }
Jetzt nach Verwendung der TryCommonApi()-Methode:
/// <summary> /// 獲取當前菜單,如果菜單不存在,將返回null /// </summary> /// <param name="accessTokenOrAppId">AccessToken或AppId。當為AppId時,如果AccessToken錯誤將自動獲取一次。當為null時,獲取當前注冊的第一個AppId。</param> /// <returns></returns> public static GetMenuResult GetMenu(string accessTokenOrAppId) { return ApiHandlerWapper.TryCommonApi(accessToken => { var url = string.Format("https://api.weixin.qq.com/cgi-bin/menu/get?access_token={0}", accessToken); var jsonString = HttpUtility.RequestUtility.HttpGet(url, Encoding.UTF8); //var finalResult = GetMenuFromJson(jsonString); GetMenuResult finalResult; JavaScriptSerializer js = new JavaScriptSerializer(); try { var jsonResult = js.Deserialize<GetMenuResultFull>(jsonString); if (jsonResult.menu == null || jsonResult.menu.button.Count == 0) { throw new WeixinException(jsonResult.errmsg); } finalResult = GetMenuFromJsonResult(jsonResult); } catch (WeixinException ex) { finalResult = null; } return finalResult; }, accessTokenOrAppId); }
Wir k?nnen die folgenden ?nderungen beobachten:
1. Der ursprüngliche accessToken-Variablenname wird in accessTokenOrAppId ge?ndert (Alle zugeh?rigen Schnittstellen werden sich in der neuen Version auf diese Weise ?ndern).
Nach der ?nderung kann dieser Parameter mit accessToken (abw?rtskompatibel) oder appId eingegeben werden (es ist kein Zugriff auf accessToken erforderlich). Das SDK bestimmt anhand der Zeichenfolgenl?nge automatisch, zu welchem ??Parametertyp er geh?rt. Es stehen 3 m?gliche Parameter zur Verfügung:
a) appId. Für die Verwendung von appId ist eine globale Registrierung von appId und appSecret im Voraus erforderlich (wie oben erw?hnt). Wenn festgestellt wird, dass das zwischengespeicherte AccessToken w?hrend des API-Aufrufs abgelaufen ist, aktualisiert das SDK automatisch das AccessToken und versucht die API-Anfrage erneut, um sicherzustellen, dass das richtige Ergebnis vorliegt zurückgegeben. Wenn die App-ID nicht registriert wurde, wird eine Ausnahme ausgel?st.
b) accessToken. In diesem Fall wird die ursprüngliche Anforderungsmethode verwendet. Wenn das accessToken ungültig ist, wird direkt eine Ausnahme ausgel?st, ohne dass es erneut versucht wird.
c) null. Wenn der Parameter ?accessTokenOrAppId“ null ist, ruft das SDK automatisch die erste global registrierte App-ID ab. Wenn eine Anwendung nur für eine bestimmte WeChat-ID entwickelt wird, kann diese Methode verwendet werden. Wenn global keine App-ID registriert ist, wird eine Ausnahme ausgel?st.
2. Der Code für den Zugriff auf die API in der ursprünglichen Methode wurde in keiner Weise ge?ndert. Er ist lediglich in der Methode return ApiHandlerWapper.TryCommonApi(accessToken =>{...},accessTokenOrAppId) verschachtelt. delegieren Der Zweck besteht darin, dem SDK zu erm?glichen, automatisch denselben Code auszuführen, nachdem die erste m?gliche Anfrage fehlgeschlagen ist.
Diese Funktion wurde in Senparc.Weixin.MP v12.1 ver?ffentlicht.
Weitere Artikel zur Entwicklung der ?ffentlichen WeChat-Plattform: Automatischer Verwaltungsmechanismus von AccessToken finden Sie auf der chinesischen PHP-Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)