开发者社区> 流楚丶格念> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

微信小程序——用户登录模块服务器搭建

简介: 微信小程序——用户登录模块服务器搭建
+关注继续查看

我选用的是node.js来搭建服务器,没有安装的小伙伴可以参考我的node.js其他博客。


服务器安装与配置


  1. 初始化项目,将会自动创建package.json配置文件。


npm init -y
• 1


  1. 安装Express框架和request模块。


npm install express –save
npm install request --save


  1. 安装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})
  })
})


判断 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('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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Python编程:WSGI服务器的参考实现wsgiref模块
Python编程:WSGI服务器的参考实现wsgiref模块
55 0
使用云服务器搭建微信公众号后台服务
使用云服务器搭建微信公众号后台服务
2790 0
使用云服务器搭建微信公众号后台服务
一、申请微信个人订阅号 1.注册开发者账号 如果你还不是微信订阅号开发者,请先在微信公众平台注册: https://mp.weixin.qq.com 2.获取微信订阅号公众平台认证字段信息 我们需要获取3个字段:AppID Token EncodingAESKey。
1972 0
微信小程序登录方案
微信小程序登录方案 登录程序 app.js 调用wx.login获取code 将code作为参数请求自己业务登录接口获取session_key 存储session_key 如果有回调执行回调 App({ wxLogin: function (callback) { wx.
990 0
微信小程序开发之常见BUG
1.wx:if 当前版本为1.3.0,正常使用 1 2 3 如果内部嵌套了label标签,最后使用 加载时候,将会出现小黑块。解决方法就是都用wx:elif {{PriorityName}}{{Title}} ...
902 0
群用户通过微信小程序可以更好地协作了
  今天,小程序向开发者开放了群ID的接口能力。简单地说,就是当你把小程序分享在群聊中,被点击后开发者可获取群ID和群名称,也方便更好地针对群场景提供个性化服务。不同的群有各自的群ID,那么这个新能力开发者该怎么使用? 群用户间可以更好地协作大家都知道,小程序可以方便地在群聊中分享,但开发者难以识别不同用户的点击路径。
811 0
微信小程序把玩(六)模块化
原文:微信小程序把玩(六)模块化 模块化也就是将一些通用的东西抽出来放到一个文件中,通过module.exports去暴露接口。我们在最初新建项目时就有个util.js文件就是被模块化处理时间的 /** * 处理具体业务逻辑 */ function formatTime(date) { //获取年月日 var year = date.
808 0
JSP 实用程序之简易图片服务器
最初 node 版本在这里。 源码下载,单 jsp 文件 http://pan.baidu.com/s/1gfoDy0r (百度云提供) App 客户端加载图片的时候,在服务端需要进行相关的优化,否则会给流量和占用内存带来消耗和压力。
764 0
+关注
流楚丶格念
csdn平台优质创作者,51cto TOP博主,360图书馆科技博主,燕山大学目前大三在读,日拱一卒,功不唐捐,加油!!!
1010
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载