1.需要一个页面来授权重定向,重定向后的页面可以获取到用户的code
router.get("/authentication", (req, res) => {
// 配置的appid
const { appID } = config
// 你需要接受获取code的页面
const redirect_uri = urlencode("xxx")
const scope = "snsapi_userinfo"
// 直接跳转到这个url进行重定向
const url = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appID}&redirect_uri=${redirect_uri}&response_type=code&scope=${scope}&state=STATE&connect_redirect=1#wechat_redirect`
const html = `<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" >
<title>微信鉴权引导</title>
</head>
<body><a href="${url}">跳转到鉴权页面</a></body>
</html>`
res.setHeader("Content-Type", "text/html")
res.send(html)
})
2.在重定向后的页面再访问node请求,这里的代码不公开,自己写一个页面访问获取用户信息的node接口
3. 获取用户信息接口
router.get("/info", async (req, res, next) => {
try {
// 在请求中获取用户code
const code = req.query.code
// 获取用户open_id
const openid = await getOpenId(code)
// 获取access_token
const { access_token } = await accessToken.fetchAccessToken()
// 获取用户信息
const data = await getUserInfo(openid, access_token)
res.send({
state: "success",
info: data,
})
} catch (error) {
console.log("获取用户信息失败:" + error)
next(error)
}
})
4.核心代码
const rp = require("request-promise-native") //发送请求
const { appID, appsecret, grant_type } = require("../config") // 配置信息grant_type: 'client_credential'
class Auth {
constructor() {}
// 获取access_token
getAccessToken() {
const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=${grant_type}&appid=${appID}&secret=${appsecret}`
return new Promise((resolve, reject) => {
rp({ method: "GET", url, json: true })
.then((res) => {
console.log(`获取access_token成功: ${res.access_token}`)
resolve(res)
})
.catch((err) => {
console.log(`获取access_token失败: ${err}`)
reject(err)
})
})
}
//获取 openid
getOpenId(code) {
const url = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=${appID}&secret=${appsecret}&code=${code}&grant_type=authorization_code`
return new Promise((resolve, reject) => {
rp({ method: "GET", url, json: true })
.then((data) => {
let openid = data.openid
console.log(`获取openid成功: ${openid}`)
resolve(openid)
})
.catch((err) => {
console.log(`获取openid失败: ${err}`)
reject(err)
})
})
}
// 获取用户信息
getUserInfo(openid, access_token) {
const url = `https://api.weixin.qq.com/cgi-bin/user/info?access_token=${access_token}&openid=${openid}&lang=zh_CN`
return new Promise((resolve, reject) => {
rp({ method: "GET", url, json: true })
.then((data) => {
console.log("获取用户信息成功")
console.log(data)
resolve(data)
})
.catch((err) => {
console.log("获取用户信息成功")
console.log(err)
reject(err)
})
})
}
}
const auth = new Auth()
module.exports = auth