node+express实现微信公众号授权

微信的网页授权是指在微信公众号获取用户个人信息等一些权限.这次我们将使用node+express实现一个微信授权功能。

准备工作
  • 如果没有域名的话,现在我是通本地host文件配置一个域名,只适合局域网测试专用。C:\Windows\System32\drivers\etc
    在这里插入图片描述
  • 我们使用vue快速搭建一个H5页面,vue.config.js一些简单的配置,前端做跨域处理
module.exports = {
  lintOnSave: false,
  devServer: {
    host: "m.imooc.com",
    port: 8080, // 端口号
    https: false, // https:{type:Boolean}
    open: true, //配置自动启动浏览器
    proxy: {
      "/api": {
        //代理api
        target: "http://localhost:3000", //服务器api地址
        ws: false, // proxy websockets
        changeOrigin: false //是否跨域
      }
    }
  }
};

  • 在这里我们使用的是微信公众号测试号的appIDappsecret
  • 测试号网址 ```http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index````
  • 测试号二维码 需要开发人员扫码二维码认证一下。得到权限
  • 网页帐号 网页授权获取用户基本信息点击修改 填写授权回调页面域名
    在这里插入图片描述

在这里插入图片描述

  • 如果是有端口号的话一定要填写端口号
  • JS接口安全域名 – 网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等
微信授权流程
  • 用户同意授权,获取 code
  • 通过 code 换取网页 access_token
  • 拉取用户信息(需 scope 为 snsapi_userinfo)
  • 关于网页授权的两种scope的区别说明
    • 以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
    • 以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
开发后端接口
  • 使用express快速搭建一个框架,这里就不做讲解,博客文章中也有写到
  • 需要安装两个插件request 请求接口,memory-cache存储机制,相当于redis差不多
let request = require('request')
let cache = require('memory-cache')
  • config文件我是定于的一些测试号的appID和appSecret
重定向
  • 当用户打开网页时,查看是否授权,没有每天授权,重定向到授权页面,否则回到当前页面
//redirectUrl 授权回调地址,从客户端返回的地址
//callback 获取openId 用户点击授权,调用这个

router.get('/redirect', function (req, res) {
  let redirectUrl = req.query.url,
    scope = req.query.scope,
    callback = 'http://m.imooc.com:8080/api/wechat/getOpenId'
  cache.put('redirectUrl', redirectUrl)
  let authorizeUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${config.appId}&redirect_uri=${callback}&response_type=code&scope=${scope}&state=STATE#wechat_redirect`
  res.redirect(authorizeUrl)
})

在这里插入图片描述
在这里插入图片描述

根据code获取用户的openId

在这里插入图片描述

router.get('/getOpenId', async function (req, res) {
  let code = req.query.code
  if (!code) {
    res.json({
      code: 1001,
      data: '',
      message: '当前未获取到code码',
    })
  } else {
    // 拿到用户openId
    let token_url = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=${config.appId}&secret=${config.appSecret}&code=${code}&grant_type=authorization_code`
    request.get(token_url, function (err, response, body) {
      console.log(body)
      if (!err && response.statusCode == '200') {
        let data = JSON.parse(body)
        if (data && !data.errCode) {
          let expire_time = 1000 * 60 * 60 * 2 //过期时间
          cache.put('access_token', data.access_token, expire_time)
          cache.put('openId', data.openId, expire_time)
          res.cookie('openId', data.openid, {
            maxAge: expire_time,
          }) //存储openId
          let redirectUrl = cache.get('redirectUrl')
          res.redirect(redirectUrl)
        } else {
          res.json({
            code: data.errcode,
            data: '',
            message: data.errmsg,
          })
        }
      } else {
        res.json({
          code: 1009,
          data: '',
          message: err,
        })
      }
    })
  }
})
获取用户信息
  • 通过获取用户openID就可以拿到用户信息。
router.get('/getUserInfo', function (req, res) {
  let access_token = cache.get('access_token')
  let openId = cache.get('openId')
  let userinfo = `https://api.weixin.qq.com/sns/userinfo?access_token=${access_token}&openid=${openId}&lang=zh_CN`;
  request.get(userinfo, function (err, response, body) {
    if (!err && response.statusCode == '200') {
      let data = JSON.parse(body)
      if (data && !data.errCode) {
        console.log(data, 'dadsd')
        res.json({
          code: 200,
          data,
          message: '获取用户信息成功'
        })
      } else {
        res.json({
          code: data.errcode,
          data: '',
          message: data.errmsg,
        })
      }
    } else {
      res.json({
        code: 1009,
        data: '',
        message: err,
      })
    }
  })
})

在这里插入图片描述

H5页面
  • 在App.vue页面中,判断cookie是否有openID,如果没有,跳转授权页面
    跳转页面接口
let openId = this.$cookie.get('openId')
      if (!openId) {
        window.location.href =' /api/wechat/redirect?url=http%3A%2F%2Fm.imooc.com%3A8080%2F%23%2Findex&scope=snsapi_userinfo'
      } 
  • 获取用户信息
getUserInfo() {
      this.$http.get(API.getUserInfo).then((response) => {
        let res = response.data
        console.log(JSON.stringify(res))
        this.userInfo = res.data
      })
    },
### 回答1: 当微信公众号客户端向 Node.js 开发的服务器发送 POST 请求时,服务器可以使用 Node.js 内置的 HTTP 模块来处理这些请求。下面是一个处理微信公众号客户端 POST 请求的基本示例: ```javascript const http = require('http'); const querystring = require('querystring'); const server = http.createServer((req, res) => { if (req.method === 'POST' && req.url === '/wechat') { let body = ''; req.on('data', chunk => { body += chunk.toString(); }); req.on('end', () => { const postData = querystring.parse(body); console.log(postData); res.end('OK'); }); } else { res.end('Hello World!'); } }); server.listen(3000, () => { console.log('Server is running on port 3000'); }); ``` 这段代码创建了一个 HTTP 服务器,监听在 3000 端口上。当收到来自微信公众号客户端的 POST 请求时,会解析请求体中的数据,并打印到控制台上,最后返回一个字符串 "OK"。当收到其他请求时,返回 "Hello World!"。 需要注意的是,微信公众号开发涉及到很多安全和验证的问题,开发者需要仔细阅读微信公众平台的开发文档,了解如何进行接口调用和消息交互。 ### 回答2: 在使用Node.js开发微信公众号时,服务端可以使用第三方库如Express来处理HTTP请求。当客户端发送一个POST请求时,服务端可以通过Express中间件来解析请求内容,并触发相应的处理函数。 具体而言,服务端在接收到客户端的POST请求后,首先会解析请求的内容,包括请求头、请求体等等。在微信公众号开发中,通常会解析微信服务器发送过来的XML格式的请求体,其中包含了用户发送的消息或事件等信息。 服务端可以使用Express中的`body-parser`中间件来解析请求体,并将解析后的JSON对象传递给后续的处理函数。通过定义相应的路由和处理函数,服务端可以根据不同的请求内容来响应对应的操作。 例如,当客户端发送一条用户的文本消息时,服务端可以通过定义一个处理函数来响应这个请求,获取消息内容并进行相应的处理,比如回复一条特定的文本消息。 另外,服务端还能和微信服务器进行交互,比如校验服务器地址的有效性、获取access_token等操作。服务端可以通过向微信服务器发送GET或POST请求来实现这些功能。微信服务器会根据请求内容进行相应的处理,并发送相应的响应给服务端。 通过这样的方式,服务端可以响应客户端的POST请求,并进行相应的处理和交互,从而实现微信公众号的开发和运行。 ### 回答3: 在Node.js开发微信公众号时,服务端是通过使用框架或库来响应客户端的POST请求的。 首先,服务端会创建一个HTTP服务器,并监听指定的端口。当客户端发送POST请求时,服务端会接收到请求。 在接收到POST请求后,服务端会进行解析,获取请求中的参数和数据。这可以通过使用Node.js内置的http模块或者一些第三方库来实现。 接下来,服务端会根据请求的具体内容进行相应的处理。在微信公众号开发中,常见的是处理用户的消息或事件。服务端会根据接收到的POST请求中的数据,比如用户发送的消息类型、内容等,来进行相应的处理,比如根据关键词回复消息或者执行相应的操作。 处理完请求后,服务端会生成相应的响应数据,并将其返回给客户端。这可以通过设置HTTP响应头部和正文来实现。在微信公众号开发中,通常会将响应数据封装成XML格式,再返回给客户端。 最后,服务端会将封装好的响应数据发送给客户端。客户端收到响应后,会根据接收到的数据进行相应的处理,比如显示在用户的微信界面上。 总之,Node.js开发微信公众号时,服务端是通过创建HTTP服务器来响应客户端的POST请求的。服务端会接收、解析、处理请求,并返回相应的数据给客户端。通过这种方式,实现服务端与客户端之间的交互和通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值