1.地址
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
2 时序图

3.流程
1
| $ npx express express-weixin-login
|
创建小程序选择测试账号 https://developers.weixin.qq.com/miniprogram/dev/devtools/sandbox.html
3.1 小程序中调用 wx.login 获取code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| login () { wx.login({ success: res => { console.log(res) const code = res.code wx.request({ url: 'http://localhost:3000/auth', data: { code },success: res => { console.log(res) wx.setStorageSync('token', res.data.data.token) } }) } }) },
|
3.2 服务器处理数据返回token
1
| $ cnpm i axios jsonwebtoken -S
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| var express = require('express'); var axios = require('axios') var jwt = require('jsonwebtoken') var router = express.Router();
router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); });
router.get('/auth', (req, res, next) => {
const data = { appid: 'wx94b38891ccfbd0cf', secret: 'f72217de558d58a817381208fba69edf', js_code: req.query.code, grant_type: 'authorization_code' }
axios.get('https://api.weixin.qq.com/sns/jscode2session', { params: data }).then(resultRes => { console.log(resultRes) const session_key = resultRes.data.session_key const openid = resultRes.data.openid const token = jwt.sign({ session_key, openid }, 'bj2304', { expiresIn: 20 }) res.send({ code: '200', message:'登录', data: { token } }) }) })
module.exports = router;
|
3.3 服务器验证token返回数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| var express = require('express'); var axios = require('axios') var jwt = require('jsonwebtoken') var router = express.Router();
router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); });
router.get('/auth', (req, res, next) => {
const data = { appid: 'wx94b38891ccfbd0cf', secret: 'f72217de558d58a817381208fba69edf', js_code: req.query.code, grant_type: 'authorization_code' }
axios.get('https://api.weixin.qq.com/sns/jscode2session', { params: data }).then(resultRes => { console.log(resultRes) const session_key = resultRes.data.session_key const openid = resultRes.data.openid const token = jwt.sign({ session_key, openid }, 'bj2304', { expiresIn: 20 }) res.send({ code: '200', message:'登录', data: { token } }) }) })
router.post('/isAuth', (req, res, next) => { const token = req.body.token if (!token) { res.send({ code: '10119', message: 'token必须传递'}) } else { jwt.verify(token, 'bj2304', (err, decoded) => { req.decoded= decoded if (decoded) {
console.log(1) res.send({ code: '200', message: '验证成功', data: '100000000000000000' }) } else { console.log(2) res.send({ code: '10200', message: 'token已过期' }) } }) } })
module.exports = router;
|
3.4 小程序获取数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| // pages/login/login.js Page({ data: {
}, loginFn () { // 1.调用wx.login()函数获取临时登录凭证code wx.login({ success: res => { console.log(res) // 2.调用登录接口,传入需要的参数 const data = { code: res.code }
wx.request({ url: 'http://localhost:3000/auth', data, success: res => { console.log(res) wx.setStorageSync('token', res.data.data.token) } }) } }) }, checkLoginState () { wx.request({ url: 'http://localhost:3000/isAuth', method: 'POST', data: { token: wx.getStorageSync('token') }, success: res => { console.log(res) } }) } })
|
4.获取用户手机号