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

推薦する

仮想マシンに Linux rhel7.3 オペレーティング システムをインストールする (具体的な手順)

仮想化ソフトウェアをインストールする仮想マシンにオペレーティング システムをインストールする前に、ホ...

Navicat を使用して csv ファイルを MySQL にインポートする

この記事では、参考までに、Navicatを使用してCSVファイルをMySQLにインポートするための具...

Dockerfile に基づいて Tomcat イメージを構築する方法

Dockerfile は Docker イメージを構築するために使用されるファイルです。コマンドパラ...

Linux での Hbase のインストールと設定のチュートリアル

目次Linux での Hbase のインストールと設定1. Hbaseインストールパッケージをダウン...

MySQL インデックス プッシュダウンの詳細

目次1. 左端接頭辞原則2. 表に戻る3. インデックスプッシュダウン序文:インデックス プッシュダ...

jQueryブリージングカルーセルの制作原理を詳しく解説

この記事では、jQueryブリージングカルーセル制作原理の具体的なプロセスを参考までに紹介します。具...

LINUX ポートが占有されているかどうかを確認します

ポートが占有されているかどうかは、これまで一度もわかりませんでした。多くの人に尋ねて、ようやくわかり...

Docker で Oracle 11g イメージ構成をプルダウンする際の問題を分析する

1. イメージをプルするdocker pull レジストリ.cn-hangzhou.aliyuncs...

Flinkのフォールトトレラントメカニズムに関する簡単な説明:ジョブ実行とデーモン

目次1. ジョブ実行のフォールトトレランス1.1 タスクフェイルオーバー戦略1.2 ジョブ再開戦略2...

Javascript サンプル プロジェクトでの虫眼鏡効果の実装プロセス

目次序文事例: JD.com の虫眼鏡効果の模倣オフセットシリーズクライアントシリーズスクロールシリ...

line-height=height要素の高さだがテキストが垂直方向に中央揃えされない問題を解決する

まず、行の高さが要素の高さと等しい場合にテキストが垂直方向に中央揃えにならない理由を説明します。実際...

IE 環境での css-vars-ponyfill の使用に関する詳細な説明 (nextjs ビルド)

css-vars-ポニーフィルCSS 変数を使用して Web ページのスキニングを実現すると、互換...

Vue-router プログラムナビゲーションの 2 つの実装コード

ページをナビゲートする2つの方法宣言型ナビゲーション: リンクをクリックしてナビゲーションを実現する...

MySQL システム ユーザーが開くことができるファイルの最大数に関する簡単な説明

本から学ぶことは常に浅はかで、これがさらなるダウンタイムを引き起こすことには決して気づきません......

Docker で hyperf を開発する完全な使用例の詳細な説明

ハイパーフ公式サイトHyperf 公式ドキュメントのインストール1. Dockerの使用docker...