Node.js开发微信公众号3 - 获取用户信息

news/2024/7/10 1:11:40 标签: nodejs, vue, 小程序, openid, ajax

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

 


http://www.niftyadmin.cn/n/1319190.html

相关文章

Node.js开发微信公众号4 - 发送模板

1.先要在后台创建一个自定义模板 模板内容如下 {{first.DATA}} 姓名&#xff1a;{{keyword1.DATA}} 性别&#xff1a;{{keyword2.DATA}} 体温&#xff1a;{{keyword3.DATA}} {{remark.DATA}} 2.发送模板服务&#xff0c;此服务需要请求携带用户参数用户自定义模板内容 route…

黑马程序员-12 网络编程

------- android培训、java培训、期待与您交流&#xff01; ---------- 传输协议UDP 将数据及源和目的封装到数据包中&#xff0c;不需要建立连接&#xff1b; 每个数据包的大小限制在64K以内&#xff1b; 因无连接&#xff0c;是不可靠协议&#xff1b; 不需要建立连接&#x…

前端面试题CSS-两盒子水平垂直居中

让子盒子在父盒子里水平垂直居中 只要回答一个就好了 1.定位 父盒子设置&#xff1a; position&#xff1a;relative&#xff1b; 子盒子-已知宽高&#xff1a; position&#xff1a;absolute&#xff1b;top&#xff1a;50%&#xff1b;left&#xff1a;50%&#xff1b;mar…

Java:定时启动线程

这里提供两种在指定时间后启动线程的方法。一是通过java.util.concurrent.DelayQueue实现&#xff1b;二是通过java.util.concurrent.ScheduledThreadPoolExecutor实现。1. java.util.concurrent.DelayQueue类DelayQueue是一个无界阻塞队列&#xff0c;只有在延迟期满时才能从中…

PL/SQL块定义部分--LOB类型

在Oracle的早期版本中&#xff0c;使用LONG 和 LONG RAW 类型存放大数据。从8i版本开始&#xff0c;Oracle引入了LOB数据类型&#xff0c;并且Oracle建议开发人员尽量去使用LOB类型而不去使用 LONG 和 LONG RAW 。LOB类型和LONG、LONG RAW类型相比有几个不同的地方。如&#xf…

前端面试题CSS-盒子模型

三种盒子模型 1.标准盒子模型 css对应的属性&#xff1a;box-sizing&#xff1a;content-box 设置的元素大小是内容的大小&#xff0c;不是盒子的大小 盒子的大小 content padding border margin 2.IE盒子模型&#xff08;怪异盒子模型 &#xff09; css对应的属性&am…

Surface初体验

由于研发需要公司购入了一台Surface RT&#xff0c;今天拿到后玩了玩&#xff0c;发点牢骚。先说硬件&#xff0c;Surface RT的配置还是不错的&#xff0c;T30 双核处理器&#xff0c;2GB内存&#xff0c;在使用过程中感觉非常流畅。自从开始买了iPad以后&#xff0c;再使用其…

windows命令行下启动oracle[转载]

&#xff0d;&#xff0d;总结启动命令如下&#xff1a;lsnrctl [start|stop|status] &#xff0d;&#xff0d;启动监听器&#xff0c;停止监听器&#xff0c;查看监听器的状态&#xff1b;net [start|stop] oracleserviceorcl 一、独立启动&…