微信登陆修改

pull/1/head
feijinping 3 years ago
parent 20b2e5c4f9
commit e8e332b9b2

@ -0,0 +1,25 @@
package com.fjp.lc.test.service;
import com.cyl.h5.pojo.vo.form.WechatLoginForm;
import com.cyl.ums.service.MemberWechatService;
import com.ruoyi.RuoYiApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = RuoYiApplication.class)
@ActiveProfiles("dev")
public class WechatTest {
@Autowired
private MemberWechatService memberWechatService;
@Test
public void testAuth() {
WechatLoginForm f = new WechatLoginForm();
f.setCode("081zPgHa1FbRQE0wGIIa1lgb1C1zPgHi");
memberWechatService.login(f);
}
}

@ -31,6 +31,8 @@ import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -209,13 +211,13 @@ public class SysLoginService {
userService.registerUser(user); userService.registerUser(user);
// 赋予角色 // 赋予角色
SysRole vipRole = sysRoleService.selectRoleByKey("vip"); SysRole role = sysRoleService.selectRoleByKey("common");
// 增加用户的权限,绑定角色 // 增加用户的权限,绑定角色
sysRoleService.insertAuthUsers(vipRole.getRoleId(), new Long[]{user.getUserId()}); sysRoleService.insertAuthUsers(role.getRoleId(), new Long[]{user.getUserId()});
AsyncManager.me().execute(AsyncFactory.recordLogininfor(body.getLogin(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.register.success"))); AsyncManager.me().execute(AsyncFactory.recordLogininfor(body.getLogin(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.register.success")));
recordLoginInfo(user); recordLoginInfo(user);
user.setRoles(Collections.singletonList(role));
return user; return user;
} }

@ -77,5 +77,9 @@
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-framework</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

@ -0,0 +1,13 @@
package com.cyl.external;
import lombok.Data;
@Data
public class ExternalException extends RuntimeException {
private String code;
public ExternalException(String code, String message) {
super(message);
this.code = code;
}
}

@ -1,10 +1,29 @@
package com.cyl.external; package com.cyl.external;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.cyl.external.resp.AccessTokenResp;
import com.cyl.external.resp.BaseResp;
import com.cyl.external.resp.UserInfoResp;
import com.ruoyi.common.exception.base.BaseException;
import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import java.util.Arrays; import java.util.Arrays;
@Component
@ConfigurationProperties(prefix = "wechat")
public class WechatUtil { public class WechatUtil {
private static String appId;
private static String secret;
public void setAppId(String appId) {
WechatUtil.appId = appId;
}
public void setSecret(String secret) {
WechatUtil.secret = secret;
}
public static boolean validParam(String signature, String... arr) { public static boolean validParam(String signature, String... arr) {
Arrays.sort(arr); Arrays.sort(arr);
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
@ -18,4 +37,26 @@ public class WechatUtil {
return signature.equals(DigestUtils.sha1Hex(sb.toString())); return signature.equals(DigestUtils.sha1Hex(sb.toString()));
} }
private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
private static final String USER_INFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
public static AccessTokenResp getAccessToken(String code) {
String url = ACCESS_TOKEN_URL.replace("APPID", appId).replace("SECRET", secret).replace("CODE", code);
String res = HttpUtil.get(url);
AccessTokenResp resp = JSON.parseObject(res, AccessTokenResp.class);
validResp(resp);
return resp;
}
public static UserInfoResp getUserInfo(String accessToken, String openid) {
String url = USER_INFO_URL.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openid);
String res = HttpUtil.get(url);
UserInfoResp resp = JSON.parseObject(res, UserInfoResp.class);
validResp(resp);
return resp;
}
public static void validResp(BaseResp resp) {
if (resp.getErrcode() != null) {
throw new ExternalException(resp.getErrcode() + "", resp.getErrmsg());
}
}
} }

@ -0,0 +1,19 @@
package com.cyl.external.resp;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
@Data
public class AccessTokenResp extends BaseResp {
@JSONField(name = "access_token")
private String accessToken;
@JSONField(name = "expires_in")
private Integer expiresIn;
@JSONField(name = "refresh_token")
private String refreshToken;
private String openid;
private String scope;
@JSONField(name = "is_snapshotuser")
private Integer snapshotuser;
private String unionid;
}

@ -0,0 +1,9 @@
package com.cyl.external.resp;
import lombok.Data;
@Data
public class BaseResp {
private Integer errcode;
private String errmsg;
}

@ -0,0 +1,14 @@
package com.cyl.external.resp;
import lombok.Data;
@Data
public class UserInfoResp extends BaseResp {
private String openid;
private String nickname;
private Integer sex;
private String province;
private String city;
private String country;
private String headimgurl;
}

@ -1,9 +1,11 @@
package com.cyl.h5.controller; package com.cyl.h5.controller;
import com.cyl.external.WechatUtil; import com.cyl.external.WechatUtil;
import org.springframework.web.bind.annotation.GetMapping; import com.cyl.h5.pojo.vo.form.WechatLoginForm;
import org.springframework.web.bind.annotation.RequestMapping; import com.cyl.ums.service.MemberWechatService;
import org.springframework.web.bind.annotation.RestController; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -13,6 +15,8 @@ import javax.servlet.http.HttpServletRequest;
@RestController @RestController
@RequestMapping("") @RequestMapping("")
public class WechatController { public class WechatController {
@Autowired
private MemberWechatService memberWechatService;
/** /**
* *
* @return * @return
@ -32,9 +36,8 @@ public class WechatController {
* *
* @return * @return
*/ */
@GetMapping("/no-auth/wechat/h5-login") @PostMapping("/no-auth/wechat/h5-login")
public String h5Login(HttpServletRequest request) { public ResponseEntity<String> h5Login(@RequestBody WechatLoginForm form) {
// TODO return ResponseEntity.ok(memberWechatService.login(form));
return "err";
} }
} }

@ -0,0 +1,9 @@
package com.cyl.h5.pojo.vo.form;
import lombok.Data;
@Data
public class WechatLoginForm {
private String code;
private String state;
}

@ -1,5 +1,7 @@
package com.cyl.ums.convert; package com.cyl.ums.convert;
import com.cyl.external.resp.AccessTokenResp;
import com.cyl.external.resp.UserInfoResp;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import com.cyl.ums.domain.MemberWechat; import com.cyl.ums.domain.MemberWechat;
import com.cyl.ums.pojo.vo.MemberWechatVO; import com.cyl.ums.pojo.vo.MemberWechatVO;
@ -13,4 +15,6 @@ import java.util.List;
public interface MemberWechatConvert { public interface MemberWechatConvert {
List<MemberWechatVO> dos2vos(List<MemberWechat> list); List<MemberWechatVO> dos2vos(List<MemberWechat> list);
MemberWechat info2do(AccessTokenResp info);
} }

@ -1,11 +1,31 @@
package com.cyl.ums.service; package com.cyl.ums.service;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.concurrent.TimeUnit;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.cyl.external.WechatUtil;
import com.cyl.external.resp.AccessTokenResp;
import com.cyl.external.resp.UserInfoResp;
import com.cyl.h5.pojo.vo.form.WechatLoginForm;
import com.cyl.ums.convert.MemberWechatConvert;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.ExtraUserBody;
import com.ruoyi.framework.web.service.SysLoginService;
import com.ruoyi.system.mapper.SysUserMapper;
import com.ruoyi.system.service.ISysUserService;
import lombok.extern.java.Log;
import lombok.extern.log4j.Log4j;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -20,10 +40,19 @@ import com.cyl.ums.pojo.query.MemberWechatQuery;
* *
* @author zcc * @author zcc
*/ */
@Slf4j
@Service @Service
public class MemberWechatService { public class MemberWechatService {
@Autowired @Autowired
private MemberWechatMapper memberWechatMapper; private MemberWechatMapper memberWechatMapper;
@Autowired
private MemberWechatConvert memberWechatConvert;
@Autowired
private SysUserMapper sysUserMapper;
@Autowired
private ISysUserService userService;
@Autowired
private SysLoginService loginService;
/** /**
* *
@ -132,4 +161,51 @@ public class MemberWechatService {
public int deleteById(Long id) { public int deleteById(Long id) {
return memberWechatMapper.deleteById(id); return memberWechatMapper.deleteById(id);
} }
public String login(WechatLoginForm form) {
// 1. code -> token
AccessTokenResp tokenResp = WechatUtil.getAccessToken(form.getCode());
// 2. token -> user_info
UserInfoResp info = null;
try {
info = WechatUtil.getUserInfo(tokenResp.getAccessToken(), tokenResp.getOpenid());
} catch (Exception e) {
log.error("form: {}", form.getCode(), e);
}
// 3. 查找用户是否存在, 若没有则创建
LambdaQueryWrapper<MemberWechat> qw = new LambdaQueryWrapper<>();
qw.eq(MemberWechat::getOpenid, tokenResp.getOpenid());
MemberWechat m = memberWechatMapper.selectOne(qw);
SysUser u;
if (m != null) {
SysUser update = new SysUser();
if (info != null) {
if (StrUtil.isNotEmpty(info.getNickname())) {
update.setNickName(info.getNickname());
}
if (info.getSex() != null) {
update.setSex(info.getSex() + "");
}
if (StrUtil.isNotEmpty(info.getHeadimgurl())) {
update.setAvatar(info.getHeadimgurl());
}
sysUserMapper.updateUser(update);
}
u = sysUserMapper.selectUserById(m.getMemberId());
} else {
ExtraUserBody body = ExtraUserBody.builder()
.nickname(info == null ? "" : info.getNickname())
.avatar(info == null ? "" : info.getHeadimgurl())
.login(RandomUtil.randomNumbers(9))
.sex(info == null ? null : info.getSex())
.build();
u = loginService.initVipUser(body);
MemberWechat w = memberWechatConvert.info2do(tokenResp);
w.setMemberId(u.getUserId());
w.setExpireTime(LocalDateTime.now().plus(tokenResp.getExpiresIn(), ChronoUnit.SECONDS));
memberWechatMapper.insert(w);
}
// 4. 生成token
return loginService.createToken(u);
}
} }

Loading…
Cancel
Save