感谢尚硅谷,直接上代码(尚医通解决方案)

@RestController
@RequestMapping("/api/user")
public class UserInfoApiController {@Autowiredprivate UserInfoService userInfoService;//用户手机号登录接口@PostMapping("login")public Result login(@RequestBody LoginVo loginVo) {Map<String,Object> info = userInfoService.loginUser(loginVo);return Result.ok(info);}}
//用户手机号登录接口@Overridepublic Map<String, Object> loginUser(LoginVo loginVo) {//从loginVo获取输入的手机号,和验证码String phone = loginVo.getPhone();String code = loginVo.getCode();//判断手机号和验证码是否为空if (StringUtils.isEmpty(phone) || StringUtils.isEmpty(code)) {throw new YyghException(ResultCodeEnum.PARAM_ERROR);}//判断手机验证码和输入的验证码是否一致String redisCode = redisTemplate.opsForValue().get(phone);if (!code.equals(redisCode)) {throw new YyghException(ResultCodeEnum.CODE_ERROR);}//绑定手机号码UserInfo userInfo = null;if (!StringUtils.isEmpty(loginVo.getOpenid())) {userInfo = this.selectWxInfoOpenId(loginVo.getOpenid());if (null != userInfo) {userInfo.setPhone(loginVo.getPhone());this.updateById(userInfo);} else {throw new YyghException(ResultCodeEnum.DATA_ERROR);}}//如果userinfo为空,进行正常手机登录if (userInfo == null) {//判断是否第一次登录:根据手机号查询数据库,如果不存在相同手机号就是第一次登录QueryWrapper<UserInfo> wrapper = new QueryWrapper<>();wrapper.eq("phone", phone);userInfo = baseMapper.selectOne(wrapper);if (userInfo == null) { //第一次使用这个手机号登录//添加信息到数据库userInfo = new UserInfo();userInfo.setName("");userInfo.setPhone(phone);userInfo.setStatus(1);baseMapper.insert(userInfo);}}//校验是否被禁用if (userInfo.getStatus() == 0) {throw new YyghException(ResultCodeEnum.LOGIN_DISABLED_ERROR);}//不是第一次,直接登录//返回登录信息//返回登录用户名//返回token信息Map<String, Object> map = new HashMap<>();String name = userInfo.getName();if (StringUtils.isEmpty(name)) {name = userInfo.getNickName();}if (StringUtils.isEmpty(name)) {name = userInfo.getPhone();}map.put("name", name);//jwt生成token字符串String token = JwtHelper.createToken(userInfo.getId(), name);map.put("token", token);return map;}
//微信操作的接口
@Controller
@RequestMapping("/api/ucenter/wx")
public class WeixinApiController {@Autowiredprivate UserInfoService userInfoService;//微信扫描后回调的方法@GetMapping("callback")public String callback(String code,String state) {//第一步 获取临时票据 codeSystem.out.println("code:"+code);//第二步 拿着code和微信id和秘钥,请求微信固定地址 ,得到两个值//使用code和appid以及appscrect换取access_token//  %s   占位符StringBuffer baseAccessTokenUrl = new StringBuffer().append("https://api.weixin.qq.com/sns/oauth2/access_token").append("?appid=%s").append("&secret=%s").append("&code=%s").append("&grant_type=authorization_code");String accessTokenUrl = String.format(baseAccessTokenUrl.toString(),ConstantWxPropertiesUtils.WX_OPEN_APP_ID,ConstantWxPropertiesUtils.WX_OPEN_APP_SECRET,code);//使用httpclient请求这个地址try {String accesstokenInfo = HttpClientUtils.get(accessTokenUrl);System.out.println("accesstokenInfo:"+accesstokenInfo);//从返回字符串获取两个值 openid  和  access_tokenJSONObject jsonObject = JSONObject.parseObject(accesstokenInfo);String access_token = jsonObject.getString("access_token");String openid = jsonObject.getString("openid");//判断数据库是否存在微信的扫描人信息//根据openid判断UserInfo userInfo = userInfoService.selectWxInfoOpenId(openid);if(userInfo == null) { //数据库不存在微信信息//第三步 拿着openid  和  access_token请求微信地址,得到扫描人信息String baseUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo" +"?access_token=%s" +"&openid=%s";String userInfoUrl = String.format(baseUserInfoUrl, access_token, openid);String resultInfo = HttpClientUtils.get(userInfoUrl);System.out.println("resultInfo:"+resultInfo);JSONObject resultUserInfoJson = JSONObject.parseObject(resultInfo);//解析用户信息//用户昵称String nickname = resultUserInfoJson.getString("nickname");//用户头像String headimgurl = resultUserInfoJson.getString("headimgurl");//获取扫描人信息添加数据库userInfo = new UserInfo();userInfo.setNickName(nickname);userInfo.setOpenid(openid);userInfo.setStatus(1);userInfoService.save(userInfo);}//返回name和token字符串Map<String,String> map = new HashMap<>();String name = userInfo.getName();if(StringUtils.isEmpty(name)) {name = userInfo.getNickName();}if(StringUtils.isEmpty(name)) {name = userInfo.getPhone();}map.put("name", name);//判断userInfo是否有手机号,如果手机号为空,返回openid//如果手机号不为空,返回openid值是空字符串//前端判断:如果openid不为空,绑定手机号,如果openid为空,不需要绑定手机号if(StringUtils.isEmpty(userInfo.getPhone())) {map.put("openid", userInfo.getOpenid());} else {map.put("openid", "");}//使用jwt生成token字符串String token = JwtHelper.createToken(userInfo.getId(), name);map.put("token", token);//跳转到前端页面return "redirect:" + ConstantWxPropertiesUtils.YYGH_BASE_URL + "/weixin/callback?token="+map.get("token")+ "&openid="+map.get("openid")+"&name="+URLEncoder.encode(map.get("name"),"utf-8");} catch (Exception e) {e.printStackTrace();return null;}}//1 生成微信扫描二维码//返回生成二维码需要参数@GetMapping("getLoginParam")@ResponseBodypublic Result genQrConnect() {try {Map<String, Object> map = new HashMap<>();map.put("appid", ConstantWxPropertiesUtils.WX_OPEN_APP_ID);map.put("scope","snsapi_login");String wxOpenRedirectUrl = ConstantWxPropertiesUtils.WX_OPEN_REDIRECT_URL;wxOpenRedirectUrl = URLEncoder.encode(wxOpenRedirectUrl, "utf-8");map.put("redirect_uri",wxOpenRedirectUrl);map.put("state",System.currentTimeMillis()+"");return Result.ok(map);} catch (UnsupportedEncodingException e) {e.printStackTrace();return null;}}
}

其他资料:多账号第三方登录设计

手机号登录和微信登录相关推荐

  1. flutter在IOS上的登录实现——QQ登录、微信登录、自动识别手机号一键登录、apple登录

    flutter在IOS上的登录实现--QQ登录.微信登录.自动识别手机号一键登录.apple登录 一.QQ登录 使用的第三方库: 具体操作方法: 1.配置 Universal Links 2.QQ互联 ...

  2. dedecms织梦第三方登录插件-QQ登录、微博登录、微信登录

    织梦程序集成第三方QQ登录.微博登录.微信登录,获取QQ.微博.微信,并存储至数据库,一键注册为网站会员,不用再次填写绑定信息,方便粘贴用户更强. 织梦第三方登录效果 第三方登录插件特点 1.所有文件 ...

  3. html 微信登陆,登录包含微信登录.html

     登录包含微信登录 $axure.utils.getTransparentGifPath = function() { return 'resources/images/transparent.gi ...

  4. Springboot实现微信小程序注册登录及微信登录

    运行环境 jdk1.8+eclipse+tomact 8.5+maven3.5+springboot 2.0.1 微信开发者工具 数据库 一张表三个字段 CREATE TABLE `user` (`u ...

  5. Spring Boot集成第三方登录之微信登录

    Spring Boot集成第三方登录之微信登录 准备工作 注册 创建网站应用 网站应用开发指南 授权流程 请求CODE 获取access_token 使用access_token调用接口 获取用户个人 ...

  6. 第三方登录之微信登录,基于ThinkSDK

    本文基于ThinkSDK,为其补充微信登录demo 增加ThinkSDK的微信第三方登录 阅读本文之前请先了解ThinkSDK的文档 http://www.echomod.com/nexstep/fo ...

  7. 网站如何接入第三方登录,微信登录和QQ登录:注册认证篇

    第三方登录平台接入 (QQ\微信登录) QQ登录接入 第一步成为QQ应用开发者,审核期限七天 一.所需材料 1.公司注册相关信息 2.营业执照扫描件 微信登录接入 第一步成为微信开发平台开发者,认证费 ...

  8. 网页版第三方登录操作——微信登录

    这个是我第一次写博客也是第一次做三方登录,参照了很多大神的写法,以及前辈的指导,最后完成了这个微信的三方登录.俗话说,好记性不如烂笔头,就在这里记下了. 在编写三方登录--微信登录之前,你需要有一个微 ...

  9. 第三方登录之微信登录

    第三方登录有很多,常见有新浪微博.QQ.微信.百度.支付宝等等,我们今天就来讲讲其中一个和其他登录有很大区别的微信登录,我们知道除了微信以外的其他第三方登录都支持账号密码输入的方式进行登录,但是微信登 ...

最新文章

  1. RS-232 Receiver
  2. VS2008常见编译错误(总结篇)
  3. HDUOJ----剪花布条
  4. python包括哪些部分_python基础知识部分练习大全
  5. Apache负载均衡+Tomcat集群
  6. 拋棄虛擬機,微軟實驗讓我們在線做(一)
  7. 不同的容器里实现 RadioButton的单选
  8. java jigsaw_是从Java 8启动的Project Jigsaw吗?
  9. Android WebView学习
  10. 12月1日高级软件测试例会记录
  11. python保存的快捷键_新手学Python需要知道的Pycharm常用快捷键总结及配置方法
  12. 传奇爆率你了解多少?传奇爆率小技巧
  13. 方舟生存进化手游版服务器维护,方舟生存进化手游PVX服务器规则一览 PVX服务器怎么玩_3DM手游...
  14. The Moo Particle
  15. Xcode (xip)官方原版下载 Xcode 所有历史版本(转载)
  16. 证明威尔逊(Wilson)定理及其逆定理
  17. 2. Golang基本语法
  18. 聚苯乙烯负载酸性离子液体(P[Vim-PS][HSO4])|活性炭(AC)负载酸性离子液体[Hmim-BS][HSO4]齐岳
  19. 免费在线PDF工具,支持全平台!强烈建议收藏!
  20. Django实战—— Web可视化漏洞扫描器

热门文章

  1. python绝技运用python成为顶级pdf_python绝技:运用python成为顶级黑客 中文pdf完整版[42MB]...
  2. table表格表头合并单元格问题
  3. Python Tkinter 之Listbox控件(Python GUI 系列12)
  4. 离散数学期末复习-基本回路系统和基本割集系统
  5. wGlasses AR智能眼镜正式发布!影育科技带来端云协同、软硬件及资源零代码、一体化的AR生态科技盛宴!
  6. 知道两点坐标,怎么计算两点方向的方位角
  7. 微信小程序map组件点聚合初次使用的坑
  8. 威斯康星大学硕士计算机科学,威斯康星大学麦迪逊分校计算机科学理学硕士研究生申请要求及申请材料要求清单...
  9. 秋从饶合似陶家,遍绕篱边日渐斜。不是花中偏爱菊,此花开尽更无花
  10. 控制 input 输入框不能输入中文,即不能在输入框中使用输入法