Python Flask WeChat アプレットのログインプロセスとログイン API 実装コード

Python Flask WeChat アプレットのログインプロセスとログイン API 実装コード

1. まずは効果を見てみましょう

ここに画像の説明を挿入

インターフェース要求によって返されるデータ:

ここに画像の説明を挿入

2. 公式ログインフローチャート

ここに画像の説明を挿入

3. ミニプログラムのログインプロセス:

1. アプレットはwx.loginを呼び出す

2. ユーザーが承認されているかどうかを判断する

3. アプレットからwx.getUserInfoにアクセスする

4. ミニプログラムのjsコード:

wx.ログイン({
 成功: 応答 => {
 // openId、sessionKey、unionIdと引き換えにres.codeをバックエンドに送信します
 コンソールログ(応答);
 var that = this;
 // ユーザー情報を取得する wx.getSetting({
 成功: res => {
 res.authSetting['scope.userInfo']の場合{
 // すでに承認されているので、ポップアップウィンドウなしで直接 getUserInfo を呼び出してアバターのニックネームを取得できます wx.getUserInfo({
 成功: userResult => {
 var プラットフォームユーザー情報マップ = {}
 platUserInfoMap["encryptedData"] = userResult.encryptedData;
 platUserInfoMap["iv"] = userResult.iv;
 wx.リクエスト({
			 URL: 'http://127.0.0.1:5000/user/wxlogin',
			 データ: { 
			 プラットフォームコード: 対応コード、
  platUserInfoMap: platUserInfoMap、
			 },
			 ヘッダー: {
			 「コンテンツタイプ」: 「application/json」
			 },
			 メソッド: 'POST'、
			 データ型: 'json',
			 成功: 関数 (res) {
			 コンソール.log(res)
  	wx.setStorageSync("userinfo", res.userinfo) //ローカルキャッシュを設定する },
			 fail: function (err) { }, // リクエストが失敗しました complete: function () { } // リクエストが完了した後に実行される関数 })
 }
 })
 } 
 }
 })
 }
 })

5. バックエンド サーバーは code2session にアクセスし、code2Session API インターフェイスを通じて実際に必要な WeChat ユーザーのログインsession_keyopenidunionidを取得します。

6. バックエンド サーバーはユーザー情報を検証し、 encryptedDataアプレットにログインして session_key を取得すると、encryptedData と iv データが返されます。encryptedData には、復号化後のユーザー情報が含まれます。復号化された json 形式は次のとおりです。

{
 "オープンID": "オープンID",
 "ニックネーム": "ニックネーム",
 「性別」: 性別、
 "都市": "都市",
 "州": "州",
 "国": "国",
 "アバターURL": "AVATARURL",
 "unionId": "UNIONID",
 "透かし":
 {
 "appid":"アプリID",
 "タイムスタンプ":タイムスタンプ
 }
}

7. 新しい復号化ファイルを作成する - WXBizDataCrypt.py


from Crypto.Cipher import AES通常はModuleNotFoundError:No module named "Crypto"エラーが発生します。 (1) pip3 install pycryptodome実行します。
(2)それでもモジュールが利用できないというプロンプトが表示される場合は、仮想環境ディレクトリLib—-site-packageCryptoフォルダがあるかどうかを確認します。 cryptoフォルダが表示されるので、名前をCryptoに変更します。

base64をインポート
jsonをインポート
Crypto.CipherからAESをインポート

クラス WXBizDataCrypt:
 def __init__(自分、アプリID、セッションキー):
 自己.appId = アプリID
 self.sessionKey = セッションキー

 def decrypt(self, 暗号化されたデータ, iv):
 # base64 デコード
 セッションキー = base64.b64decode(self.sessionKey)
 暗号化されたデータ = base64.b64decode(暗号化されたデータ)
 iv = base64.b64デコード(iv)

 暗号 = AES.new(セッションキー、AES.MODE_CBC、iv)

 復号化 = json.loads(self._unpad(cipher.decrypt(encryptedData)))

 復号化された['watermark']['appid'] != self.appIdの場合:
 例外を発生させる('無効なバッファ')

 復号化されたものを返す

 _unpad を定義します。
 s[:-ord(s[len(s)-1:])] を返す

8. Flask の/user/wxlogin API コード:

json、リクエストをインポート
WXBizDataCrypt から WXBizDataCrypt をインポート
FlaskからFlaskをインポート

@app.route('/user/wxlogin', メソッド=['GET','POST'])
user_wxlogin() を定義します:
 data = json.loads(request.get_data().decode('utf-8')) # フロントエンドのJsonデータを辞書に変換します appID = 'appID' # WeChatアプレットの開発者のappID
 appSecret = 'appSecret' # WeChat ミニプログラム用の開発者の appSecret
 code = data['platCode'] # フロントエンドPOSTから送信されたWeChat一時ログイン認証コード
 暗号化されたデータ = データ['platUserInfoMap']['暗号化されたデータ']
 iv = データ['platUserInfoMap']['iv']
 要求パラメータ = {
 'appid': アプリID、
 'シークレット': アプリシークレット、
 'js_code': コード、
 'grant_type': 'authorization_code'
 }
 wx_login_api = 'https://api.weixin.qq.com/sns/jscode2session'
 response_data = requests.get(wx_login_api, params=req_params) # API への GET リクエストを開始します resData = response_data.json()
 openid = resData ['openid'] # 現在のアプレットのユーザーの OpenID を取得します
 session_key = resData ['session_key'] # 現在のアプレットのユーザーのセッションキー session_key を取得します

 pc = WXBizDataCrypt(appID, session_key) #ユーザー情報を復号化 userinfo = pc.decrypt(encryptedData, iv) #ユーザー情報を取得 print(userinfo)
 '''
 次の部分では、データベースにユーザーが存在するかどうかを判断して、カスタムログイン状態を追加するか返すかを決定します(ユーザーが存在しない場合は追加し、ユーザーが存在する場合はユーザー情報を返します)
 
 --------少し少し少し少し少し少し少し少し少し-------------
 
 この部分はスキップして、データベース内のユーザーを操作します。
 
 json.dumpsを返す
({
"code": 200、"msg": "ログイン成功"、"userinfo": userinfo}、indent=4、sort_keys=True、default=str、ensure_ascii=False)

要約する

Python Flask WeChat アプレットのログイン詳細とログイン API 実装に関するこの記事はこれで終わりです。Python Flask WeChat アプレットのログイン詳細とログイン API 実装に関するその他の関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Python は WeChat アプレットのユーザーログインとテンプレートプッシュを実装します
  • Pythonは登録とログインのアプレット機能を実装します
  • Python は WeChat アプレットに複数の支払い方法を実装します
  • コード付きの 5 つの Python ミニプログラム
  • アプレットログインプロセスのタイミングサマリーを実装するPythonコード

<<:  Vueは3段階のナビゲーション表示と非表示を実装します

>>:  mysql: [エラー] 不明なオプション '--skip-grant-tables'

推薦する

mysql 5.7.23 winx64 解凍バージョンのインストールチュートリアル

参考までに、mysql-5.7.23-winx64 解凍版の詳細なインストールチュートリアルです。具...

Navicat が MySQL にリモート接続するときに発生する 10060 不明エラーを解決する方法

はじめに:今日は、サーバー上のMySQLにリモート接続したいと思います。使用するソフトウェアはNav...

MySQL 文字列連結関数 GROUP_CONCAT の詳細な説明

前回の記事では、クロステーブル更新について書きました。自分が書いた SQL を見たとき、自分がバカみ...

Docker コンテナ データ ボリュームの名前付きマウントと匿名マウントの問題

目次コンテナデータボリュームとはコンテナ データ ボリュームが必要なのはなぜですか?使用データボリュ...

HTML/XHTML における img 画像タグの基本的な使用法の詳細な説明

画像タグは、Web ページに画像を表示するために使用されます。 HTML/XHTML 画像 <...

リンク更新ページと js 更新ページの使用例

1. リンクの使用方法:コードをコピーコードは次のとおりです。 <a href="j...

MySQLコマンドが中国語で入力できない問題の解決方法

問題を見つける最近、MySQL コマンドを使用して MySQL サーバーに接続したときに、以下のよう...

Dockerのクイックガイド

Docker は、安全で繰り返し可能な環境でソフトウェアを自動的にデプロイする方法を提供し、コンピュ...

JavaScriptを使用して独自のAjax関数を定義する

ネイティブJSによって開始されたネットワークリクエストは、クエリ文字列の形でサーバーに送信されるため...

Vue3.0はvue-grid-layoutプラグインを使用してドラッグレイアウトを実装します。

目次1. プラグイン2. 幕間3. 実装4. 検証機能1. プラグインまず、私たちが選んだプラグイン...

docker compose を使用して fastDFS ファイル サーバーを構築する方法

前回の記事では、docker compose を使用して FastDfs ファイル サーバーをインス...

HTML CSS3は画像表示効果を引き伸ばさない

1. transform 属性を使用して、画像を拡大せずに表示します (パスの問題は必要に応じて修正...

MySQL で遅い SQL 文を見つける方法

MySQL で遅い SQL ステートメントを見つけるにはどうすればよいでしょうか?これは、多くの人を...