uni-app WeChatアプレット認証ログイン実装手順

uni-app WeChatアプレット認証ログイン実装手順

ここに画像の説明を挿入

1. appIDの申請と設定

1. appidの取得方法

WeChatパブリックプラットフォームにログイン

公式サイトリンク: https://mp.weixin.qq.com/

初めてご利用の場合は、登録ボタンをクリックして登録する必要があります。アカウントをお持ちの場合は、スキャンしてログインするだけです。

ここに画像の説明を挿入

公式サイトミニプログラムリンク:

ここに画像の説明を挿入

2. AppIDの設定

manifest.jsonに申請したWeChatアプレットIDを入力してください

ここに画像の説明を挿入

2. 基本的なユーザーデータの取得

ここで 2 つの API を紹介します。

2.1. ユーザー情報の取得

uni.getUserProfileを使用してユーザー認証を要求し、ユーザー情報を取得することができます。また、uni.getUserInfoを使用して、

ここに画像の説明を挿入

認証が成功すると、取得されたユーザー情報は userInfo に保存されます。

ここに画像の説明を挿入

ページセクション:

 <button class="login-btn" type="primary" @click="getUserInfo">
        WeChatユーザーはワンクリックでログインできます</button>

js部分:

 メソッド: {
    ユーザー情報を取得する() {
      uni.getUserInfo({
        プロバイダー: 'weixin'、
        成功: (res) => {
          console.log('getUserInfo', res);
        },
      });
    },
   }

取得したユーザー基本データ(openid=》WeChatユーザー固有識別子なし)

ここに画像の説明を挿入

2.2. ユーザー情報の取得 2

uni.getUserInfoを使用してユーザー認証を要求し、ユーザー情報を取得できます。

ページは同じですが、js 部分は次のとおりです。

 ユーザー情報を取得する() {
      uni.getUserProfile({
        説明: 'ログイン後にデータを同期できます',
        言語: 'zh_CN',
        成功: (res) => {
          console.log('getUserProfile', res);
        },
      });
    },

取得したユーザー基本データ(openid=》WeChatユーザー固有識別子なし)

ここに画像の説明を挿入

要約: 2 つの API uni.getUserProfile と uni.getUserInfo によって取得されるユーザー データは基本的に同じであり、どちらにも openid=》WeChat ユーザーの一意の識別子がありません。

3. ログインAPIを呼び出す

3.1. ログインAPI

uni.login メソッドを使用し、プロバイダー パラメータとして 'weixin' を入力し、成功した戻り値で errMsg = "login:ok" の場合、成功を意味します。
WeChatアプレットはコード文字列を返します

ここに画像の説明を挿入

3.2. サンプルコード

 uni.ログイン({
            プロバイダー: 'weixin'、
            成功: (res) => {
              console.log('res-login', res);
              コード:
              console.log('コード', res.コード);
              res.errMsg == 'ログイン:ok'の場合{
              //TODO コードを取得し、コード パラメータを使用してバックエンド インターフェイスを呼び出します}

4. 固有の識別情報の取得

4.1. 公式ウェブサイトのドキュメント

公式ウェブサイトのドキュメントでは、取得したコードを使用してWeChatログインインターフェースにopenidとsession_keyの取得を要求しています。

ここに画像の説明を挿入

4.2. インターフェースの説明

ここに画像の説明を挿入

リクエストメソッド: GET
APPID: ミニプログラムの一意の識別子。取得方法は上記をご覧ください。
SECRET: ミニプログラムを一意に識別する秘密鍵です。上記のAPPID取得方法を参照してください。そのすぐ下にあります。
JSCODE: このフロントエンドはuni.loginを呼び出して取得します

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code を取得します。

ここに画像の説明を挿入

5. ユーザーをログインにバインドする

WeChat ユーザーの一意の ID を取得したら、それを独自のシステム内のユーザーにバインドできます。私が行うことは、weixinId フィールドをユーザー テーブルに追加し、独自のユーザー バインディング インターフェイスにジャンプすることです。ユーザーが WeChat をバインドすることを選択した場合、その行のユーザー データの weixinId が更新されます。次回ユーザーがWeChatを使用してログインするときに、ユーザーデータがopenIdを介して照会できる場合、それはバインドされており、ユーザーがログインしていることを意味します。

5.1. コード例(パッケージ化されていないもの)

フロントエンド部分:

 /**
     *
     * ユーザー情報を取得する */
    ユーザー情報を取得する() {
      // ローディングボックスを表示する uni.showLoading({
        タイトル: 「読み込み中」
      });
      uni.getUserProfile({
        説明: 'ログイン後にデータを同期できます',
        成功: async (obj) => {
          コンソールにログ出力します。
          //アクションを呼び出してログイン インターフェイスを要求します // await this.login(obj);
          uni.ログイン({
            プロバイダー: 'weixin'、
            成功: (res) => {
              console.log('res-login', res);
              コード:
              console.log('コード', res.コード);
              res.errMsg == 'ログイン:ok'の場合{
                ユニ
                  。リクエスト({
                    URL:
                      'http://127.0.0.1:8080/wxh5/wx/user/' +
                      'wx55822xxxx75e422' +
                      '/ログイン/'、
                    データ: {
                      コード: this.code,
                    },
                  })
                  .then((res) => {
                  //openidとsession_kを取得した後、独自のロジックconsole.log('Authorized login', res[1].data);
                    コンソールにログ出力します。
                    コンソールにログ出力します。
                    // 何かを行う................
                  });
                コンソールにログ出力します。
              }
            },
          });
        },
        失敗: () => {
          uni.showToast({
            タイトル: 「認証がキャンセルされました」
            アイコン: 'エラー'、
            マスク: true、
          });
        },
        完了: () => {
          //読み込みを非表示
          uni.hideLoading();
        },
      });
    },

バックエンド

 @GetMapping("/ログイン")
    パブリック文字列ログイン(@PathVariable 文字列 appid, 文字列コード) {
        if (StringUtils.isBlank(コード)) {
            「空の jscode」を返します。
        }

        最終的な WxMaService wxService = WxMaConfiguration.getMaService(appid);

        試す {
            WxMaJscode2SessionResult セッション = wxService.getUserService().getSessionInfo(コード);
            セッションキーを取得します。
            セッションIDを取得する
            //TODO は独自のロジックを追加し、ビジネス関連のデータを関連付けることができます。 return JsonUtils.toJson(session);
        } キャッチ (WxErrorException e) {
            this.logger.error(e.getMessage(), e);
            e.toString() を返します。
        }
    }

5.2. コード例(パッケージング)

 /**
     *
     * ユーザー情報を取得する */
    ユーザー情報を取得する() {
      // ローディングボックスを表示する uni.showLoading({
        タイトル: 「読み込み中」
      });
      uni.getUserProfile({
        説明: 'ログイン後にデータを同期できます',
        成功: async (obj) => {
          // this.userInfo = obj.userInfo;
          // ログインを要求するアクションを呼び出すインターフェース uni.login({
            プロバイダー: 'weixin'、
            成功: async (res) => {
              コード:
              // console.log('コードを取得するにはログインしてください', res.code);
              res.errMsg == 'ログイン:ok'の場合{
                this.loginAuth({を待つ
                  ユーザープロファイル: obj,
                  アプリID: 'wx558xxxxxxxxxxxxxxx2',
                  コード: this.code,
                });
              }
            },
          });
        },
        失敗: () => {
          uni.showToast({
            タイトル: 「認証がキャンセルされました」
            アイコン: 'エラー'、
            マスク: true、
          });
        },
        完了: () => {
          //読み込みを非表示
          uni.hideLoading();
        },
      });
    },
  },

ユーザー.js

 /**
 * WeChatユーザー認証ログイン、appidとコードパラメータの伝達、バックエンドインターフェースの呼び出しによるOpenidの取得
 */
エクスポート関数 loginAuth(data) {
  リクエストを返す({
    url: '/wx/user/' + data.appid + '/login/',
    データ: {
      コード: data.code、
    },
  });
}

vuex ユーザーモジュール (user.js)

 // WeChat ユーザーがログインを許可し、appid と code パラメータを渡し、バックエンド インターフェイスを呼び出して Openid を取得します。
    非同期ログイン認証(コンテキスト、データ) {
      console.log('データ', データ);
      ユーザープロファイルを作成します。
      const { コンテンツ: res } = loginAuthを待機します({
        アプリID: データ.アプリID、
        コード: data.code、
      });

      // バックエンドから送信された JSON オブジェクトを解析します。const userAuthInfo = JSON.parse(res);
      定数 openid = userAuthInfo.openid;
      // console.log('sessionKey', userAuthInfo.sessionKey);
      コンソールにログ出力します。

      // vuexに保存してコミットする
      this.commit('user/setOpenid', userAuthInfo.openid);
      this.commit('user/setUserInfo', JSON.parse(userInfo.rawData));
    },

ここに画像の説明を挿入

ここに画像の説明を挿入

6. プロジェクトのオープンソースアドレス

6.1. フロントエンド

アプレット チョックイン

6.2. バックエンド

weixin-java-ミニアプリ

uni-app WeChat アプレット認証ログインに関するこの記事はこれで終わりです。より関連性の高い uni-app WeChat アプレット認証ログイン コンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。皆様が今後も 123WORDPRESS.COM を応援してくれることを願っています。

以下もご興味があるかもしれません:
  • uni-appを使用してWeChatアプレットの落とし穴レコードを生成する
  • WeChatミニプログラムはuni-appを通じて世界中に共有されます
  • uni-app WeChatアプレットのログイン認証の実装
  • WeChat アプレットをユニアプリ プロジェクトに変換する方法の例
  • uni-app、WeChatアプレットの位置決め機能を開発

<<:  Docker のコンテナ データ ボリュームの概要

>>:  CSS3 で半透明の背景画像と不透明なコンテンツを実現する方法の例

推薦する

MySQL マルチテーブル結合入門チュートリアル

接続は、実際の外部キー(人工的に作成された 2 つのテーブル間の対応関係を指します。対照的に、FOR...

スクロールバーがスペースを占有することで発生するバグを修正しました

背景このバグは滾動條占據空間ことで発生していました。いくつかの情報を確認して、ようやく解決しました。...

CSS で background-color を使用して背景画像にマスク効果を追加する 2 つの方法

div で background-color と background-image を同時に設定する...

MySQLの浅いエントリと深いエグジットの原則についての簡単な説明

目次1. ページの概要2. 下限と上限3. ページディレクトリを使用する4. ページの実際の外観4....

JavaScriptはフォームデータの非同期取得を実装します

この記事では、フォームデータの非同期取得を実現するためのJavaScriptの具体的なコードを例とし...

Linux の chown コマンドと chmod コマンドの違いの詳細な説明

Linux システムでは、chmod コマンドと chown コマンドの両方を使用して権限を設定でき...

適応レイアウトの処理について(フロートとマージンネガティブマージンを使用)

適応型レイアウトは、実際のアプリケーションでますます一般的になっています。今日は、主にフローティング...

MySQL データベース インデックスが B+ ツリーの使用を選択するのはなぜですか?

MySQL データベース インデックスが B+ ツリーを使用する理由をさらに分析する前に、データ構...

MySQL における varchar 型と char 型の違い

目次前述のVARCHAR型VARCHAR適用可能な状況CHAR型テストVARCHAR(5)とVARC...

HTMLのテーブルタグの基本学習チュートリアル

表ラベルの構成HTML 内の表は <table> タグで構成されており、ブラウザはタグを...

DockerはElasticsearch7.6クラスタをインストールし、パスワードを設定します

Elasticsearch 6.8 以降、無料ユーザーは X-Pack のセキュリティ機能を使用でき...

CSS で 3D ブック効果を実装するためのサンプル コード

さっそく、レンダリングを見てみましょうソースコードは以下のとおりです <!DOCTYPE ht...

シームレスなトークンリフレッシュを実現する方法

目次1. 需要方法1方法2方法3 2. 実装3. 問題解決質問1: トークンの複数回の更新を防ぐ方法...

相対幅と絶対幅が競合する場合の HTML+CSS div ソリューション

相対幅と絶対幅が競合する場合のdivソリューション概要: 一般的に、絶対幅を使用する場合は px を...