微信小程序的授权登录遵循 OAuth 2.0 授权流程,核心步骤为:
获取用户授权(获取昵称、头像等基础信息)获取微信登录凭证(code)后端服务器通过 code 换取用户唯一标识(openid)生成自定义登录态(Token)返回给前端
注意:微信官方要求,获取用户信息需用户主动触发(如点击按钮),不能自动弹出授权框
二、前端授权界面开发
在src/pages/index/index.vue中添加授权登录按钮和用户信息展示区域:
{{ userInfo.nickName }}
{{ message }}
添加对应的样式:
/* 用户信息样式 */
.user-info {
display: flex;
flex-direction: column;
align-items: center;
padding-top: 100rpx;
}
.avatar {
width: 200rpx;
height: 200rpx;
border-radius: 50%;
margin-bottom: 30rpx;
}
.nickname {
font-size: 36rpx;
margin-bottom: 40rpx;
}
.logout-btn {
background-color: #ff4d4f;
color: white;
}
/* 登录按钮样式 */
.login-btn {
background-color: #07c160;
color: white;
padding: 15rpx 60rpx;
margin-top: 40rpx;
}
三、实现授权登录逻辑
在部分添加登录相关逻辑,完整代码如下:
四、核心代码示例(Java)
前端获取到 code 后,需要后端配合完成登录流程,以下是 Java 版本的核心实现(基于 Spring Boot 框架):
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import com.alibaba.fastjson.JSONObject;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@RestController
public class LoginController {
// 小程序AppID和AppSecret(实际项目中建议放在配置文件)
private static final String APP_ID = "你的小程序AppID";
private static final String APP_SECRET = "你的小程序AppSecret";
// JWT密钥(实际项目中使用更复杂的密钥)
private static final String JWT_SECRET = "你的密钥";
@GetMapping("/api/login")
public Result login(@RequestParam String code) {
try {
// 1. 调用微信接口换取openid和session_key
String url = String.format(
"https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code",
APP_ID, APP_SECRET, code
);
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject(url, String.class);
JSONObject jsonObject = JSONObject.parseObject(response);
// 检查是否获取成功
if (jsonObject.containsKey("errcode")) {
return Result.error("登录失败:" + jsonObject.getString("errmsg"));
}
String openid = jsonObject.getString("openid");
String sessionKey = jsonObject.getString("session_key");
// 2. 生成JWT token(有效期7天)
Date expiration = new Date(System.currentTimeMillis() + 7 * 24 * 60 * 60 * 1000);
String token = Jwts.builder()
.setSubject(openid)
.setExpiration(expiration)
.signWith(SignatureAlgorithm.HS256, JWT_SECRET)
.compact();
// 3. 查询或创建用户(根据openid,此处省略数据库操作)
// User user = userService.findByOpenid(openid);
// if (user == null) {
// user = new User();
// user.setOpenid(openid);
// userService.save(user);
// }
// 4. 返回token给前端
Map data = new HashMap<>();
data.put("token", token);
return Result.success(data, "登录成功");
} catch (Exception e) {
e.printStackTrace();
return Result.error("服务器异常,登录失败");
}
}
// 响应结果封装类
static class Result {
private int code;
private String message;
private Object data;
public static Result success(Object data, String message) {
Result result = new Result();
result.code = 0;
result.data = data;
result.message = message;
return result;
}
public static Result error(String message) {
Result result = new Result();
result.code = -1;
result.message = message;
return result;
}
// getter和setter省略
}
}
注意:实际项目中需要添加以下依赖(Maven):
org.springframework.boot
spring-boot-starter-web
com.alibaba
fastjson
1.2.76
io.jsonwebtoken
jjwt
0.9.1
五、调试与上线注意事项本地调试配置:
2.上线前配置:
3.用户体验优化:
通过本文的步骤,你实现微信授权登录功能。这一功能是大多数小程序的基础,掌握后可以进一步开发用户中心功能。
如果在开发中遇到授权相关问题,欢迎在评论区留言讨论~
