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'

推薦する

Docker Compose で環境変数を参照する方法の例

プロジェクトでは、さまざまな条件や使用シナリオを制御するために、docker-compose.yml...

Vueのdiffアルゴリズムについての簡単な説明

目次概要バーチャルドム原理実装プロセスパッチ方式sameVnode関数patchVnode関数upd...

ウェブページをデザインする際に注意すべきいくつかの問題

Web デザインは、個人の好みや Web ページの内容に応じて、デザインのレイアウトが常に変化します...

ウェブページの読み込み進捗状況バーの詳細な説明(推奨)

(Web ページの読み込み中に、コンテンツが多すぎて読み込みと待機が続くことがあります。このとき、...

jQueryは画像の強調表示を実現します

ページ上の画像を強調表示することは非常に一般的です。ここでは、jQuery を使用して画像を強調表示...

Dockerを使用してブログサイトを素早く構築する方法の詳細な説明

目次1. 準備2. 展開プロセス3. アクセステストHalo は、ブログに慣れている学生に追加のオプ...

Docker を使用してイメージをローカルにパッケージ化してデプロイする方法

初めてDockerを使用してイメージをローカルにパッケージ化してデプロイするまず、私のラップトップシ...

HTML_PowerNode Java アカデミーでテーブルを動的に追加する

さっそく、コードを直接投稿します。具体的なコードは次のとおりです。 <html> <...

Nginx で IP と IP 範囲をブロックする方法

前面に書かれたNginx は単なるリバース プロキシおよび負荷分散サーバーではなく、電流制限、キャッ...

CSS3 ベジェ曲線の例: リンクホバーアニメーション効果の作成

CSS3 アニメーション トランジションを使用して、リンクの上にマウスを移動すると小さなポップアップ...

CSS はこのように使用できますか?気まぐれなグラデーションの芸術

前回の記事「1行のCSSコードの魅力」では、たった1行のCSSコードで生成できる美しい(奇妙な感じと...

Vue プロジェクト @change 複数のパラメータを使用して複数のイベントを渡す

まず、変更イベントは 1 つだけです。 changelevel() //値を選択選択を変更して行の値...

MySQL 8.0 の非表示列に対する基本操作

目次01 非表示の列を作成する02 非表示の列に対する基本操作03 非表示の列メタデータ04 主キー...

Navicat を仮想マシン MySQL に接続する際によくあるエラーと解決策

質問1 解決するサービスを開始します: service mysqld start; /sbin/ip...

Vueストレージにはブール値のソリューションが含まれています

Vueはブール値でストレージを保存します今日、問題に遭遇しました。バックグラウンドから返された真偽の...