写一下微信小程序登录的后端代码
时间: 2023-10-11 18:07:55 浏览: 51
微信小程序登录的后端代码主要包括以下步骤:
1. 获取小程序登录凭证code。
小程序前端在调用wx.login()接口后,将获取到的code发送到后端服务器。
2. 发送code到微信服务器换取openid和session_key。
后端服务器通过调用微信的接口,将code发送到微信服务器换取openid和session_key。
3. 校验openid和session_key的有效性。
根据微信的接口文档,可以通过校验session_key是否过期,以及openid是否合法来判断登录状态的有效性。
4. 将openid和session_key保存到后端数据库中。
如果校验通过,后端服务器将openid和session_key保存到数据库中,以便后续使用。
下面是一个示例的后端代码:
```java
@RestController
public class LoginController {
@Autowired
private UserService userService;
@PostMapping("/login")
public ResultVO login(@RequestBody LoginDTO loginDTO) {
String code = loginDTO.getCode();
String encryptedData = loginDTO.getEncryptedData();
String iv = loginDTO.getIv();
// 发送code到微信服务器换取openid和session_key
String appId = "your_app_id";
String appSecret = "your_app_secret";
String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appId +
"&secret=" + appSecret + "&js_code=" + code + "&grant_type=authorization_code";
String response = HttpUtil.get(url);
JSONObject jsonObject = JSONObject.parseObject(response);
String openid = jsonObject.getString("openid");
String sessionKey = jsonObject.getString("session_key");
// 校验openid和session_key的有效性
if (StringUtils.isBlank(openid) || StringUtils.isBlank(sessionKey)) {
return ResultVO.error(ResultEnum.LOGIN_FAIL);
}
if (!WxUtil.checkSessionKey(sessionKey, encryptedData, iv)) {
return ResultVO.error(ResultEnum.LOGIN_FAIL);
}
// 将openid和session_key保存到后端数据库中
User user = userService.findByOpenid(openid);
if (user == null) {
user = new User();
user.setOpenid(openid);
user.setSessionKey(sessionKey);
userService.save(user);
} else {
user.setSessionKey(sessionKey);
userService.update(user);
}
// 返回用户信息
UserVO userVO = new UserVO();
userVO.setUserId(user.getUserId());
userVO.setNickname(user.getNickname());
userVO.setAvatarUrl(user.getAvatarUrl());
return ResultVO.success(userVO);
}
}
```
其中,LoginDTO是一个数据传输对象,包含了小程序登录所需要的参数,如下所示:
```java
@Data
public class LoginDTO {
private String code;
private String encryptedData;
private String iv;
}
```
另外,WxUtil是一个工具类,用于校验openid和session_key的有效性,具体代码如下所示:
```java
public class WxUtil {
public static boolean checkSessionKey(String sessionKey, String encryptedData, String iv) {
try {
byte[] sessionKeyBytes = Base64.decodeBase64(sessionKey);
byte[] encryptedDataBytes = Base64.decodeBase64(encryptedData);
byte[] ivBytes = Base64.decodeBase64(iv);
SecretKeySpec secretKeySpec = new SecretKeySpec(sessionKeyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, new IvParameterSpec(ivBytes));
byte[] decryptedDataBytes = cipher.doFinal(encryptedDataBytes);
JSONObject jsonObject = JSONObject.parseObject(new String(decryptedDataBytes));
String openid = jsonObject.getString("openId");
if (StringUtils.isBlank(openid)) {
return false;
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
```