微信小程序 授权 登录

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

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

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


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

使用获取到的临时登录凭证 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 端口
});
相关文章
|
10月前
|
存储 小程序 前端开发
微信小程序与Java后端实现微信授权登录功能
微信小程序极大地简化了登录注册流程。对于用户而言,仅仅需要点击授权按钮,便能够完成登录操作,无需经历繁琐的注册步骤以及输入账号密码等一系列复杂操作,这种便捷的登录方式极大地提升了用户的使用体验
3098 12
|
小程序 前端开发 算法
|
移动开发 前端开发 Android开发
开发指南059-App实现微信扫描登录
App是用uniapp开发的,打包为apk,上传到安卓平板中使用
|
小程序 算法 前端开发
微信小程序---授权登录
微信小程序---授权登录
326 0
|
11月前
|
移动开发 小程序
thinkphp+uniapp开发的多端商城系统源码/H5/小程序/APP支持DIY模板直播分销
thinkphp+uniapp开发的多端商城系统源码/H5/小程序/APP支持DIY模板直播分销
512 0
|
小程序 前端开发 JavaScript
在线课堂+工具组件小程序uniapp移动端源码
在线课堂+工具组件小程序uniapp移动端源码
274 0
在线课堂+工具组件小程序uniapp移动端源码
|
移动开发 小程序 数据可视化
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
2621 3
|
小程序 前端开发 Java
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
JavaDog Chat v1.0.0 是一款基于 SpringBoot、MybatisPlus 和 uniapp 的简易聊天软件,兼容 H5、小程序和 APP,提供丰富的注释和简洁代码,适合初学者。主要功能包括登录注册、消息发送、好友管理及群组交流。
354 0
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
|
小程序 API
微信小程序更新提醒uniapp
在小程序开发中,版本更新至关重要。本方案利用 `uni-app` 的 `uni.getUpdateManager()` API 在启动时检测版本更新,提示用户并提供立即更新选项,自动下载更新内容,并在更新完成后重启小程序以应用新版本。适用于微信小程序,确保用户始终使用最新版本。以下是实现步骤: ### 实现步骤 1. **创建更新方法**:在 `App.vue` 中创建 `updateApp` 方法用于检查小程序是否有新版本。 2. **测试**:添加编译模式并选择成功状态进行模拟测试。
451 0
微信小程序更新提醒uniapp
|
小程序 前端开发 JavaScript
【项目实战】SpringBoot+uniapp+uview2打造一个企业黑红名单吐槽小程序
【避坑宝】是一款企业黑红名单吐槽小程序,旨在帮助打工人群体辨别企业优劣。该平台采用SpringBoot+MybatisPlus+uniapp+uview2等技术栈构建,具备丰富的注释与简洁的代码结构,非常适合实战练习与学习。通过小程序搜索“避坑宝”即可体验。
398 0
【项目实战】SpringBoot+uniapp+uview2打造一个企业黑红名单吐槽小程序

热门文章

最新文章