Node.js開發微信公眾號3 - 獲取使用者資訊
阿新 • • 發佈:2021-02-08
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