最近写了一个简单的微信第三方登录功能,存粹分享下心得和体会

首先需要APPID和SCRECT还有回调域(第三方地址,一般是公司的域名)(域名解析),

获取步骤是:

a.在微信开放平台https://open.weixin.qq.com/经过注册成为开发者。

b.在“管理中心”中创建一个移动应用来提交审核

之后是微信登录流程:

简单用例子来说就是:首先要分辨是第一次登录还是不是第一次登录,是前端传过来的授权临时票据code和appid和secrect来进行操作,
再在wxuser表中根据openid能否查询到对象,并且对象的userid是否存在,有的话不是第一次登录,没有就是第一次登录,
如果不是第一次登录,那么就是免密登录,重置token的有效时间,然后再设置盐值和密码的logininfo为空,就可以返回并且加上
集合就ok,如果是第一次登录,就需要写入三张表并且绑定,具体是首先非空校验,之后判断验证码是否过期,之后再验证验证码
是否正确,之后再验证是否根据手机号能查询到用户,能查到的话就可以只添加wxuser,否则要添加logininfo,user,最后是wxuser,
最后放入redis中,并把密码和盐值设置为空,最后在前端跳转首页。

经过整理流程就是:

前端:

1.在前端的登录页准备微信登录的按钮
2.当用户点击微信扫码登录,前端接缪按向微信发起获取授权的请求    
3.微信直接展示扫描二维码给用户(询问用户要不要给我们web项目授权)
4.用户扫码,确认授权我们的项目可以获取微信用户信息
5.微信收到确认,生成code(授权码),通过回调域)拼接code返回
6.我们的web项目在前台页面上就可以获取授权码了

微信登录流程
1.在前端页面中,我们定义钩子函数。
   从请求栏中获取code,并且触发调用后端的微信登录接口,将code传送到后端
2.后端接口收到请求,交给service处理
3.service业务流
4.code不能为空
5.根据code从微信获取token  使用httpClient  
6.拿到token+openId
7.判断openId是已经存在(查询t_wxUser),
   7.1.如果已经有了并且userid不为空,直接免密登录
   7.2 如果为空,需要让用户绑定个人用户信息
      返回token+openId 前端帮我们跳转到绑定页面
 
二:微信绑定流程
1.在前端页面的钩子函数中
2.接收微信登录流程的返回值,
3.跳转到绑定页面
4.绑定页面解析地址栏参数并且接收用户输入的参数
5.发起微信绑定流程
6.后端接收参数交给service处理
7.service业务流
  一:校验
   1.空校验
   2.判断验证码
  二:判断phone是否被注册 user
   1.如果注册了,那么我们可以直接绑定微信用户了
   2.如果没有注册过,要生成t_user + t_loginInfo
  三:通过 token+openId 查询微信信息 wxuser       
     生成t_wxuser
  四:绑定user和wxuser
  五:免密登录

/*微信登录*/
@Override
public AjaxResult wechat(Map<String, String> map) {String code = map.get("code");if (StringUtils.isEmpty(code)){//为空throw new MyException("系统异常。。。");}//通过code,appid,secret获取token令牌String url = WxConstants.GET_TOKEN_URL.replace("APPID",WxConstants.APPID).replace("SECRET",WxConstants.SECRET).replace("CODE",code);//发送请求,获取tokenString obj = HttpClientUtils.httpGet(url);//把json字符串转成json对象JSONObject jsonObject = JSONObject.parseObject(obj);//获取token和openidString token = jsonObject.getString("access_token");String openid = jsonObject.getString("openid");//通过openid和userid查询,如果不为空,说明登录过,免密登录WxUser wxUser = wxUserMapper.loadByOpenId(openid);String param = "?token=" + token + "&openId=" + openid;if (wxUser != null && wxUser.getUser_id() != null){//之前扫描过,直接放行//查询对应的logininfo信息,LoginInfo loginInfo = loginInfoMapper.loadByUserId(wxUser.getUser_id());//4.1获取tokenString token1 = UUID.randomUUID().toString();redisTemplate.opsForValue().set(token1,loginInfo,30, TimeUnit.MINUTES);Map<String, Object> map1 = new HashMap<>();map1.put("token",token1);//把盐值名和密码设置为空loginInfo.setPassword("");loginInfo.setSalt("");map1.put("loginInfo",loginInfo);//对象 存对象要序列化return AjaxResult.me().setResultObj(map1);}else {//第一次登录return AjaxResult.me().setSuccess(false).setResultObj(param);}
}/*
* 微信绑定
*     phone:"13330964748",verifyCode:"",token:"",openId:""
* */
@Override
public Map<String, Object> binder(Map<String, String> map) {String phone = map.get("phone");System.out.println(phone);String verifyCode = map.get("verifyCode");System.out.println(verifyCode);String token = map.get("token");System.out.println(token);String openId = map.get("openId");System.out.println(openId);//1.空校验if (StringUtils.isEmpty(phone)|| StringUtils.isEmpty(verifyCode)|| StringUtils.isEmpty(token)|| StringUtils.isEmpty(openId)){throw new MyException("参数不能为空");}//2.验证码校验//验证码对否过期Object o = redisTemplate.opsForValue().get("binder:" + phone);//端输入的验证码和发送的是否一致 不区分//获取验证码String code = o.toString().split(":")[0];if (!verifyCode.equalsIgnoreCase(code)){throw new MyException("验证码错误,请重新输入!!");}//3.判断手机号是否被注册User user = userMapper.loadByPhone(phone);LoginInfo loginInfo = null;User userTemplate = null;if (user != null){//之前注册过了System.out.println(111);userTemplate  = user;loginInfo = loginInfoMapper.loadByUserId(userTemplate.getId());}else {//没有注册,重新保存三张表System.out.println(222);User user1 = initUser(phone);userTemplate = user1;//设置logininfo_idloginInfo = initLoginInfo(userTemplate);//设置类型为1用户loginInfo.setType(1);//添加登录信息loginInfoMapper.add(loginInfo);System.out.println(loginInfo.getId());userTemplate.setLogininfo_id(loginInfo.getId());//添加logininfo_iduser1.setLogininfo_id(loginInfo.getId());//添加用户userMapper.add(user1);}//获取用户信息,保存在wxuserString obj = HttpClientUtils.httpGet(WxConstants.GET_USER_URL).replace("ACCESS_TOKEN", token).replace("OPENID", openId);WxUser wxUser = initWxuser(obj);//绑定wxUser.setUser_id(userTemplate.getId());//保存wxuser中的信息wxUser.setOpenid(openId);wxUserMapper.add(wxUser);//4.把用户信息放入redis中//4.1获取tokenredisTemplate.opsForValue().set(token,loginInfo,30, TimeUnit.MINUTES);Map<String, Object> map1 = new HashMap<>();map1.put("token",token);//把用户名和密码设置为空loginInfo.setPassword("");loginInfo.setSalt("");map1.put("loginInfo",loginInfo);//对象 存对象要序列化return map1;
}//通过obj生成wxUser对象
private WxUser initWxuser(String obj) {JSONObject jsonObject = JSONObject.parseObject(obj);WxUser wxUser = new WxUser();wxUser.setOpenid(jsonObject.getString("openid"));wxUser.setNickname(jsonObject.getString("nickname"));wxUser.setSex(jsonObject.getInteger("sex"));wxUser.setAddress(null);wxUser.setHeadimgurl(jsonObject.getString("headimgurl"));wxUser.setUnionid(jsonObject.getString("unionid"));return wxUser;
}//通过user生成logininfo对象
private LoginInfo initLoginInfo(User userTemplate) {LoginInfo info = new LoginInfo();BeanUtils.copyProperties(userTemplate,info); //按照同名原则拷贝属性return info;
}//通过手机号生成user对象
private User initUser(String phone) {User user = new User();user.setUsername(phone);user.setPhone(phone);user.setEmail(null);//给一个随机密码String salt = UUID.randomUUID().toString();String password = MD5Utils.encrypByMd5("1"+salt);user.setPassword(password);user.setSalt(salt);user.setState(1);user.setCreatetime(new Date());return user;
}

web项目web接入微信登录相关推荐

  1. uni-app - 最详细 H5 网页接入微信登录功能,提供公众号配置与详细注释示例代码(移动端网页实现点击登录按钮后 调用微信公众号授权登录功能 详细讲解接入流程与详细示例代码)官方最新超级详细教程

    前言 关于 uni-app 项目中接入微信授权登录的文章鱼龙混杂,各种乱代码.过时.没注释.不讲流程原理,非常难用. 本文实现了 uni-app H5 移动端网页项目,实现微信授权登录功能,详细讲解接 ...

  2. 接入微信登录---(由于微信的官方文档写的有点散,特此记录一下)

    最近app上Goole市场,三方登录这块原先用的是mob的,但是Goole那边检测到mob会自动收集手机用户的手机号码信息并上传到mob的后台,所以App被下架了,没办法就让直接对接微信登录.下面就是 ...

  3. 详解如何进行第三方App接入微信登录

    微信登录接入 微信登录遵循协议Aouth2.0中的授权码模式 我们来看一下Aouth2.0中的授权码模式是怎么定义的: 授权码模式(authorization code)是功能最完整.流程最严密的授权 ...

  4. CocosCreator微信小游戏接入微信登录获取微信名、头像、经纬度等信息

    前言 微信小游戏接入微信登录还是很简单的,不像原生平台开发,还需要提供appid,appsecret等信息,并有一系列的和微信平台的交互,才能最终授权成功. 下面TS代码演示了,老的接入流程. exp ...

  5. 第三方App接入微信登录 解读

    最近在做一个微信登录功能,发现腾讯的API文档写的实在是让人摸不着头脑,也没有搜到很详细的能让人参考的文章,借此把自己的一点儿使用心得与大家分享,欢迎指正其中的不足之处,谢谢! 准备工作 1.在微信开 ...

  6. WeChat----网站接入微信登录(前端)

    网站接入微信登录 标识符长度 openid 长度:28, 普通用户的标识,对当前开发者帐号唯一.一个openid对应一个公众号 unionid 长度:29, 用户统一标识.针对一个微信开放平台帐号下的 ...

  7. Android Studio App 接入微信登录

    安卓接入微信登录 微信开发平台获取AppId和AppSecret 开始接入 添加依赖 注册wxApi 登录调用 监听登录回调 注意事项 微信开发平台获取AppId和AppSecret 创建应用 填写对 ...

  8. 我的个人网站不让接入微信登录,于是我做了这个

    原文链接:https://www.jylt.cc/#/detail?id=311995d9731f6ff96f9a14cfe138d3c5 身为一名Java程序猿,怎么能没有自己的网站呢?经过几个日夜 ...

  9. 微信开发 - 第三方网站接入微信登录、微信支付时,本地 redirect_uri 参数错误导致无法调试的解决方案(微信开放平台)完美解决每次都需要部署到线上测试,在本地使用本地 ip 就能轻松调试

    问题描述 网上的教程都非常乱且无效,本文将站在新手的角度,超级详细的讲解. 本文提供 在微信开放平台,接入微信登录和微信支付时,本文无法调试 redirect_uri 回调错误 的解决方案, 仅需几个 ...

最新文章

  1. YII2 载入默认值 loadDefaultValues
  2. 批量改变文件夹和子文件夹中图片格式的两种方法
  3. Android布局_LinearLayout布局
  4. JDK+SDK 环境变量记录
  5. linux 如何查看进程端口号,在linux中查看进程占用的端口号
  6. c# printDialog不显示问题
  7. html需要背的标签,html的header标签需要怎么使用
  8. 海外代理ip池购买推荐,易路s5海外ip代理如何提取使用?
  9. BZOJ 3262: 陌上花开 (CDQ分治)
  10. 线性调频信号MATLAB仿真
  11. autojs ui界面模板3
  12. 确定sw1开关信号输入端口_三菱PLC入门 | FX2N系列PLC的信号输入端子接线(图文详解)...
  13. 硅谷的程序员, 入职第一天都在干什么?
  14. 链路追踪:SkyWalking
  15. 武汉理工大学博士生导师计算机,博士学位论文预答辩公告-武汉理工大学计算机学院.DOC...
  16. Vue移动端各种机型判断
  17. com.alibaba.fastjson.JSON ,对象 转JSON字符串时,对字段名做了转换,需要注意啦
  18. Geckofx使用心得(一)
  19. 关于使用U盘安装ESXi发生的一些错误及解决经验
  20. 47.VC(custom)-string头文件与cstring头文件

热门文章

  1. The Pilots Brothers‘ Refrigerator(高效贪心)
  2. 【乌拉喵.教程】不同负载下继电器的保护电路设计(解决继电器触点粘接的问题)
  3. 虚拟现实技术——Cocos Creator 动画系统动作笔记
  4. linux使用mysql命令行工具_我使用过的Linux命令之mysql - MySQL客户端命令行工具
  5. Robust Pose Estimation in Crowded Scenes with Direct Pose-Level Inference 阅读笔记
  6. [USACO13NOV]Crowded Cows
  7. android内存问题详解--重要
  8. Java响应式流框架Reactor中的Mono和Flux
  9. 计算机基础 电子工业出版,电子工业出版社21世纪计算机基础教育系列教材2吴功宜吴英编着.ppt...
  10. 爱奇艺国内首家PC端上线杜比视界服务 持续打造“影院级体验”