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'

推薦する

ページスピードの最適化の概要

インターネットは人々の生活にますます欠かせないものになってきていると思います。 Ajax や fle...

1 分で Nginx のバージョンをスムーズにアップグレードおよびロールバックする方法

今日は、企業の実際の本番環境でよく遭遇する、Nginx を新しいバージョンにアップグレードし、古いバ...

ミニプログラムカスタムコンポーネントの非効率的なグローバルスタイルの解決策

目次長すぎて読めないコンポーネントスタイルの分離デモテスト優先度ページの分離構成参考文献ネイティブ ...

MySQL で not in を使用して null 値を含める問題を解決する

知らせ! ! ! uid が (a,b,c,null) に含まれないユーザーから * を選択します。...

Nexus を使用して jar パッケージをプライベート サーバーに追加する方法

なぜ Nexus プライベート サーバーを構築する必要があるのでしょうか。その理由は非常に簡単です。...

ウェブページで Enter キーを押すと自動的にフォームを送信し、他のページにジャンプするソリューション

ウェブページでEnterキーを押すと、フォームは自動的に送信され、他のページに移動します。クエリフォ...

CSS3 はドラッグ可能なルービックキューブの 3D 効果を実現します

主に使用される知識ポイント: •css3 3D変換 •ネイティブjsマウスドラッグイベント•表示:グ...

Typescript での infer キーワードの使用に関する詳細な理解

目次推測する事例:理解を深める参照する後で忘れないように、キーワード infer をメモしておきます...

uni-appのスタイルの詳細な説明

目次uni-app のスタイル要約するuni-app のスタイルsassプラグインは公式ウェブサイト...

CSS により、子コンテナが親要素を超えます (子コンテナは親コンテナ内で浮動します)

序文場合によっては、次の図のような浮動効果の要件が必要になります。 成し遂げる標準的な通常の状況では...

Visual Studio Code + Reactをベースに開発環境を構築するプロセス

開発環境ウィンドウ開発ツール Visual Studio Codeノードのインストールとnpm Wi...

HTML の marquee 属性の詳細な説明

このタグはHTML3.2の一部ではなく、MSIE3以降のカーネルでのみサポートされているため、IEカ...

MacOS に MySQL 8.0 をインストールして MySQL にログインする方法

公式チュートリアルに従って、インストール パッケージをダウンロードし、[インストール] をクリックし...

Docker クロスサーバー通信オーバーレイソリューション (パート 1) Consul 単一インスタンス

目次シナリオタスクアイデア分析するコンセプトと選択ちょっとしたテスト環境説明予防実践テスト引用シナリ...

Linux システムで tcpdump を使用してパケットをキャプチャする方法

まずサンプルコードを見てみましょう: 1. 共通パラメータ tcpdump -i eth0 -nn ...