微信小程序 授权 登录

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

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

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


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

使用获取到的临时登录凭证 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 端口
});
相关文章
|
5天前
|
移动开发 前端开发 Android开发
开发指南059-App实现微信扫描登录
App是用uniapp开发的,打包为apk,上传到安卓平板中使用
|
14天前
|
小程序 算法 前端开发
微信小程序---授权登录
微信小程序---授权登录
64 0
|
2月前
|
存储 小程序 JavaScript
|
2月前
|
开发工具 Android开发
|
5天前
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
77 7
|
4天前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
56 1
|
19天前
|
小程序 前端开发 测试技术
微信小程序的开发完整流程是什么?
微信小程序的开发完整流程是什么?
67 7
ly~
|
1月前
|
存储 供应链 小程序
除了微信小程序,PHP 还可以用于开发哪些类型的小程序?
除了微信小程序,PHP 还可用于开发多种类型的小程序,包括支付宝小程序、百度智能小程序、抖音小程序、企业内部小程序及行业特定小程序。在电商、生活服务、资讯、工具、娱乐、营销等领域,PHP 能有效管理商品信息、订单处理、支付接口、内容抓取、复杂计算、游戏数据、活动规则等多种业务。同时,在企业内部,PHP 可提升工作效率,实现审批流程、文件共享、生产计划等功能;在医疗和教育等行业,PHP 能管理患者信息、在线问诊、课程资源、成绩查询等重要数据。
ly~
67 6
|
9天前
|
缓存 小程序 索引
uni-app开发微信小程序时vant组件van-tabs的使用陷阱及解决方案
uni-app开发微信小程序时vant组件van-tabs的使用陷阱及解决方案
50 1
|
14天前
|
小程序 前端开发 数据安全/隐私保护
微信小程序全栈开发中的身份认证与授权机制
【10月更文挑战第3天】随着移动互联网的发展,微信小程序凭借便捷的用户体验和强大的社交传播能力,成为企业拓展业务的新渠道。本文探讨了小程序全栈开发中的身份认证与授权机制,包括手机号码验证、微信登录、第三方登录及角色权限控制等方法,并强调了安全性、用户体验和合规性的重要性,帮助开发者更好地理解和应用这一关键技术。
39 5