问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

微信公众号OAuth2.0授权登录完整教程

创作时间:
2025-01-21 17:50:16
作者:
@小白创作中心

微信公众号OAuth2.0授权登录完整教程

随着移动互联网的普及,微信公众号已经成为企业和开发者连接用户的重要渠道。实现微信公众号登录功能,不仅能够简化用户的登录流程,还能为企业提供更多用户数据支持。本文将详细介绍如何通过微信公众号实现OAuth2.0授权登录,包括账号申请、服务器配置、前端开发和后端实现等关键步骤。

01

账号准备与注册流程

在开始开发之前,首先需要注册一个微信公众号。微信公众号分为订阅号和服务号两种类型:

  • 订阅号:主要用于内容推送,每天可以发送一条消息,适合个人或小型团队使用。
  • 服务号:提供更强大的功能,如自定义菜单、支付等,每月可发送四条消息,适合企业使用。

注册步骤:

  1. 打开微信公众平台官网(https://mp.weixin.qq.com/),点击“立即注册”。
  2. 选择“小程序”或“公众号”进行注册。
  3. 填写邮箱、密码等信息,完成账号激活。
  4. 根据提示填写企业信息、主体信息和管理员信息。
  5. 使用管理员微信扫描二维码完成验证。

对于开发测试,建议先申请测试账号:

02

OAuth2.0授权机制详解

OAuth2.0是一种开放授权标准,允许用户让第三方应用获取短期有效的访问令牌,代替用户密码访问资源服务器上的特定资源。在微信公众号登录场景中,OAuth2.0授权流程主要包括以下步骤:

  1. 用户同意授权,获取code
  2. 通过code换取网页授权access_token
  3. 刷新access_token(如果需要)
  4. 拉取用户信息(需scope为snsapi_userinfo)

为什么需要authorization_code?

  • 安全性考虑:authorization_code通过redirect_uri传递,相对安全。而access_token是敏感数据,不适合通过浏览器重定向传递。
  • 身份验证:Client需要使用authorization_code向AS(授权服务器)换取access_token,这个过程可以验证Client的真实身份。
03

服务器配置与开发步骤

服务器配置

  1. 域名注册与解析:在域名注册网站上注册一个域名,并将域名解析到服务器IP地址。
  2. 服务器配置:安装并配置Apache或Nginx,确保监听80端口。
  3. 公众号信息配置:在微信公众平台获取AppID和AppSecret,用于服务器验证。
  4. 验证服务器:在开发设置中配置服务器URL和Token,实现接口接收微信服务器请求。

前端开发

前端主要负责获取code并请求后端:

mounted() {
  const user = storage.get("userInfo") || {};
  if (Tool.isEmpty(user)) {
    this.getCode();
  }
},
methods: {
  getCode() {
    this.code = '';
    var callback_url = Wxconst.CALLBACK_URL;
    var appid = Wxconst.APPID;
    this.code = this.getUrlCode().code;
    if (this.code == null || this.code === '') {
      window.location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${callback_url}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect`;
    } else {
      // 发送code到后端
      this.$axios.post('/api/wechat/login', { code: this.code }).then(res => {
        if (res.data.success) {
          storage.set("userInfo", res.data.userInfo);
        }
      });
    }
  }
}

后端实现

后端需要实现以下功能:

  1. 通过code换取access_token
  2. 拉取用户信息
  3. 保存用户信息并返回给前端

以Node.js为例:

const axios = require('axios');

app.post('/api/wechat/login', async (req, res) => {
  const { code } = req.body;
  const appId = 'your_app_id';
  const appSecret = 'your_app_secret';

  try {
    // 换取access_token
    const tokenRes = await axios.get(`https://api.weixin.qq.com/sns/oauth2/access_token?appid=${appId}&secret=${appSecret}&code=${code}&grant_type=authorization_code`);
    const accessToken = tokenRes.data.access_token;
    const openId = tokenRes.data.openid;

    // 获取用户信息
    const userRes = await axios.get(`https://api.weixin.qq.com/sns/userinfo?access_token=${accessToken}&openid=${openId}`);
    const userInfo = userRes.data;

    // 保存用户信息
    // ...

    res.json({ success: true, userInfo });
  } catch (error) {
    res.json({ success: false, message: error.message });
  }
});
04

实战案例

假设我们正在开发一个前后端分离的项目,需要实现微信公众号登录功能。以下是具体的实现步骤:

  1. 前端页面:在登录页面添加微信登录按钮,点击后跳转到微信授权页面。

  2. 微信授权页面:用户同意授权后,微信会重定向到回调页面,并附带code参数。

  3. 前端获取code:在回调页面中获取code,然后发送到后端。

  4. 后端处理:后端收到code后,通过微信接口换取access_token,再获取用户信息。

  5. 登录成功:将用户信息保存到数据库,生成JWT令牌返回给前端。

05

常见问题与解决方案

  1. 跨域问题:前后端分离项目中容易遇到跨域问题,需要在后端配置CORS。
  2. code失效:code只能使用一次,如果前端多次请求后端,需要重新获取code。
  3. access_token过期:access_token有一定有效期,需要定期刷新。
  4. 用户信息获取失败:检查scope参数是否正确,是否为snsapi_userinfo。

通过以上步骤,你可以实现一个完整的微信公众号登录功能。在实际开发中,还需要注意安全性,比如对敏感数据进行加密处理,防止CSRF攻击等。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号