WeChatアプレットはユーザーログインモジュールサーバーの構築を実装します

WeChatアプレットはユーザーログインモジュールサーバーの構築を実装します

サーバーの構築には node.js を選択しました。まだインストールしていない方は、私の他の node.js ブログを参照してください。

サーバーのインストールと構成

プロジェクトを初期化すると、package.json 構成ファイルが自動的に作成されます。

npm 初期化 -y

Express フレームワークとリクエスト モジュールをインストールします。

npm インストールエクスプレス –save
npm インストールリクエスト --save

ファイルの変更を監視するには、nodemon をインストールします (すでにインストールされている場合は、この手順をスキップします)。

npm インストール nodemon -g

コーディング

上記のコマンドを実行した後、プロジェクト ディレクトリに app.js ファイルを作成し、次のコードを記述します。

Express フレームワークとリクエスト モジュールを導入し、appid とシークレットを構成します。

定数 express = require('express')
const bodyParser = require('body-parser')
const リクエスト = require('リクエスト')
const app = express()
app.use(bodyParser.json())
定数wx = {
  appid: '', // 開発者のAppIDを入力する必要があります
  secret: '' // 開発者のAppSecretを入力する必要があります
}

データベースをシミュレートします。 (この場合、配列を使用します。データベースの設定はかなり複雑なので、ここでは説明しません。私のブログで他の node.js+mysql プロジェクトを参照できます。)

var db = { // シミュレートされたデータベース session: {}, // openid と session_key のセッション情報を保存 user: {} // ユーザー名、ポイントなどのユーザーレコードを保存します。}

ログイン インターフェイスを要求し、ログイン資格情報の WeChat インターフェイス URL アドレスを確認します。
(以下の URL は Tencent が提供するテスト認証インターフェースです。変更する必要はありません)

app.post('/login', (req, res) => {
  var url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' +
  wx.appid + '&secret=' + wx.secret + '&js_code=' + req.body.code +
   '&grant_type=認可コード'  
  リクエスト(url, (err, レスポンス, 本文) => {
     if(){ // このコードは session.openid が存在するかどうかを判断します}
     }
     res.json({トークン:トークン})
  })
})

セッション内の openid ステートメント コードを決定します。

セッションIDがopenidの場合
      var セッション = JSON.parse(本文)
      // トークンを生成するために使用
      var トークン = 'token_' + 新しい Date().getTime()
      db.session[トークン] = セッション 
}

アクセスインターフェース3000を設定

app.listen(3000, () => {
  console.log('http://127.0.0.1:3000 でサーバーが稼働しています')
})

整理しておきました

ここでappidとsession_keyを復号化する必要があるため、WeChatのWXBizDataCrypt関数が使用されます。
WXBizDataCrypt.js

var 暗号 = require('暗号')

関数 WXBizDataCrypt(appId, sessionKey) {
  this.appId = アプリID
  this.sessionKey = セッションキー
}

WXBizDataCrypt.prototype.decryptData = 関数 (暗号化されたデータ、iv) {
  // base64 デコード
  var sessionKey = 新しいバッファ(this.sessionKey、'base64')
  暗号化されたデータ = 新しいバッファ(暗号化されたデータ、'base64')
  iv = 新しいバッファ(iv, 'base64')

  試す {
     // 復号化 var decipher = crypto.createDecipheriv('aes-128-cbc', sessionKey, iv)
    // 自動パディングを true に設定し、パディングを削除します。decipher.setAutoPadding(true)
    var デコード = decipher.update(encryptedData, 'binary', 'utf8')
    デコード += decipher.final('utf8')
    
    デコード = JSON.parse(デコード)

  } キャッチ (エラー) {
    新しいエラーをスローします('不正なバッファ')
  }

  デコードされたウォーターマークのアプリIDがthis.appIdと等しい場合{
    新しいエラーをスローします('不正なバッファ')
  }

  デコードされた戻り値
}

モジュール.エクスポート = WXBizDataCrypt

app.jsのコード全体は次の通りです。

// 暗号化と復号化 const crypto = require('crypto');
定数 WXBizDataCrypt = require('./WXBizDataCrypt')

定数 express = require('express')
const bodyParser = require('body-parser')
const リクエスト = require('リクエスト')
const app = express()
app.use(bodyParser.json())

定数wx = {
    アプリID: ''、
    秘密: ''
}

var db = {
    セッション: {},
    ユーザー: {}
}

app.post('/login', (req, res) => {
    // 注意: ミニプログラム側の appid は実際のアカウントを使用する必要があります。テストアカウントを使用すると、ログインコードエラーが発生します console.log('ログインコード: ' + req.body.code)
    var url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' + wx.appid + '&secret=' + wx.secret + '&js_code=' + req.body.code + '&grant_type=authorization_code'
    リクエスト(url, (err, レスポンス, 本文) => {
        console.log('セッション: ' + 本文)
        var セッション = JSON.parse(本文)
        セッションIDがopenidの場合
            var トークン = 'token_' + 新しい Date().getTime()
            db.session[トークン] = セッション
            if(!db.user[session.openid]) {
                db.user[セッション.openid] = {
                    クレジット: 100
                }
            }
        }
        res.json({
            トークン: トークン
        })
    })
})

app.get('/checklogin', (req, res) => {
    var セッション = db.session[req.query.token]
    console.log('checklogin: ', セッション)
    // ユーザーがクライアントにログインしているかどうかのブール値を返します res.json({
        is_login:セッション !== 未定義
    })
})

app.get('/credit', (req, res) => {
    var セッション = db.session[req.query.token]
    if(セッション&& db.user[session.openid]) {
        res.json({
            クレジット: db.user[session.openid].credit
        })
    } それ以外 {
        res.json({
            エラー: 'ユーザーが存在しないか、ログインされていません。 '
        })
    }
})

app.post('/userinfo', (req, res) => {
    // セッション値を取得する var session = db.session[req.query.token]
    console.log('セッション:' + セッション)
    if(セッション) {
        // appid と session_key を使用して、encryptedData を復号化する
        var pc = 新しい WXBizDataCrypt(wx.appid、session.session_key)
        var データ = pc.decryptData(req.body.encryptedData, req.body.iv)
        console.log('復号後:', データ)
        // rawData が正しいか確認する var sha1 = crypto.createHash('sha1')
        sha1.update(req.body.rawData + session.session_key)
        var signature2 = sha1.digest('hex')
        コンソール.log(署名2)
        console.log(req.body.signature)
        res.json({
            パス: signature2 === req.body.signature
        })
    } それ以外 {
        res.json({
            エラー: 'ユーザーが存在しないか、ログインされていません。 '
        })
    }
})

app.listen(3000, () => {
    console.log('http://127.0.0.1:3000 でサーバーが稼働しています')
})

サーバーを起動する

上記のコードを保存し、コンソールまたは Powershell または Linux ターミナルを開き、次のステートメントを実行して、サーバーの 3000 をサーバー アクセス用に開きます。

ノードモンアプリ.js

WeChatミニプログラムのユーザーログインモジュールのサーバー構築方法についてはこれで終わりです。WeChatミニプログラムのログインモジュールのサーバー構築の詳細については、123WORDPRESS.COMの以前の記事を検索するか、次の関連記事を引き続き参照してください。今後も123WORDPRESS.COMを応援してください。

以下もご興味があるかもしれません:
  • WeChatアプレットの構築とログイン失敗問題の解決
  • WeChatアプレットが独自のHTTPSサーバーを構築
  • WeChatアプレットサーバーをローカルに構築する方法
  • node.js インターフェース サーバーにアクセスするための WeChat アプレットの構築方法に関するチュートリアル

<<:  Docker 学習: コンテナ コンテナの具体的な使用方法

>>:  MySQL数千万の大規模データに対する30のSQLクエリ最適化テクニックの詳細な説明

推薦する

Innodb システムテーブルスペースのメンテナンス方法

環境説明:実行中の MySQL 環境があります。以前の構成ファイルの設定が単純すぎたため (inno...

HTML内のフレームセットタグが正常に表示されない原因の解析と解決方法

<frameset></frameset>は皆さんもよくご存知のものです。こ...

HTML におけるスクリプトの配置に関する簡単な説明

以前は、スクリプトは HTML 内のどこにでも配置できると思っていましたが、今日、要件に取り組んでい...

JavaScript オブジェクト (詳細)

目次JavaScript オブジェクト1. 定義2. オブジェクトの分類3. オブジェクトを定義する...

WeChatアプレットの世界的な状況の詳細な説明

序文WeChat アプレットでは、App.js の globalData を中間ブリッジとして使用し...

Linux 3.X/4.x/5.x でパゴダ パネルのパスワードを忘れた場合の解決方法

ssh に入り、次のコマンドを入力してパスワードをリセットします (コマンドの末尾の「testpas...

MySQL 8.0 再帰クエリの簡単な使用例

序文この記事では、MySQL 8.0 の新機能を使用して再帰クエリを実装します。詳細なサンプル コー...

Linux でファイル権限を変更する chmod コマンドの詳細な分析

Linux chmodコマンドを使用して、ターゲット ファイルにアクセス、読み取り、書き込み、または...

vue3 コンポーネントでの v-model の使用と詳細な説明

目次v-model 入力で双方向バインディングデータを使用するコンポーネント内の v-model他の...

Element-ui アップロードファイルのアップロード制限の解決策

質問アップロードするファイルのタイプを accept に追加することは、「表面的な」役割しか果たしま...

Dockerのクイックガイド

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

HTML割引価格計算の実装原理とスクリプトコード

コードをコピーコードは次のとおりです。 <!DOCTYPE HTML PUBLIC "...

MYSQLストアドプロシージャ、つまり一般的な論理知識のポイントの要約

MySQL ストアド プロシージャ1. ストアドプロシージャ構文(フォーマット)を作成する 区切り文...

JavaScriptのvar let constの違いは何ですか?

目次1. 繰り返し宣言1.1 変数1.2 しましょう1.3 定数2. 可変プロモーション2.1 変数...

Linuxでホスト名を永続的に変更する方法

ホスト名を変更する場合は、以下の手順に従ってください。ホスト名の使用hostnameコマンドを使用す...