微信小程序 授权 登录

简介: 微信小程序 授权 登录

一、微信小程序授权登录概述

微信小程序授权登录是指通过微信开放平台提供的接口,获取用户的授权信息,实现登录功能。主要步骤包括:


获取用户同意,获取授权登录。

使用获取到的临时登录凭证 code,向微信服务器请求用户的 openid 和 session_key。

使用 openid 和 session_key 进行后续业务逻辑处理。

二、实现步骤

1. 获取用户同意

在微信小程序中,通过 wx.getUserProfile 接口可以获取用户的授权信息。在 app.json 文件中需要配置 scope.userInfo 权限。

app.json:

{
  "pages": [
    "pages/index/index"
  ],
  "permission": {
    "scope.userInfo": {
      "desc": "用于展示用户信息"
    }
  },
  "window": {
    "navigationBarTitleText": "微信登录"
  }
}

2. 调用 wx.login 获取临时登录凭证 code

在小程序中通过 wx.login 接口获取临时登录凭证 code,并将 code 传给服务器,服务器通过这个 code 获取 openid 和 session_key。

pages/index/index.js:

// pages/index/index.js
Page({
  data: {
    userInfo: null,
    hasUserInfo: false,
    canIUseGetUserProfile: false
  },
  onLoad: function() {
    if (wx.getUserProfile) {
      this.setData({
        canIUseGetUserProfile: true
      });
    }
  },
  getUserProfile(e) {
    wx.getUserProfile({
      desc: '用于展示用户信息', // 声明获取用户个人信息后的用途
      success: (res) => {
        this.setData({
          userInfo: res.userInfo,
          hasUserInfo: true
        });
        this.login(); // 调用登录函数
      }
    })
  },
  login() {
    wx.login({
      success: res => {
        if (res.code) {
          // 发送 res.code 到后台换取 openid 和 session_key
          wx.request({
            url: 'https://yourserver.com/onLogin', // 服务器端登录接口
            method: 'POST',
            data: {
              code: res.code
            },
            success: res => {
              console.log('登录成功', res.data);
              // 存储 openid 和 session_key
              wx.setStorageSync('openid', res.data.openid);
              wx.setStorageSync('session_key', res.data.session_key);
            },
            fail: err => {
              console.error('登录失败', err);
            }
          })
        } else {
          console.log('登录失败!' + res.errMsg)
        }
      }
    });
  }
});

3. 服务器端获取 openid 和 session_key

服务器端接收到 code 后,通过微信提供的 API 换取用户的 openid 和 session_key。

服务器端代码(Node.js 示例):

const express = require('express');
const axios = require('axios');
const app = express();
 
app.use(express.json());
 
app.post('/onLogin', async (req, res) => {
  const { code } = req.body;
  const appId = 'your_app_id';
  const appSecret = 'your_app_secret';
  const url = `https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${appSecret}&js_code=${code}&grant_type=authorization_code`;
 
  try {
    const response = await axios.get(url);
    const { openid, session_key } = response.data;
    res.json({ openid, session_key });
  } catch (error) {
    console.error('获取 openid 和 session_key 失败', error);
    res.status(500).json({ error: '服务器错误' });
  }
});
 
app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

4. 业务逻辑处理

在获取到 openid 和 session_key 后,可以使用这些信息进行用户登录状态的维护和业务逻辑处理。

三、代码注释

小程序端代码注释

// pages/index/index.js
Page({
  data: {
    userInfo: null, // 存储用户信息
    hasUserInfo: false, // 判断是否获取到用户信息
    canIUseGetUserProfile: false // 判断是否可以使用 getUserProfile 接口
  },
  onLoad: function() {
    if (wx.getUserProfile) {
      this.setData({
        canIUseGetUserProfile: true // 如果可以使用 getUserProfile,则更新状态
      });
    }
  },
  getUserProfile(e) {
    wx.getUserProfile({
      desc: '用于展示用户信息', // 获取用户个人信息的用途声明
      success: (res) => {
        this.setData({
          userInfo: res.userInfo, // 保存用户信息到 data
          hasUserInfo: true // 更新状态为已获取用户信息
        });
        this.login(); // 调用登录函数
      }
    })
  },
  login() {
    wx.login({
      success: res => {
        if (res.code) {
          // 发送 res.code 到后台换取 openid 和 session_key
          wx.request({
            url: 'https://yourserver.com/onLogin', // 后台登录接口地址
            method: 'POST',
            data: {
              code: res.code // 临时登录凭证 code
            },
            success: res => {
              console.log('登录成功', res.data); // 打印登录成功信息
              // 存储 openid 和 session_key 到本地存储
              wx.setStorageSync('openid', res.data.openid);
              wx.setStorageSync('session_key', res.data.session_key);
            },
            fail: err => {
              console.error('登录失败', err); // 打印登录失败信息
            }
          })
        } else {
          console.log('登录失败!' + res.errMsg) // 打印登录失败信息
        }
      }
    });
  }
});

服务器端代码注释

const express = require('express'); // 引入 Express 框架
const axios = require('axios'); // 引入 Axios 库,用于发送 HTTP 请求
const app = express(); // 创建 Express 应用
 
app.use(express.json()); // 使用中间件解析 JSON 请求体
 
app.post('/onLogin', async (req, res) => {
  const { code } = req.body; // 获取请求体中的 code
  const appId = 'your_app_id'; // 微信小程序的 AppID
  const appSecret = 'your_app_secret'; // 微信小程序的 AppSecret
  const url = `https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${appSecret}&js_code=${code}&grant_type=authorization_code`; // 请求微信接口的 URL
 
  try {
    const response = await axios.get(url); // 发送请求获取 openid 和 session_key
    const { openid, session_key } = response.data; // 从响应中提取 openid 和 session_key
    res.json({ openid, session_key }); // 返回 openid 和 session_key 给客户端
  } catch (error) {
    console.error('获取 openid 和 session_key 失败', error); // 打印错误信息
    res.status(500).json({ error: '服务器错误' }); // 返回服务器错误响应
  }
});
 
app.listen(3000, () => {
  console.log('Server is running on port 3000'); // 启动服务器,监听 3000 端口
});
相关文章
|
存储 小程序 前端开发
微信小程序与Java后端实现微信授权登录功能
微信小程序极大地简化了登录注册流程。对于用户而言,仅仅需要点击授权按钮,便能够完成登录操作,无需经历繁琐的注册步骤以及输入账号密码等一系列复杂操作,这种便捷的登录方式极大地提升了用户的使用体验
4012 12
|
小程序 前端开发 算法
|
移动开发 前端开发 Android开发
开发指南059-App实现微信扫描登录
App是用uniapp开发的,打包为apk,上传到安卓平板中使用
|
小程序 算法 前端开发
微信小程序---授权登录
微信小程序---授权登录
462 0
|
自然语言处理 搜索推荐 小程序
微信公众号接口:解锁公众号开发的无限可能
微信公众号接口是微信官方提供的API,支持开发者通过编程与公众号交互,实现自动回复、消息管理、用户管理和数据分析等功能。本文深入探讨接口的定义、类型、优势及应用场景,如智能客服、内容分发、电商闭环等,并介绍开发流程和工具,帮助运营者提升用户体验和效率。未来,随着微信生态的发展,公众号接口将带来更多机遇,如小程序融合、AI应用等。
|
10月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
4538 7
|
小程序 前端开发 Android开发
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
2603 29
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
|
11月前
|
小程序 JavaScript API
uni-halo + 微信小程序开发实录:我的第一个作品诞生记
这篇文章介绍了使用uni-halo框架进行微信小程序开发的过程,包括选择该框架的原因、开发目标以及项目配置和部署的步骤。
586 0
uni-halo + 微信小程序开发实录:我的第一个作品诞生记
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
5103 1