微信小程序登录流程+介绍wx.login和auth.code2Session

本文深入解析微信小程序登录流程,涵盖核心API如wx.login与auth.code2Session使用方法,详解从获取临时登录凭证code到session_key的全过程,以及如何判断和处理登录态过期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

微信小程序登录流程+介绍wx.login和auth.code2Session

几个核心API和核心字段

wx.login() 调用接口获取登录凭证(code)
code2Session 登录凭证校验,为了获取会话秘钥session_key
wx.checkSession() 检查登录态是否过期
wx.getSetting() 获取用户的当前设置
wx.getUserInfo 获取用户信息,获取之后需要解密数据
session_key 会话秘钥,是通过调用接口获取登录凭证获取的,是有时效性的

微信小程序登录流程

在这里插入图片描述

介绍wx.login和auth.code2Session

wx.login:微信小程序的登录方法,获取临时登录凭证code,并回传到开发者服务器。
在这里插入图片描述
auth.code2Session:换取 用户唯一标识 OpenID 和 会话密钥 session_key信息进行登录凭证校验。
在这里插入图片描述

登录流程解析

首次登录:
1、首先需要调用小程序api接口 wx.login() 获取 临时登录凭证code ,这个code是有过期时间的。
2、将这个code回传到开发者服务器(就是请求开发者服务器的登录接口,通过凭证进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session_key)等)。
3、拿到开发者服务器传回来的会话密钥(session_key)之后,前端要保存wx.setStorageSync(‘sessionKey’, ‘value’)

再次登录的时候,就要判断存储的session_key是否过期了:
1、获取缓存中的session_key,wx.getStorageSync(‘sessionKey’)
2、如果缓存中存在session_key,那么调用小程序api接口wx.checkSession()来判断登录态是否过期,回调成功说明当前 session_key 未过期,回调失败说明 session_key 已过期。登录态过期后前端需要再调用 wx.login()获取新的用户的code,然后再向开发者服务器发起登录请求。
3、一般在项目开发,开发者服务器也会对用户的登录态做过期限制,所以这时在判断完微信服务器中登录态如果没有过期之后还要判断开发者服务器的登录态是否过期。(请求开发者服务器给定的接口进行请求判断就好)。
4、无论是微信服务器过期了还是开发者服务器登录态过期了,都要像首次登录那样开始三步骤。所以注意封装代码。

### 微信小程序登录流程详解 #### 一、概述 微信小程序登录机制基于OAuth2.0协议,通过获取用户的临时登录凭证`code`并将其发送到开发者服务器,由服务器向微信官方接口换取`session_key`以及可能存在的用户信息。以下是完整的前后端实现过程。 --- #### 二、前端实现 (UniApp/Vue3 或原生微信小程序) ##### 获取 `code` 在微信小程序中,可以通过调用微信提供的API来获取用户的临时登录凭证`code`: ```javascript wx.login({ success(res) { if (res.code) { console.log('获取到 code:', res.code); // 将 code 发送到后端处理 sendCodeToServer(res.code); // 自定义函数用于发送请求 } else { console.error('登录失败!', res.errMsg); } }, }); ``` 此部分实现了用户身份认证的第一步[^1]。 ##### 用户授权登录 如果需要进一步获取用户头像昵称等敏感数据,则需引导用户完成微信授权操作。以下是一个简单的示例代码片段: ```javascript wx.getUserProfile({ desc: '用于完善会员资料', success(userRes) { const userInfo = userRes.userInfo; console.log(userInfo.nickName, userInfo.avatarUrl); // 可以将用户信息连同 code 一起传递给后端 }, fail(err) { console.error('用户拒绝授权:', err); }, }); ``` 这部分逻辑通常配合后端的身份校验共同作用于更复杂的业务场景中[^2]。 --- #### 三、后端实现 (Spring Boot/Django/其他框架均可适用) ##### 接收前端传来的 `code` 当接收到从前端发过来的`code`之后,在服务端发起一次HTTP GET 请求至微信开放平台指定URL地址交换得到真正的会话密钥(`session_key`)及相关参数: 对于 Java SpringBoot 而言可以这样写入控制器方法里去接收这些来自客户端的数据包体内容并通过RestTemplate工具类来进行网络访问动作从而拿到最终的结果集对象形式返回回来供后续使用。 ```java @RestController @RequestMapping("/auth") public class AuthController { @PostMapping("/login") public ResponseEntity<?> login(@RequestBody Map<String, String> payload){ String js_code = payload.get("js_code"); RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); HttpEntity<Void> entity = new HttpEntity<>(headers); URI url = UriComponentsBuilder.fromHttpUrl("https://api.weixin.qq.com/sns/jscode2session") .queryParam("appid", "your_app_id") .queryParam("secret","your_secret_key") .queryParam("js_code",js_code ) .queryParam("grant_type","authorization_code").build().toUri(); ResponseEntity<Map> response =restTemplate.exchange(url , HttpMethod.GET,entity,new ParameterizedTypeReference<>() {}); return ResponseEntity.ok(response.getBody()); } } ``` 上述代码展示了如何利用Spring Framework中的组件完成整个交互链条上的重要环节之一即验证用户的真实性[^3]. 而对于 Python Django 来说则可能是另外一种风格但核心思想不变依旧是要先解析出那个唯一标识符然后再拿它去找寻对应的openid等等附加属性出来. ```python from django.http import JsonResponse import requests def wechat_login(request): data = request.POST.dict() appid = settings.WECHAT_APP_ID secret = settings.WECHAT_SECRET_KEY r =requests.get(f'https://api.weixin.qq.com/sns/jscode2session?appid={appid}&secret={secret}&js_code={data["code"]}&grant_type=authorization_code') result=r.json() token_payload={ 'user_id':result['openid'], ... } jwt_token=jwt.encode(token_payload,jwt_secret,'HS256') return JsonResponse({'token':jwt_token}) ``` 这里采用JSON Web Tokens(JWTs)作为安全令牌发放手段以便简化跨域资源共享等问题的同时也增强了系统的整体安全性水平.[^4] --- #### 四、总结说明 综上所述,无论是哪种技术栈的选择都遵循着相似的设计思路那就是始终围绕着那几个固定的要素展开讨论比如说是怎样取得有效的授权许可或者是关于个人信息保护方面的考量因素等等都是不可或缺的部分组成成分而已!
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值