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

推薦する

よく理解しましたかタグ 定義方法 使用方法

序文:今日、「<!DOCTYPE> タグを注意深く理解しましたか?」と尋ねられました。私...

Docker コンテナのマウントディレクトリ操作の表示

Dockerコンテナのマウントディレクトリ情報のみを表示する docker 検査 --format ...

1 つの記事で MySQL のプリコンパイルを理解する

1. プリコンパイルの利点私たちは皆、プリコンパイル機能を備えた JDBC の PreparedSt...

Vue 天気予報入門

この記事では、参考までに天気予報を実装するためのVueの具体的なコードを紹介します。具体的な内容は次...

Dockerのネットワークモードと設定方法

1. Dockerネットワークモードdocker run が Docker コンテナを作成するときに...

dockerでsshd操作を有効にする

まず、docker に openssh-server をインストールします。インストールが完了したら...

Linux で Nginx ロード バランシングを使用して複数の Tomcat を構成する方法

Linux に nginx と複数の tomcat をインストールする方法はここでは紹介しません。不...

データベースの水平セグメンテーションを実装するための2つのアイデア

導入インターネット アプリケーションの普及に伴い、膨大なデータの保存とアクセスがシステム設計における...

Jsモジュール化の動作原理とソリューションの詳細な説明

目次1. モジュラーコンセプト2. モジュール化3. モジュール化プロセス1. 通常の記述(グローバ...

docker-swarm をベースにした継続的インテグレーション クラスタ サービスの構築の詳細な説明

序文この記事は私自身の製作過程の簡単な記録です。練習中に質問があれば、一緒に話し合うことができます。...

MySQLは適切なストレージエンジンを選択します

データベースに関して最もよく聞かれる質問の 1 つは、現在のビジネス ニーズを満たす MySQL の...

HTML ハイパーリンク タグ_Powernode Java アカデミー

HTML を学習したり使用したりしたことがある人なら、<a> タグについてよく知っている...

Reactは、読み込み、読み込み完了、読み込み失敗の3つの段階の原則分析を実装します。

最近ブログに書いたのですが、プロジェクトリストの中に写真がたくさんあり、最初は読み込みが遅いので、ス...

エージェントを介したzabbix監視プロセスとポートの詳細なプロセス

環境の紹介オペレーティングシステム: Centos 7.4 Zabbix バージョン: zabbix...

jsとcssのブロッキング問題の詳細な分析

目次DOMContentLoadedとロードjs ブロッキングとは何ですか? CSS ブロッキングと...