在开始讲解微信登陆前先补一些知识点

Step1:常见互联网登陆方式

1.手机号或邮箱注册

优点

​ 1)企业获取了用户的基本资料信息,利于后续业务发展推送营销类信息

​ 2)用户可以用个手机号或者邮箱获取对应的app福利 注册送优惠券

​ 3)反馈信息的时候方便,直接报手机号即可账户出问题,被盗等

缺点:

​ 1)步骤多

​ 2)如果站点不安全,如站点被攻击,泄露个人信息,如手机号、密码等

​ 3)少量不良企业贩卖用户信息,如手机号等

2.OAuth2.0一键授权登陆

例子:豆瓣:www.douban.com

优点:使用便捷,用户体验好,数据相对安全

缺点:

​ 1)反馈问题麻烦,比较难知道唯一标识 openid

​ 22)如果是企业下面有多个应用,其中有应用不支持Auth2.0登陆,则没法左到用户信息打通,不能复用等,如app接入了微信授权登陆,但是网站没有,则打不通,或者授权方只提供了一种终端授权,则信息无法打通。

3.选择方式

1)看企业和实际业务情况

2)务必区分,普通密码和核心密码

Step2:微信扫一扫功能开发前准备

微信开放平台

网站:htts://open.weixin.qq.com/

无奈微信开放平台对开发者不友好,一定要公司营业执照 + 300元认证认证,才可以认证微信开放平台接入微信登录。

如果你有自己的应用,还需要备案等,但这里我会把整体的流程讲解

有三个点要注意

appid:就是你的应用唯一id

appsecret:密钥

code:授权码

redirect_url:授权回调域(这里重点说一下,你应用那里写的是多少,你的配置中一定要一样,)

比如你在当前www.baidu.com 微信登陆,微信那边会回调你配置的地址,它会把一些code重要参数给你,如果你地址不对,那么你就接收不到参数,自然后面的操作也是无法完成的。感觉有些懵继续往下看就明白了

封装一个Http请求类,用于我们扫一扫后向微信平台发请求获取信息用的

Step1:添加依赖

     <!--HttpClient--><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.3</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpmime</artifactId><version>4.5.2</version></dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.1</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId></dependency><!--gson工具,封装http的时候使用 做map类型的转换--><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.0</version></dependency>

Step2:封装GET\POST请求

/*** 封装http get post方法*/
public class HttpUtils {private static final Gson gson = new Gson();/*** get方法* @param url* @return*/public static Map<String,Object> doGet(String url){Map<String,Object> map = new HashMap<>();CloseableHttpClient httpClient = HttpClients.createDefault();RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000)//连接超时.setConnectionRequestTimeout(5000)//请求连接超时.setSocketTimeout(5000).setRedirectsEnabled(true)//允许重定向.build();HttpGet httpGet = new HttpGet(url);httpGet.setConfig(requestConfig);try {HttpResponse httpResponse = httpClient.execute(httpGet);if(httpResponse.getStatusLine().getStatusCode() == 200){String jsonResult = EntityUtils.toString(httpResponse.getEntity());//转换key value形式map = gson.fromJson(jsonResult,map.getClass());}}catch (Exception e){e.printStackTrace();}finally {//关闭请求try {httpClient.close();}catch (Exception e){e.printStackTrace();}}return map;}public static String doPost(String url,String data,int timeout){CloseableHttpClient httpClient = HttpClients.createDefault();//超时设置RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeout)//连接超时.setConnectionRequestTimeout(timeout)//请求连接超时.setSocketTimeout(timeout).setRedirectsEnabled(true)//允许重定向.build();HttpPost httpPost = new HttpPost(url);httpPost.setConfig(requestConfig);//增加头信息httpPost.addHeader("Content-Type","text/html;chartset=UTF-8");if(data != null && data instanceof String){//使用字符窜传参StringEntity stringEntity = new StringEntity(data,"UTF-8");httpPost.setEntity(stringEntity);}try {CloseableHttpResponse httpResponse = httpClient.execute(httpPost);HttpEntity httpEntity  = httpResponse.getEntity();if(httpResponse.getStatusLine().getStatusCode() == 200){String result  = EntityUtils.toString(httpEntity);return result;}}catch (Exception e){e.printStackTrace();}finally {try {httpClient.close();}catch (Exception e){e.printStackTrace();}}return null;}
}

Step3:微信登陆回调本地域名映射工具NATAPP

以上步骤完成后,我们还需要一个ip映射工具

什么是域名映射: 就是当前开发机器的ip 通过和域名绑定,让外部网络可以通过域名就行访问到本地机器接口

原来是使用Ngrock,但现在不能用了,这里我们使用新的工具NATAPP

官网:https://natapp.cn/

文档:https://natapp.cn/article/natapp_newbie

因为文档有很详细的讲解,这里就不再演示,有一点,配置authtoken的文件,需要放在natapp.exe同级目录下,才能映射出来地址,成功后是这个样子的。我这里使用的是免费的,每次启动会给一个随机的,如果你有线上应用,那么你可以买一个自定义域名映射,也不贵,好像10块钱一个月

置好后我们就可以用它给的地址,去访问我们的服务了

是不是很好用,这样我们就不用去购买域名去配置服务器了,但是一定不要去做一些非法的事情

这个东西有时也会断电,因为它也是建立一个服务器么,不稳定,但在你开发测试频率不高,也不影响

Step4:微信OAuth2.0交互流程讲解

一定要明白这个流程,不然你还是懵懵的

三个角色:

1)微信用户也就是你!

2)第三方应用也就是你访问的网站

3)微信开放平台

流程

1.微信用户请求第三方应用登陆

2.网站请求微信开放平台OAuth2.0授权登陆

3.微信开放平台收到请求后返回二维码扫一扫

4.微信用户确定信息返回给微信开放平台

5.微信开放平台收到用户确认后,会带上一个票据,调取网站后台 后台得到一个参数code

6.通过code,去微信开放平台发送请求,通过code加上appid和appsecret换取token令牌,token里包含用户信息

7.微信开放平台返回access_token,去拿去用户信息

Step5:微信授权一键登陆之授权URL获取

第一步!:请求CODE

https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

上面是官网的实例,而我们请求生成二位码时需要重新拼接里面的值来生成我们的二位码

Step1:添加微信配置

XXX都是你自己微信开放平台的值

appid和appsecret都是已经申请过的应用,需要有公司注册,还要交300块钱,url就是一个扫码后的回调地址,这个是你应用的回调域名地址,你那里写多少,这里就要写多少才能回调成功,回调后的操作就是你之后拿code再像微信开放平台获取用户信息的一些操作

#微信开放平台配置
wxopen.appid=XXXX
wxopen.appsecret=XXX
#授权回调url接口
wxopen.redirect_url=http://XXX你自己的域名/api/v2/wechat//user/callback

Step2:微信配置类

里面的参数在后面都会一一用到,记得添加get、set方法,这里我就不写了

/*** 微信配置类*/
@Configuration
@PropertySource(value = "classpath:application.properties")
public class WeChatConfig {/*** 开放平台appid*/@Value("${wxopen.appid}")//bean对象属性注入private String openAppId;/*** 开放平台密钥*/@Value("${wxopen.appsecret}")private String openAppsecret;/*** 开放平台回调地址*/@Value("${wxopen.redirect_url}")private String openRedirectUrl;/*** 微信平台的二位码链接*/private final static String OPEN_QRCODE_URL= "https://open.weixin.qq.com/connect/qrconnect?appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_login&state=%s#wechat_redirect";/*** 开放平台获取access_token地址*/private final static String OPEN_ACCESS_TOKEN_URL="https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code";/*** 开放平台获取用户信息*/private final static String OPEN__USER_INFO_URL="https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%slang=zh_CN";
}

Step3:控制层

@Controller
@RequestMapping("api/v2/wechat")
public class WechatController {@Autowiredprivate WeChatConfig weChatConfig;@Autowiredprivate UserService userService;/*** 拼装扫一扫登陆url* @return* @accessPage:扫码登陆回调后回到的页面*/@GetMapping("login_url")@ResponseBodypublic Dto loginUrl(@RequestParam(value = "access_page",required = true)String accessPage) throws UnsupportedEncodingException {//获取开放平台重定向地址String rediectUrl =weChatConfig.getOpenRedirectUrl();//处理链接编码String callbackUrl = URLEncoder.encode(rediectUrl,"GBK");//拼装扫码链接String qrcodeUrl = String.format(WeChatConfig.getOpenQrcodeUrl(),weChatConfig.getOpenAppId(),callbackUrl,accessPage);return DtoUtil.returnDataSuccess(qrcodeUrl);}
}

测试

可以看到我们频接了对应的url,拿到这个url后,我们在打开一个新的页面去访问,就会生成二位码,只要你的appid和和回调地址以及appsecret是真实的,就能出现二位码,如果不存在,会提示你appid参数错误等信息

注意:这里这步,我们只是先生成了二位码,而并没有做一些回调操作,访问的这个地址是微信开放平台的,这里就需要等待用户扫描,确认后!才会进行地址的回调,我们再做一些其它的操作。这里就是流程上面的第四步

Step6:授权回调获取用户信息

完成上面的操作后,这里先将一下流程,用户扫完码确认登陆后,微信平台就会回调我们配置好的地址,将code发送给我们。拿到code后我们再请求微信平台获取用户token再拿token获取用户信息,所以这个流程大家一定要清除,如果你没有上线应用,没关系,代码整体的流程就这些,明白这个过程就行

在上面微信的配置类里我们还加了这两个属性,上面忘说了,使用%s的方式,就可以频接字符串

OPEN_ACCESS_TOKEN_URL:根据回调给我们的code,再去访问微信平台获取用户token
OPEN__USER_INFO_URL:拿到用token后再去访问微信平台获取用户信息,比如头像名称等

Step1:Service接口

    User saveWeChatUser(String code);

Step2:Service实现类

用到了我们上面写好的封装方法,过程不复杂,就是发请求拿对应的值再发请求就可以了

    @Overridepublic User saveWeChatUser(String code) {//获取微信开放平台access_tokenurl地址 频接字符串String accessTokenUrl = String.format(WeChatConfig.getOpenAccessTokenUrl(),weChatConfig.getOpenAppId(),weChatConfig.getOpenAppsecret(),code);//http发送请求 拿对应的accessToken和openidMap<String,Object> baseMap = HttpUtils.doGet(accessTokenUrl);if(baseMap == null || baseMap.isEmpty()){return null;}String accessToken = (String)baseMap.get("access_token");String openId = (String)baseMap.get("openid");//通过accessToken获取用户信息String userInfoUrl = String.format(WeChatConfig.getOpen_userInfoUrl(),accessToken,openId);Map<String,Object> baseUserMap = HttpUtils.doGet(userInfoUrl);if(baseUserMap == null || baseUserMap.isEmpty()){return null;}//获取需要的用户信息 编码问题,不做处理会乱码String nickname = (String)baseMap.get("nickname");//微信开放平台那边性别是doubleDouble sex = (Double)baseMap.get("sex");//用于数据的库存储,我这里再给它转成int类型int sex = sexTemp.intValue();String province = (String)baseMap.get("province");//String city = (String)baseMap.get("city");String headimgurl = (String)baseMap.get("headimgurl");//转码try {nickname = new String(nickname.getBytes("ISO-8859-1"), "UTF-8");finalAddress = new String(finalAddress.getBytes("ISO-8859-1"), "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}//这里做一些保存用户信息的操作return null;}

具体的有一些参数值,需要哪些去官网找

拿到所有信息后,根据自己需求,保存用户信息,根据openid查询数据库是否已存在微信用户信息等,不存在再保存,至于一些用户在平台上改变一些头像昵称等,那些都是在修改做的操作,一开始保存信息就不再做查询更新了

SpringBoot:微信授权扫一扫登陆整体流程超详细相关推荐

  1. uniappH5+springboot微信授权登录获取用户数据(非静默授权)

    uniappH5+springboot微信授权登录获取用户数据(非静默授权) 微信网页授权开发文档 准备工作 微信公众号appid和appSecret及配置相关的ip白名单 配置网页授权域名,具体操作 ...

  2. 2023微信社区小程序+APP+后台,附带超详细完整搭建教程【源码+教程】

    2023微信社区小程序+APP+后台,附带超详细完整搭建教程[源码+教程] 微信授权登陆正常,小程序和APP带后台 手机号登陆正常,发帖,建圈子.发活动. 微信小程序是一种轻量级的应用程序,可以在微信 ...

  3. springboot微信授权登录

    水平有限!实现方法直接找的网上的以为大神所编写的api来实现,这里主要是记录一下自己实现的过程.具体方法请参考网址:https://github.com/liyiorg/weixin-popular, ...

  4. 【移动端聊天功能模板】Vue实现H5聊天系统,实现上下固定中间滚动布局,微信授权功能,自动滚动到底部【详细注释,一看就会】

    前言 最近刚好在做这方面的功能,就网上看了下,发现很多种写法,但是有些写的很乱, 我也看的很麻烦,干脆就自己写一个简单的静态版本放在这, 以后需要用到的时候可以直接拿着改改就能用. 后面我还会继续更新 ...

  5. MMKV_微信MMKV源码分析(一) | 整体流程

    在使用MMKV框架前,需调用以下方法进行初始化 MMKV.initialize(context); 复制代码 这里的 Java 层主要是获取到保存文件的路径,传入Native层,这里默认的路径是APP ...

  6. 微信公众号支付开发步骤Java(超详细)

    做为一个刚刚做完微信公众号的小白,我不得不吐槽一下微信给的官方文档,里面那坑一个接一个,我这是跳进去再爬出来,一下给做了四天,本来技术就不够好,还被文档带的跑偏跑偏...我在这给大家整理一份超级详细的 ...

  7. SpringBoot接入微信公众号(测试)整体流程

    第一步:申请一个测试的公众号 来吧,动动你的小手点击这个>>>>>>>>>>测试公众号的申请网址:微信测试公众号入口 第二步:进入了界面是下 ...

  8. 微信小程序支付以及退款功能(超详细)

    Springboot整合微信小程序支付 第一步: 第二步:导入微信支付的依赖 第三步:在springboot核心配置文件中配置参数 第四步:创建配置类WxPayAppConfig 第五步:支付方法 s ...

  9. 微信小程序云函数使用教程【超详细】

    背景需求 在本人的项目中,需要调用一个http的接口,而微信小程序所有的网络请求都得使用https,因而需要一个中转站,使得在正式发布的时候可以使用http接口.(在调试环境下,只要在本地设置里勾选& ...

最新文章

  1. 管道:介绍和基本服务
  2. bzoj1013,luogu4035-[JSOI2008]球形空间产生器【高斯消元】
  3. QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开
  4. iphone固件降级_iPhone无法开机怎么办?三种快速维修方法
  5. Django - - - -视图层之视图函数(views)
  6. elementUI Drawer 抽屉 Dialog 对话框 等弹出组件的遮罩层以及多层遮罩解决办法
  7. java基本数据类型以及相关内容总结
  8. 配置Windows Server 2008 允许多用户远程桌面连接
  9. nodejs的简单爬虫
  10. 【LeetCode】【数组】题号:*498,对角线遍历
  11. JAVA毕设项目vue架构云餐厅美食订餐系统(Vue+Mybatis+Maven+Mysql+sprnig+SpringMVC)
  12. Access数据库引擎
  13. python打包加密工具:Pyinstaller和Nuitka
  14. DataTable数据过滤方法
  15. 根据经纬度计算指定范围内或者附近的人(java)
  16. C语言学习日记(2)——写个Hello,World测试一下
  17. [PHP] 2018年终总结
  18. Android iOS Mac QQ邮箱 日历同步
  19. 奥巴马:我们为什么要上学
  20. vue使用 html2canvas 导出页面,及将图片转成 pdf 格式

热门文章

  1. Android游戏开发–雪碧动画
  2. Linux怎样创建.log文件,列数Linux下几种创建文件的方式
  3. 华为手表哪款搭载鸿蒙系统,华为Watch GT 2渲染图曝光:首款搭载鸿蒙系统的智能手表...
  4. SVN多项目多仓库管理
  5. 带你走进 lsof 命令
  6. 写书用什么软件好_什么软件记事好?苹果手机上有什么实用的便签记事本软件推荐吗...
  7. java写入文件的几种方法(一)
  8. 21个经典段子,你得到启示了吗?
  9. 【ESP32】17.DS1302实时时钟模块实验(ThreeWire库 / RtcDS1302库)
  10. Android实现小米手机自带的计算器