TOKEN タイマーリフレッシュ1. 背景パブリックプラットフォームのAPI機能を使用したことがある開発者にとって、access_tokenは間違いなく馴染みのあるものです。それはまるで家のドアを開ける鍵のようなものです。これさえあれば、パブリックプラットフォームのほとんどのAPI機能を使用できます。そのため、開発者にとって、access_token の使い方が特に重要になります。 API インターフェースの日常的な操作では、さまざまな質問に遭遇することがよくあります。なぜ access_token が突然無効になったのか?取得した access_token が 10 分後に期限切れになったのはなぜですか?これらの質問に答えるために、開発者が access_token の使用方法を理解できるように、access_token の設計ソリューションを提供します。 access_tokenを取得するには、パブリックプラットフォームの公式ドキュメントを参照してください: auth.getAccessToken、Get Access token 2. access_tokenの内部設計2.1 access_tokenの適時性ご存知のとおり、access_token は appid と appsecret によって生成されます。インテリアデザインの手順は次のとおりです。 (1)開発者はhttpsを使用してGET https://API.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRETをリクエストし、appidとapppsecretのパラメータを渡します。 (2)パブリックプラットフォームバックエンドは、appidとハッシュ(appsecret)がストレージと一致するかどうかを確認します。一致する場合は、現在のタイムスタンプに基づいて新しいaccess_tokenが生成されます。 (3)新しいaccess_tokenが生成されると、古いaccess_tokenの有効期限のタイムスタンプが現在のタイムスタンプに更新されます。 (4)新しいaccess_tokenを開発者に返します。 以下は、古いトークンと新しいトークンを切り替えるプロセスを示す図です。 上の図から注目すべき点がいくつかあります。 (1)パブリックプラットフォームストレージ層には、新旧のaccess_tokenのみが保存されるため、開発者がインターフェースを3回呼び出すと、最も古いaccess_tokenが直ちに無効になります。 (2)新しいアクセストークンを要求した後、古いアクセストークンの有効期限は現在時刻に更新されますが、すぐに無効になるわけではありません。原理については、[2.2 アクセストークンの段階的な有効期限切れ]を参照してください。 (3)情報セキュリティ上の理由から、パブリックプラットフォームはappsecretをプレーンテキストで保存せず、appidとappsecretのハッシュ値のみを保存します。したがって、開発者は appsecret を適切に保持する必要があります。アプリシークレットが漏洩した疑いがある場合は、すぐにmp.weixin.qq.comにログインしてアプリシークレットをリセットする必要があります。 2.2 access_tokenの段階的な有効期限[access_tokenの適時性]から、開発者が新しいaccess_tokenを要求すると、古いaccess_tokenの有効期限が現在の時間に更新されますが、パブリックプラットフォームが[新しいaccess_tokenと古いaccess_tokenの交代のための5分間のバッファ時間]を提供するため、すぐに無効にならないことがわかります。そのため、access_tokenとも呼ばれます。 徐々に失敗する。 実装の原則は次のとおりです。
上の図から注目すべき点がいくつかあります。 (1)デバイスの時間同期の違いにより、開発者は、古い access_token を使用した API インターフェースへのリクエストの一部が成功し、他のリクエストが失敗するという状況に遭遇する可能性があります。開発者は、新しい access_token を入手したらできるだけ早く使用することをお勧めします。 (2)2つの図からわかるように、開発者にとってaccess_tokenはランダムに調整できない非常に重要なインターフェースです。access_tokenが無効になる可能性のある複数のリクエストを回避するために、開発者はaccess_tokenを統一的に管理することをお勧めします。 3. access_tokenの一元管理
次の例は、ミニプログラムのクラウド関数側での index.js は 他の端末の場合は const クラウド = require('wx-server-sdk') クラウド.init({ 環境: cloud.DYNAMIC_CURRENT_ENV }) 定数timeutil = require('./timeutil'); // 変更が必要な構成項目 const APPSECRET = '' 定数 axios = require('axios'); 定数db = cloud.database(); // 構成情報を定期的に更新して取得します const CONFIG = 'cloud-token'; // トークンを取得する 定数 URL = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}' 関数 getAccessToken(APPID,APPSECRET){ url = URL とします。 url = url.replace('{APPID}',APPID) url = url.replace('{APPSECRET}',APPSECRET) 新しいPromise(function(resolve,reject){を返す axios.get(url).then(function (response) { console.log(応答); 解決(応答) }) .catch(関数 (エラー) { コンソール.log(エラー); 拒否(エラー) }); }) } // クラウド関数エントリ関数 exports.main = async (event, context) => { 定数 wxContext = cloud.getWXContext() // 現在のアプリケーションのAPPIDを自動的に取得する var APPID = wxContext.APPID; 新しいPromise(function(resolve,reject){を返す getAccessToken(APPID,APPSECRET).then(async res=>{ コンソール.log(res) access_token を res.data.access_token とします。 ans = を待機します db.collection(CONFIG).doc('access_token').set({ データ:{ 値:access_token、 _updateTime:timeutil.TimeCode() } }) 解決する }) }) } config.json タイマートリガー 1時間ごとにトリガー { 「トリガー」: [ { "名前": "myTrigger", "タイプ": "タイマー", "設定": "0 0 * * * * *" } ] } timeutil.js 時間ツールクラス 関数TimeCode() { var date = 新しい Date(); var 年 = date.getFullYear() var 月 = date.getMonth() + 1 var 日 = date.getDate() var 時間 = date.getHours() var 分 = date.getMinutes() var 秒 = date.getSeconds() [年、月、日].map(formatNumber).join('-') + ' ' + [時、分、秒].map(formatNumber).join(':') を返します。 } //日付を取得する function _formatTime(time) { var date = time.getFullYear() + '年' + time.getMonth() + '月' + time.getDate() + '日' var ftime = time.getHours() + '時間' + time.getMinutes() + '分' + time.getSeconds() + '秒' 日付 + ftime を返します。 } 関数 TimeCodeYmd(){ var date = 新しい Date(); var 年 = date.getFullYear() var 月 = date.getMonth() + 1 var 日 = date.getDate() [年、月、日]を返します。map(formatNumber).join('-'); } 関数formatNumber(n) { n = n.toString() n[1] ? n : '0' + n を返す } モジュール.エクスポート={ タイムコード、 タイムコードYmd }
Access_token クエリの使用 const TOKEN = 'クラウドトークン'; //access_token を取得 試す { tres = db.collection(TOKEN).doc('access_token').get() を待機します。 access_token = tres.data.value; コンソール.log(アクセストークン) } キャッチ(エラー){ console.log('--トークンレコードがありません--') 戻る { エラーコード:-1、 errMsg:'データベースにトークン情報がありません' } } 参照ドキュメント【1】パブリックプラットフォーム/ミニプログラムサーバーAPIのaccess_tokenの内部設計 | WeChatオープンコミュニティ(qq.com) 【2】auth.getAccessToken | WeChat オープンドキュメント (qq.com) 【3】WeChatミニプログラム開発スキルのまとめ(パート3) - クラウド開発時間効率の良いデータ更新と保存(access_tokenなど) - Kindear - cnblogs.com 小規模プログラム開発における access_token の一元管理の実装方法については以上です。小規模プログラムにおける access_token の一元管理の詳細については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Windows10システムにスーパーセットをインストールする手順
>>: MySQLのグローバルロックとテーブルロックに関する詳細な理解
この記事では、年、月、日の3段階のリンクを実現するためのJavaScriptの具体的なコードを参考ま...
Linux パーティションでよく使用されるコマンド: fdisk、MBR パーティション テーブルの...
Dockerネットワークを見るdocker ネットワーク ls [root@master ~]# d...
1. MySQL 5.7を解凍する2. 新しい設定ファイルmy.iniを作成し、 D:\Free\m...
前回、非常に熱心なファンから、月を呼吸する光の効果にできるかどうか尋ねられました。月の大きさの写真が...
序文名前付きスロットは、スロット内の「name」属性を使用して要素にバインドされます。知らせ: 1....
序文docker run がコンテナを作成して実行するときに、-p を使用してポート マッピング ル...
序文Vue(発音は /vjuː/、view に似ています)は、ユーザーインターフェイスを構築するため...
この記事は、100 回書かれ、質問された CSS の質問を記念するためのものです。聞く: CSS セ...
1. ソフトウェアをダウンロードする1. MySQL の公式サイトにアクセスし、Oracle アカウ...
この記事の例では、WeChatアプレットで複数行のテキストスクロールを実装するための具体的なコードを...
説明: テキストエリアの値の改行を新しい行に変更しますコードをコピーコードは次のとおりです。 <...
カーソル選択クエリによって返される行のセットは、結果セットと呼ばれます。結果セット内の行は、入力した...
今日、私は <a href="#13"></a> につい...
インターネット上で多くの関連チュートリアルを見てきましたが、インストール プロセスにはまだいくつかの...