1. 程式人生 > 程式設計 >微信小程式實現使用者登入模組伺服器搭建

微信小程式實現使用者登入模組伺服器搭建

我選用的是node.js來搭建伺服器,沒有安裝的小夥伴可以參考我的http://www.cppcns.comnode.js其他部落格。

伺服器安裝與配置

初始化專案,將會自動建立package.json配置檔案。

npm init -y

安裝Express框架和request模組。

npm install express –save
npm install request --save

安裝nodemon監控檔案修改(如果已經安裝則跳過此步)。

npm install nodemon -g

程式碼編寫

執行上述命令後,在專案目錄下建立app.js檔案,編寫程式碼如下:

引入Express框架和request模組,配置appid和secret。

const express = require('express')
const bodyParser = require('body-parser')
const request = require('request')
const app = express()
app.use(beUsUuodyParser.json())
const wx = {
  appid: '',// 需要填寫開發者的AppID
  secret: '' // 需要填寫開發者的AppSecret
}

模擬資料庫。(在這就用陣列形式,資料庫搭建比較繁瑣,在這不展示了,可以參考我部落格中其他的node.js+

mysql專案)

var db = { // 模擬資料庫
  session: {},// 儲存openid和session_key的會話資訊
  user: {}  // 儲存使用者記錄,如使用者名稱、積分等資料
}

請求登入介面,校驗登入憑證的微信介面URL地址。
(下面的url 是騰訊提供的測試 憑證的介面,不用修改)

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=authorization_code'  
  request(url,(err,response,b
程式設計客棧
ody) => { if(){ // 此處程式碼判斷session.openid是否存在} } res.json({token: token}) }) })

判斷 session 中 openid 語句程式碼。

if (session.openid) {
      var session = JSON.parse(body)
      // 用於生成token
      var token = 'token_' + new Date().getTime()
      db.session[token] = session 
}

設定訪問介面 3000

app.listen(3000,() => {
  console.log('server running at http://127.0.0.1:3000')
})

給大家整理了一下

因為這裡的appid和session_key需要進行解密,所以要用到微信的WXBizDataCrypt函式
WXBizDataCrypt.js

var crypto = require('crypto')

function WXBizDataCrypt(appId,sessionKey) {
  this.appId = appId
  this.sessionKey = sessionKey
}

WXBizDataCrypt.prototype.decryptData = function (encryptedData,iv) {
  // base64 decode
  var sessionKey = new Buffer(this.sessionKey,'base64')
  encryptedData = new Buffer(encryptedData,'base64')
  iv = new Buffer(iv,'base64')

  try {
     // 解密
    var decipher = crypto.createDecipheriv('aes-128-cbc',sessionKey,iv)
    // 設定自動 padding 為 true,刪除填充補位
    decipher.setAutoPadding(true)
    var decoded = decipher.update(encryptedData,'binary','utf8')
    decoded += decipher.final('utf8')
    
    decoded = JSON.parse(decoded)

  } catch (err) {
    throw new Error('Illegal Buffer')
  }

  if (decoded.watermark.appid !== this.appId) {
    throw new Error('Ill程式設計客棧egal Buffer')
  }

  return decoded
}

module.exports = WXBizDataCrypt

app.js全部程式碼如下

// 加密解密
const crypto = require('crypto');
const WXBizDataCrypt = require('./WXBizDataCrypt')

const express = require('express')
const bodyParser = require('body-parser')
const request = require('request')
const app = express()
app.use(bodyParser.json())

const wx = {
    appid: '',secret: ''
}

var db = {
    session: {},user: {}
}

app.post('/login',res) => {
    // 注意:小程式端的appid必須使用真實賬號,如果使用測試賬號,會出現login code錯誤
    console.log('login code: ' + 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'
    request(url,body) => {
        console.log('session: ' + body)
        var session = JSON.parse(body)
        if(session.openid) {
            var token = 'token_' + new Date().getTime()
            db.session[token] = session
            if(!db.user[session.openid]) {
                db.user[session.openid] = {
                    credit: 100
                }
            }
        }
        res.json({
            token: token
        })
    })
})

app.get('/checklogin',res) => {
    var session = db.session[req.query.token]
    console.log('checklogin: ',session)
    // 將使用者是否已經登入的布林值返回給客戶端
    res.json({
        is_login: session !== undefined
    })
})

app.get('/credit',res) => {
    var session = db.session[req.query.token]
    if(session && db.user[session.openid]) {
        res.json({
            credit: db.user[session.openid].credit
        })
    } else {
        res.json({
            err: '使用者不存在,或未登入。'
        })
    }
})

app.post('/userinfo',res) => {
    // 獲取session值
    var session = db.session[req.query.token]
    console.log('session:' + session)
    if(session) {
        // 使用appid和session_key解密encryptedData
        var pc = new WXBizDataCrypt(wx.appid,session.session_key)
        var data = pc.decryptData(req.body.encryptedData,req.body.iv)
        console.log('解密後:',data)
        // 校驗rawData是否正確通過
        var sha1 = crypto.createHash('sha1')
        sha1.update(req.body.rawData + session.session_key)
        var signature2 = sha1.digest('hex')
        console.log(signature2)
        console.log(req.body.signature)
        res.json({
            pass: signature2 === req.body.signature
        })
    } else {
        res.json({
            err: '使用者不存在,或未登入。'
        })
    }
}程式設計客棧)

app.listen(3000,() => {
    console.log('server running at http://127.0.0.1:3000')
})

開啟伺服器

儲存上述程式碼,開啟控制檯或者Powershell或者linux終端,執行下面語句即可開啟伺服器的3000 供伺服器訪問。

nodemon app.js

到此這篇關於微信小程式實現使用者登入模組伺服器搭建的文章就介紹到這了,更多相關小程式登入模組伺服器搭建內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!