在小程序前端页面中,添加一个按钮用于触发微信登录。
微信登录
在后端服务器中,实现一个接口用于处理微信登录请求,并调用微信的jscode2session
接口获取用户的openid。
// server.js const express = require('express'); const axios = require('axios'); const app = express(); app.use(express.json()); app.post('/api/wxlogin', async (req, res) => { const { code } = req.body; const appId = 'YOUR_APPID'; const appSecret = 'YOUR_APPSECRET'; try { const response = await axios.get('https://api.weixin.qq.com/sns/jscode2session', { params: { appid: appId, secret: appSecret, js_code: code, grant_type: 'authorization_code' } }); const { openid, session_key } = response.data; // 这里可以根据openid查询或创建用户,并生成token const token = generateToken(openid, session_key); res.json({ token }); } catch (error) { res.status(500).json({ error: '登录失败' }); } }); function generateToken(openid, session_key) { // 这里可以使用JWT或其他方式生成token return { openid, session_key, expireTime: Date.now() + 1000 * 60 * 60 * 24 // 24小时有效期 }; } app.listen(3000, () => { console.log('Server is running on port 3000'); });
在前端,使用uni.setStorageSync
将token存储到本地,并在后续请求中携带该token。
// utils/auth.js export function setToken(token) { uni.setStorageSync('ACCESS_TOKEN', JSON.stringify(token)); } export function getAccessToken() { const tokenStr = uni.getStorageSync('ACCESS_TOKEN'); if (!tokenStr) return null; const token = JSON.parse(tokenStr); if (token.expireTime && token.expireTime > Date.now()) { return token; } else { uni.removeStorageSync('ACCESS_TOKEN'); return null; } }
在后端,每次接收到请求时,验证token的合法性。
// server.js const jwt = require('jsonwebtoken'); app.use((req, res, next) => { const token = req.headers['authorization']; if (!token) return res.status(401).json({ error: '未授权' }); jwt.verify(token, 'YOUR_SECRET_KEY', (err, decoded) => { if (err) return res.status(401).json({ error: '无效的token' }); req.user = decoded; next(); }); });