提示:小程序授权登录代码
前言
小程序授权。
一、获取授权参数?
示例: /**
* 获取授权参数
* @return
*/
@PostMapping("wxAppOauthParams")
public RetBean wxAppOauthParams(HttpServletRequest request){
String clientType = request.getHeader("Client-Type");
Map<String,Object> map = new HashMap<>();
String state = UUID.randomUUID().toString().replace("-", "");
stringRedisTemplate.opsForValue().set(state, "1",300 );
map.put("clientType", clientType);
map.put("appid", WechatAppConstant.APPID);
map.put("scope", "snsapi_userinfo");
map.put("state",state);
return new RetBean(true, CommonConstant.SUCCESS_CODE, "",map);
}
二、解析用户信息并存库
1.引入库
代码如下(示例):
/**
* 微信小程序授权
* @param code
* @param encryptedData
* @param iv
* @return
*/
@PostMapping("wxLogin")
public RetBean wxLogin(HttpServletRequest request,String code,String encryptedData,String iv){
if (StringUtils.isEmpty(code)){
return new RetBean(false, CommonConstant.FAIL_CODE, "code不能爲空");
}
if (StringUtils.isEmpty(encryptedData)){
return new RetBean(false, CommonConstant.FAIL_CODE, "encryptedData不能爲空");
}
if (StringUtils.isEmpty(iv)){
return new RetBean(false, CommonConstant.FAIL_CODE, "iv不能爲空");
}
String url = "https://api.weixin.qq.com/sns/jscode2session?" +
"appid="+ WechatAppletConstant.APPID+
"&secret="+ WechatAppletConstant.SECRET+
"&js_code="+code+"&grant_type=authorization_code";
String jsonDate = this.restTemplate.getForObject(url, String.class);
if (StringUtils.contains(jsonDate, "errcode")){
return new RetBean(false, CommonConstant.FAIL_CODE, "登录失败");
}
JSONObject result = JSON.parseObject(jsonDate);
System.out.println(result);
String sessionKey = result.get("session_key").toString();
//通过解码获取用户信息
JSONObject userInfo = decryptUserInfo(encryptedData,sessionKey,iv);
System.out.println(userInfo);
//向微信账户表中添加数据
WechatAccounts wechatAccounts = new WechatAccounts();
wechatAccounts.setUuid(UUID.randomUUID().toString().replace("-", ""));
wechatAccounts.setOauthType("APPLET_USER");
String unionid = userInfo.get("unionId").toString();
System.out.println(userInfo.get("avatarUrl"));
if (unionid==null){
return new RetBean(false, CommonConstant.FAIL_CODE, "请绑定微信开放平台");
}
wechatAccounts.setAppletOpenid(userInfo.get("openId").toString());
wechatAccounts.setUnionid(unionid);
wechatAccounts.setNickName(userInfo.getString("nickName"));
wechatAccounts.setGender(Integer.valueOf(userInfo.getString("gender")));
wechatAccounts.setProvince(userInfo.getString("province"));
wechatAccounts.setCountry(userInfo.getString("country"));
wechatAccounts.setCity(userInfo.getString("city"));
wechatAccounts.setAvatar(userInfo.getString("avatarUrl"));
wechatAccounts.setDataState(1);
wechatAccounts.setCreateTime(new java.sql.Timestamp(System.currentTimeMillis()));
wechatAccounts.setUpdateTime(new java.sql.Timestamp(System.currentTimeMillis()));
System.out.println(wechatAccounts);
//检验数据是否已存在,存在更新不存在新增
WechatAccounts wechatAccounts1 = this.wechatAccountsService.selectOneWechatAccount(userInfo.get("openId").toString());
if (wechatAccounts1==null){
//新增
int i = this.wechatAccountsService.addOne(wechatAccounts);
if (i==0){
return new RetBean(false, CommonConstant.FAIL_CODE, "授权失败");
}
return new RetBean(true, CommonConstant.SUCCESS_CODE,"授权成功",wechatAccounts );
}
return new RetBean(true, CommonConstant.SUCCESS_CODE,"授权成功",wechatAccounts1 );
}
三、登录
/**
* 小程序登录注册接口
*
* @param request
* @return
*/
@Override
public RetBean appletRegister(HttpServletRequest request, HttpServletResponse response) {
String requestHeader1 = request.getHeader("Request-Source");
String requestHeader = requestHeader1.toUpperCase();
String clientType = request.getHeader("Client-Type");
Map<String, String> map = QuYouCommonUtil.requestToMap(request);
String wechatOpenid = map.get("wechatOpenid");
String avatar = map.get("avatar");
if (StringUtils.isEmpty(avatar)){
return new RetBean(false, CommonConstant.FAIL_CODE, "头像不能为空","");
}
String unionid = map.get("unionid");
String nickName = map.get("nickName");
String mobile = map.get("mobile");
String isLogin = map.get("isLogin");
String replace = UUID.randomUUID().toString().replace("-", "");
Map<String, Object> registerLoginMap = new HashMap<>();
//创建一个QueryWrapper的对象
QueryWrapper<Accounts> wrapper = new QueryWrapper<>();
wrapper.eq("wechat_openid", wechatOpenid);
//向数据库中查找是否存在
Accounts accounts3 = this.platFormAccountPlusMapper.selectOne(wrapper);
if (accounts3 == null) {
Accounts accounts = new Accounts();
accounts.setUuid(UUID.randomUUID().toString().replace("-", ""));
accounts.setUserUuid(replace);
accounts.setUserTypeValue(requestHeader);
accounts.setName(nickName);
accounts.setMobile(mobile);
accounts.setWechatOpenid(wechatOpenid);
accounts.setWechatUnionid(unionid);
accounts.setDataState(1);
accounts.setCreateTime(new java.sql.Timestamp(System.currentTimeMillis()));
int i = this.platFormAccountPlusMapper.insert(accounts);
if (i == 0) {
return new RetBean(false, CommonConstant.FAIL_CODE, "向accounts表中添加数据失败");
}
Users users = new Users();
users.setUuid(replace);
users.setNickName(nickName);
users.setTypeValue(requestHeader);
users.setMobile(mobile);
users.setAvatar(avatar);
users.setStatus(1);
users.setDataState(1);
users.setUserType("APPLET_USER");
users.setCreateTime(new java.sql.Timestamp(System.currentTimeMillis()));
users.setUpdateTime(new java.sql.Timestamp(System.currentTimeMillis()));
// users.setUserTags(new ArrayList<UserTags>());
int k = this.platFormUserPlusMapper.insert(users);
if (k == 0) {
return new RetBean(false, 500, "向用户表中添加数据失败", null);
}
}
if (isLogin.equals("1")) {
//登录成功生成token
QueryWrapper<Accounts> acountWrapper = new QueryWrapper<>();
acountWrapper.eq("wechat_openid", wechatOpenid);
Accounts accounts1 = this.platFormAccountPlusMapper.selectOne(acountWrapper);
Users users1 = this.platFormUserPlusMapper.selectOne(new QueryWrapper<Users>().eq("uuid", accounts1.getUserUuid()));
String token = GetToken.getToken(users1, accounts1);
String refreshToken = UUID.randomUUID().toString().replace("-", "");
String tokenId = UUID.randomUUID().toString().replace("-", "");
//数据库中保存一份token
String replace1 = UUID.randomUUID().toString().replace("-", "");
Tokens tokens = new Tokens()
.setUuid(users1.getUuid())
.setClientType(clientType)
.setSource(requestHeader)
.setUserTypeValue(requestHeader)
.setToken(token)
.setTokenId(tokenId)
.setRefreshToken(refreshToken)
.setUserUuid(users1.getUuid())
.setAccountUuid(accounts1.getUuid());
if (tokensService.findOneByUserUuid(users1.getUuid()) == null||tokensService.findOneByUserUuid(users1.getUuid()).equals("")) {
tokensService.addOne(tokens);
} else {
int i = tokensService.updateByUserUuid(tokens);
System.out.println(i);
}
//redis中保存一份token标识,做用户退出标识
String flagKey = requestHeader + clientType + token;
// System.out.println(flagKey);
String key = DigestUtils.md5DigestAsHex(flagKey.getBytes());
stringRedisTemplate.opsForValue().set(key, "1", 7, TimeUnit.DAYS);
response.setHeader("token", token);
response.setHeader("refreshToken", refreshToken);
HashMap<Object, Object> map1 = new HashMap<>();
map1.put("token", token);
map1.put("refreshToken", refreshToken);
map1.put("tokenId", tokenId);
//登录成功做日志记录
LoginLogs loginLogs = new LoginLogs();
loginLogs.setAccountUuid(accounts1.getUuid());
loginLogs.setClientType(clientType);
loginLogs.setSource(requestHeader);
loginLogs.setUserUuid(replace);
loginLogs.setUserHost(request.getRemoteHost());
loginLogs.setUserIp(request.getRemoteAddr());
loginLogs.setUserTypeValue(requestHeader);
int j = loginLogsService.addOne(loginLogs);
registerLoginMap.put("tokenInfo", map1);
Accounts accounts2 = this.accountsService.findOneBywechatOpenid(wechatOpenid);
Users users = this.usersService.findOneByUuid(accounts2.getUserUuid());
registerLoginMap.put("userInfo", users);
return new RetBean(true, 200, "注册并登录成功", registerLoginMap);
}
return new RetBean(true, 200, "登录成功", null);
}
总结
提示:这里对文章进行总结:
例如:以上是小程序授权登录的整个过程。