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

推薦する

Docker での Tomcat インストールの 404 問題の解決方法

tomcat の containerID を見つけて、tomacat ディレクトリに入ります。 [r...

OpenSSL を使用した Kubernetes 証明書の生成の概要

Kubernetes は、基本認証、トークン認証、CA 認証の 3 種類の認証をサポートしています。...

Axiosは繰り返しのリクエストをキャンセル

目次序文1. リクエストをキャンセルする方法2. 重複リクエストの判定方法3. 繰り返しリクエストを...

階段効果を実現するためのWeChatアプレットカスタムメニューナビゲーション

設計意図ページを開発する際には、ページ上のナビゲーション メニューをクリックしたときにページを対応す...

JavaScriptの原理と方向性

これが何を指しているのかをどのように判断するのでしょうか? ①グローバル環境で呼び出された場合はwi...

vue 要素 el-transfer にドラッグ機能を追加

コア資産管理プロジェクトでは、el-transfer にドラッグ アンド ドロップによる並べ替えと、...

DockerにMinIOをインストールするための詳細な手順

目次1. docker環境が正常かどうかを確認する2. miniIOイメージをダウンロードする3. ...

XHTML の珍しいが便利なタグ

Xhtml には、あまり使用されないが非常に便利なタグが多数あります。半分の労力で 2 倍の結果を達...

jsネイティブカルーセルプラグインの制作

この記事では、jsネイティブカルーセルプラグインの具体的なコードを参考までに共有します。具体的な内容...

CSSは親コンテナのdivをimg画像で埋め、コンテナのサイズに適応します。

ページに複数の画像を導入すると、画像のサイズがばらつくことがあります。しかし、それらを一貫したサイズ...

Webデザインチュートリアル(8):Webページの階層と空間デザイン

<br />前回の記事:Webデザイン講座(7):Webページ制作の効率化1:必要な小言...

SQLの最適化では間違いがよく起こります。それはMySQLのExplain Planの使い方を理解していないからです。

目次1. 準備2. 説明計画の概要3. フィールドの詳細な説明4. パーティションクエリにはパーティ...

Nginxはhttpとhttpsの両方のアクセスをサポートするために同じドメイン名を設定します

Nginx は同じドメイン名で構成されており、http と https の両方でアクセスできます。証...

ファイルをアップロードするときに enctype フィールドを使用する理由は何ですか?

FORM 要素の enctype 属性は、フォーム データがサーバーに送信されるときに使用されるエン...

Linux システム修復モード (シングル ユーザー モード)

目次序文1. シングルユーザーモードでの一般的なバグ修正2. シングルユーザーモードでシステムパスワ...