WeChatパブリックプラットフォーム開発:AccessToken自動(dòng)管理機(jī)構(gòu)
Feb 27, 2017 pm 01:40 PM「WeChatパブリックプラットフォーム開発:一般インターフェースの説明」では、AccessToken(一般インターフェース)の取得方法を紹介しました。
実際の開発プロセスでは、すべての高レベルインターフェイスが AccessToken を提供する必要があるため、高レベルインターフェイスを呼び出すたびに、次のような AccessToken を取得するメソッドを?qū)g行する必要があります:
var accessToken = AccessTokenContainer.TryGetAccessToken(appId, appSecret);
または appId を?qū)g行するときグローバル登録後、次のこともできます:
var accessToken = AccessTokenContainer.GetAccessToken(_appId);
次に、この accessToken を使用して高度なインターフェイスのメソッドに入ります。 たとえば、次のようなメニューを取得できます:
var result = CommonApi.GetMenu(accessToken);
通常、これはすでに非常に単純です。 API呼び出し処理。しかし、そこで終わりではなく、ほぼすべての API 呼び出しを 1 行に短縮するつもりです。
これを行う際、コードを簡(jiǎn)素化することに加えて、次の 2 つの願(yuàn)いもあります:
変更された AccessToken を API が自動(dòng)的に処理できるようにする (ロード バランシングなどの複數(shù)のサーバーが同じ WeChat 公式アカウントを同時(shí)に動(dòng)作させる場(chǎng)合、 AccessToken が外部で更新され、ローカルの AccessToken が無効になる場(chǎng)合があります)、最終的な正しい API 結(jié)果を再度取得して返す必要があります。
現(xiàn)在の API 呼び出しメソッドは変更せず、完全な下位互換性があります。
呼び出しコード
変更後は、この行で API を直接呼び出すことができ、毎回 appId を指定するだけで済みます:
var result = CommonApi.GetMenu(appId);
現(xiàn)在、実行前に、以前と同様に appId と appSecret をグローバルに登録する必要があります。
AccessTokenContainer.Register(_appId, _appSecret);//全局只需注冊(cè)一次,例如可以放在Global的Application_Start()方法中。
ご覧のとおり、元の accessToken は appId に置き換えられ (新しいバージョンでも accessToken の入力をサポートしています)、accessToken を取得するプロセスが不要になっています。具體的な処理については以下で説明します。
SDKソースコード実裝プロセス
以前は、(予期せずに)期限切れのAccessTokenを自動(dòng)的に処理するために、SDKはSenparc.Weixin.MP/AccessTokenHandlerWapper.Do()メソッドを提供していました。このアップグレードにより、AccessTokenHandlerWapper.cs の名前が ApiHandlerWapper.cs に変更され、Do() メソッドが廃止され、TryCommonApi() メソッドが追加されました。 TryCommonApi() メソッドの後:
namespace Senparc.Weixin.MP { /// <summary> /// 針對(duì)AccessToken無效或過期的自動(dòng)處理類 /// </summary> public static class ApiHandlerWapper { /// <summary> /// 使用AccessToken進(jìn)行操作時(shí),如果遇到AccessToken錯(cuò)誤的情況,重新獲取AccessToken一次,并重試。 /// 使用此方法之前必須使用AccessTokenContainer.Register(_appId, _appSecret);或JsApiTicketContainer.Register(_appId, _appSecret);方法對(duì)賬號(hào)信息進(jìn)行過注冊(cè),否則會(huì)出錯(cuò)。 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="fun"></param> /// <param name="accessTokenOrAppId">AccessToken或AppId。如果為null,則自動(dòng)取已經(jīng)注冊(cè)的第一個(gè)appId/appSecret來信息獲取AccessToken。</param> /// <param name="retryIfFaild">請(qǐng)保留默認(rèn)值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)注冊(cè)的AppId,請(qǐng)先使用AccessTokenContainer.Register完成注冊(cè)(全局執(zhí)行一次即可)!"); } } else if (ApiUtility.IsAppId(accessTokenOrAppId)) { if (!AccessTokenContainer.CheckRegistered(accessTokenOrAppId)) { throw new WeixinException("此appId尚未注冊(cè),請(qǐng)先使用AccessTokenContainer.Register完成注冊(cè)(全局執(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時(shí)AppSecret錯(cuò)誤或者access_token無效) { //嘗試重新驗(yàn)證 var accessTokenResult = AccessTokenContainer.GetAccessTokenResult(appId, true); accessToken = accessTokenResult.access_token; result = TryCommonApi(fun, appId, false); } } return result; } } }
次の変更を確認(rèn)できます:
1. 元の accessToken 変數(shù)名が accessTokenOrAppId に変更されます (新しいバージョンのすべての関連インターフェイスはこのように変更されます)。
変更後、このパラメーターは、accessToken (下位互換性) または appId (accessToken を取得する必要はありません) を使用して入力できます。SDK は、文字列の長(zhǎng)さに基づいて、どのタイプのパラメーターに屬するかを自動(dòng)的に決定します。指定できるパラメーターは 3 つあります:
a) appId。 appId を使用するには、事前に appId と appSecret をグローバルに登録する必要があります (前述のとおり)。API 呼び出し中にキャッシュされた AccessToken の有効期限が切れていることが判明した場(chǎng)合、SDK は AccessToken を自動(dòng)的に更新し、正しい結(jié)果が得られることを確認(rèn)するために API リクエストを再試行します。戻ってきた。 。 appId が登録されていない場(chǎng)合は、例外がスローされます。
b) アクセストークン。この場(chǎng)合、accessToken が無効な場(chǎng)合は、再試行せずに、元のリクエスト メソッドが使用されます。
c) null。 accessTokenOrAppId パラメーターが null の場(chǎng)合、SDK はグローバルに登録された最初の appId を自動(dòng)的に取得します。アプリケーションが特定の WeChat ID に対してのみ開発されている場(chǎng)合は、この方法を使用できます。 appId がグローバルに登録されていない場(chǎng)合、例外がスローされます。
2. 元のメソッドで API にアクセスするためのコードはまったく変更されておらず、メソッド return ApiHandlerWapper.TryCommonApi(accessToken =>{...},accessTokenOrAppId) にネストされているだけです。目的 これは、最初のリクエストが失敗した後に、SDK がまったく同じコードを自動(dòng)的に実行できるようにするためです。
この機(jī)能は Senparc.Weixin.MP v12.1 でリリースされました。
WeChat パブリック プラットフォーム開発: AccessToken 自動(dòng)管理メカニズムに関連するその他の記事については、PHP 中國(guó)語(yǔ) Web サイトに注目してください。
ホットAIツール

Undress AI Tool
脫衣畫像を無料で

Undresser.AI Undress
リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover
寫真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中國(guó)語(yǔ)版
中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1
強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)