1. 程式人生 > 其它 >Node.js開發微信公眾號3 - 獲取使用者資訊

Node.js開發微信公眾號3 - 獲取使用者資訊

技術標籤:nodejsvue小程式openidajax

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