위챗 애플릿은 사용자 로그인 모듈 서버 구축을 실현한다
서버 설치 및 구성
프로젝트를 초기화하면 패키지가 자동으로 생성됩니다.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
위챗 소프로그램 사용자 로그인 모듈 서버 구축에 관한 이 글은 여기에 소개되었습니다. 더 많은 소프로그램 로그인 모듈 서버 구축에 관한 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 저희를 많이 사랑해 주십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
위챗 프로그램 개발에서 직면한 몇 가지 사소한 문제를 깊이 있게 분석하다로컬 그림이 표시되지 않으면 개발 도구가 실행되는 것은 문제없지만, 실제 디버깅은 표시되지 않습니다 자세히 관찰한 결과 경로는 문제없다. 문제는 사진 이름이 중국어가 될 수 없다는 것이다. 이를 자모+숫자로 바꾸면 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.