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'

推薦する

HTML で余分なテキストを省略記号に変換する方法

HTML で余分なテキストを省略記号として表示したい場合は、いくつかの方法があります。 1行テキスト...

src 属性と href 属性の違い

src と href には違いがあり、混同される可能性があります。 src は現在の要素を置き換える...

Linux での JDK のインストール (OpenJDK のアンインストールを含む) の概要

1. openjdkを表示する rpm -qa|grep jdk 2. openjdk を削除します...

html.cssオーバーフローの包括的な理解

html.cssオーバーフローの包括的な理解XML/HTML コードコンテンツをクリップボードにコピ...

Linux システム (CentOS7 インストール) に JDK8 をインストールするための詳細なチュートリアル

JDKのインストールシステムのインストールについてはあまり詳しく説明しません。インストール手順はオン...

Nginx は gzip 圧縮に基づいてアクセス速度を向上します

1. nginx はなぜ gzip を使用するのですか? 1. 圧縮の役割:ページがgzipで圧縮さ...

ウェブページのコピー防止機能の実装方法(クラッキング手法付き)

ソース ファイルを右クリックすると、次のコードが見つかります。 1. CSSを使用してFirefox...

HTML テーブルの使い方 (Web ページの視覚効果を表示する)

NetEase Blog で HTML を使用する場合、テンプレートに直接コードを追加できることは...

Ubuntuはカーネルモジュールをコンパイルし、その内容はシステムログに反映されます。

目次1.Linuxログインインターフェース2. コードを書く3. Makefileを書く4. コンパ...

Linux の MySQL でリモート接続を承認する方法

注意: 他のマシン (IP) は、承認なしではクライアント経由で MySQL データベースに接続でき...

Vueはdivホイールのズームインとズームアウトを実装します

Vue プロジェクトで div ホイールのズームインとズームアウト、ドラッグ効果、キャンバス効果に似...

JS で if 判定をスムーズに行う方法

目次序文コードの実装アイデア 1アイデア2要約する参照ドキュメント序文プロジェクト内の小さな要件ポイ...

ウェブページのカラーマッチングにおけるオーバーラップとソフトカラーマッチングの手法を詳しく説明

この記事には、細かい点は一切なく、カラーマッチングのテクニックをシェアするだけです。とてもシンプルで...

nginx keepaliveの具体的な使い方

http1.1 プロトコルのデフォルトのリクエスト ヘッダーでは、図に示すように、デフォルトで ke...

vue+element カスタムクエリコンポーネント

この記事では主に Vue プロジェクトを紹介します。要素の導入を前提として、コンポーネントを 2 回...