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クエリ最適化テクニックの詳細な説明

推薦する

純粋な CSS3 で実装された三目並べゲーム

操作効果: html <div class="三目並べ"> <...

Vueライフサイクルカメラの8つのフック関数

目次1. beforeCreateとcreated関数2. beforeMountとmount関数3...

DOCTYPE HTMLを使用する理由

これがないと、ブラウザはページをレンダリングするときに Quirks モードを使用することがわかって...

Linux で ping は成功するがポートが利用できない問題を解決する方法

ping は成功したがポートにアクセスできない場合のポート可用性検出の説明ポート可用性検出ツールの紹...

MySQL グリーンバージョン設定コードと 1067 エラーの詳細

MySQL グリーンバージョン設定コードと 1067 エラーMySQL エンコーディングを表示 &#...

js でオブジェクトとオブジェクト メソッドを作成するいくつかの方法の詳細な説明

この記事は、JS レッドブックの第 8 章に記載されているオブジェクトに関する 2 番目の記事です。...

Mac MySQL のルートパスワードをリセットするチュートリアル

免責事項:このパスワード リセット方法は、Homebrew によってインストールされた MySQL ...

Vue ユニットテストに推奨されるプラグインと使用例

目次フレーム最高レベルのエラー報告活発なコミュニティとチーム冗談モカ推奨プラグインVue テストライ...

Vueダイナミックフォームの詳細な応用

概要バックグラウンド管理システムには多くのフォーム要件があります。データをjson 形式で書き込み、...

MySQL での実行計画の explain コマンド例の詳細な説明

序文explain コマンドは、クエリ オプティマイザーがクエリの実行を決定した方法を確認する主な方...

Dockerコンテナデータボリュームの原理と使用法の分析

コンテナデータボリュームとはデータがコンテナ内にある場合、コンテナを削除するとデータは失われます。例...

ダイナミッククロックを実現するJS+CSS

この記事の例では、動的な時計を実装するためのJS + CSSの具体的なコードを参考までに共有していま...

VueとVueComponentの関係の詳細な説明

次のケースでは、これまでに学んだプロトタイプチェーンの知識ポイントを確認します。 // コンストラク...

JavaScriptオブジェクト指向について学ぼう

目次JavaScript プロトタイプチェーンオブジェクトプロトタイプトップレベルのプロトタイプOb...

ディスク容量不足による MySQL レプリケーション障害の解決方法

目次ケースシナリオ問題を解決するまとめケースシナリオ本日、オンラインで問題が発見されました。監視範囲...