위챗 애플릿은 사용자 로그인 모듈 서버 구축을 실현한다

내가 선택한 것은 노드다.js는 서버를 구축하기 위해 설치되지 않은 파트너는 나의 node를 참고할 수 있습니다.js 기타 블로그.

서버 설치 및 구성


프로젝트를 초기화하면 패키지가 자동으로 생성됩니다.json 프로필.

npm init -y
Express 프레임워크와 request 모듈을 설치합니다.

npm install express Csave
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(bodyParser.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, body) => {
     if(){ //  session.openid }
     }
     res.json({token: token})
  })
})
세션에서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('Illegal 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', (req, 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, (err, response, 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', (req, res) => {
    var session = db.session[req.query.token]
    console.log('checklogin: ', session)
    //  
    res.json({
        is_login: session !== undefined
    })
})

app.get('/credit', (req, 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', (req, 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
위챗 소프로그램 사용자 로그인 모듈 서버 구축에 관한 이 글은 여기에 소개되었습니다. 더 많은 소프로그램 로그인 모듈 서버 구축에 관한 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 저희를 많이 사랑해 주십시오!

좋은 웹페이지 즐겨찾기