微信小程序?qū)崿F(xiàn)用戶登錄模塊服務(wù)器搭建
我選用的是node.js來搭建服務(wù)器,沒有安裝的小伙伴可以參考我的node.js其他博客。
服務(wù)器安裝與配置
初始化項目,將會自動創(chuàng)建package.json配置文件。
npm init -y
安裝Express框架和request模塊。
npm install express –save npm install request --save
安裝nodemon監(jiān)控文件修改(如果已經(jīng)安裝則跳過此步)。
npm install nodemon -g
代碼編寫
執(zhí)行上述命令后,在項目目錄下創(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ù)庫。(在這就用數(shù)組形式,數(shù)據(jù)庫搭建比較繁瑣,在這不展示了,可以參考我博客中其他的node.js+mysql項目)
var db = { // 模擬數(shù)據(jù)庫 session: {}, // 保存openid和session_key的會話信息 user: {} // 保存用戶記錄,如用戶名、積分等數(shù)據(jù) }
請求登錄接口,校驗登錄憑證的微信接口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}) }) })
判斷 session 中 openid 語句代碼。
if (session.openid) { var session = JSON.parse(body) // 用于生成token var token = 'token_' + new Date().getTime() db.session[token] = session }
設(shè)置訪問接口 3000
app.listen(3000, () => { console.log('server running at http://127.0.0.1:3000') })
給大家整理了一下
因為這里的appid和session_key需要進行解密,所以要用到微信的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è)置自動 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必須使用真實賬號,如果使用測試賬號,會出現(xiàn)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) // 將用戶是否已經(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) // 校驗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') })
開啟服務(wù)器
保存上述代碼,打開控制臺或者Powershell或者Linux終端,運行下面語句即可打開服務(wù)器的3000 供服務(wù)器訪問。
nodemon app.js
到此這篇關(guān)于微信小程序?qū)崿F(xiàn)用戶登錄模塊服務(wù)器搭建的文章就介紹到這了,更多相關(guān)小程序登錄模塊服務(wù)器搭建內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
經(jīng)過綁定元素時會多次觸發(fā)mouseover和mouseout事件
經(jīng)過綁定元素時會多次觸發(fā)mouseover和mouseout事件,針對這個問題,下面有個不錯的解決方法2014-02-02javascript實現(xiàn)html頁面之間參數(shù)傳遞的四種方法實例分析
這篇文章主要介紹了javascript實現(xiàn)html頁面之間參數(shù)傳遞的四種方法,結(jié)合實例形式較為詳細(xì)的分析了JavaScript實現(xiàn)頁面之間參數(shù)傳遞的常用技巧,需要的朋友可以參考下2015-12-12js arguments.callee的應(yīng)用代碼
arguments.callee的使用方法,具體大家自己測試了2009-05-05

javascript實現(xiàn)倒計時跳轉(zhuǎn)頁面

Code:loadScript( )加載js的功能函數(shù)

微信小程序?qū)崿F(xiàn)用table顯示數(shù)據(jù)庫反饋的多條數(shù)據(jù)功能示例

js實現(xiàn)Select頭像選擇實時預(yù)覽代碼