微信小程序?qū)崿F(xiàn)用戶登錄模塊服務(wù)器搭建
我選用的是node.js來(lái)搭建服務(wù)器,沒(méi)有安裝的小伙伴可以參考我的node.js其他博客。
服務(wù)器安裝與配置
初始化項(xiàng)目,將會(huì)自動(dòng)創(chuàng)建package.json配置文件。
npm init -y
安裝Express框架和request模塊。
npm install express –save npm install request --save
安裝nodemon監(jiān)控文件修改(如果已經(jīng)安裝則跳過(guò)此步)。
npm install nodemon -g
代碼編寫
執(zhí)行上述命令后,在項(xiàng)目目錄下創(chuàng)建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: '', // 需要填寫開發(fā)者的AppID
secret: '' // 需要填寫開發(fā)者的AppSecret
}
模擬數(shù)據(jù)庫(kù)。(在這就用數(shù)組形式,數(shù)據(jù)庫(kù)搭建比較繁瑣,在這不展示了,可以參考我博客中其他的node.js+mysql項(xiàng)目)
var db = { // 模擬數(shù)據(jù)庫(kù)
session: {}, // 保存openid和session_key的會(huì)話信息
user: {} // 保存用戶記錄,如用戶名、積分等數(shù)據(jù)
}
請(qǐng)求登錄接口,校驗(yàn)登錄憑證的微信接口URL地址。
(下面的url 是騰訊提供的測(cè)試 憑證的接口,不用修改)
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})
})
})
判斷 session 中 openid 語(yǔ)句代碼。
if (session.openid) {
var session = JSON.parse(body)
// 用于生成token
var token = 'token_' + new Date().getTime()
db.session[token] = session
}
設(shè)置訪問(wèn)接口 3000
app.listen(3000, () => {
console.log('server running at http://127.0.0.1:3000')
})
給大家整理了一下
因?yàn)檫@里的appid和session_key需要進(jìn)行解密,所以要用到微信的WXBizDataCrypt函數(shù)
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)
// 設(shè)置自動(dòng) padding 為 true,刪除填充補(bǔ)位
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必須使用真實(shí)賬號(hào),如果使用測(cè)試賬號(hào),會(huì)出現(xiàn)login code錯(cuò)誤
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)
// 將用戶是否已經(jīng)登錄的布爾值返回給客戶端
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)
// 校驗(yàn)rawData是否正確通過(guò)
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')
})
開啟服務(wù)器
保存上述代碼,打開控制臺(tái)或者Powershell或者Linux終端,運(yùn)行下面語(yǔ)句即可打開服務(wù)器的3000 供服務(wù)器訪問(wèn)。
nodemon app.js
到此這篇關(guān)于微信小程序?qū)崿F(xiàn)用戶登錄模塊服務(wù)器搭建的文章就介紹到這了,更多相關(guān)小程序登錄模塊服務(wù)器搭建內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
經(jīng)過(guò)綁定元素時(shí)會(huì)多次觸發(fā)mouseover和mouseout事件
經(jīng)過(guò)綁定元素時(shí)會(huì)多次觸發(fā)mouseover和mouseout事件,針對(duì)這個(gè)問(wèn)題,下面有個(gè)不錯(cuò)的解決方法2014-02-02
javascript實(shí)現(xiàn)html頁(yè)面之間參數(shù)傳遞的四種方法實(shí)例分析
這篇文章主要介紹了javascript實(shí)現(xiàn)html頁(yè)面之間參數(shù)傳遞的四種方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了JavaScript實(shí)現(xiàn)頁(yè)面之間參數(shù)傳遞的常用技巧,需要的朋友可以參考下2015-12-12
js arguments.callee的應(yīng)用代碼
arguments.callee的使用方法,具體大家自己測(cè)試了2009-05-05
layer子層給父層頁(yè)面元素賦值,以達(dá)到向父層頁(yè)面?zhèn)髦档男Ч麑?shí)例
下面小編就為大家?guī)?lái)一篇layer子層給父層頁(yè)面元素賦值,以達(dá)到向父層頁(yè)面?zhèn)髦档男Ч麑?shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
javascript實(shí)現(xiàn)倒計(jì)時(shí)跳轉(zhuǎn)頁(yè)面
本文給大家介紹了如何使用javascript實(shí)現(xiàn)倒計(jì)時(shí)跳轉(zhuǎn)到其他頁(yè)面的方法以及實(shí)現(xiàn)原理,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。2016-01-01
Code:loadScript( )加載js的功能函數(shù)
Code:loadScript( )加載js的功能函數(shù)...2007-02-02
微信小程序?qū)崿F(xiàn)用table顯示數(shù)據(jù)庫(kù)反饋的多條數(shù)據(jù)功能示例
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)用table顯示數(shù)據(jù)庫(kù)反饋的多條數(shù)據(jù)功能,涉及微信小程序wx.request訪問(wèn)php后臺(tái)及返回結(jié)果的顯示布局相關(guān)操作技巧,需要的朋友可以參考下2019-05-05
js實(shí)現(xiàn)Select頭像選擇實(shí)時(shí)預(yù)覽代碼
這篇文章主要介紹了js實(shí)現(xiàn)Select頭像選擇實(shí)時(shí)預(yù)覽代碼,涉及javascript動(dòng)態(tài)遍歷及設(shè)置select選項(xiàng)的技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-08-08

