java-SpringBoot 实现微信扫码登录(网站应用)-前后端分离

news/2024/5/9 18:20:23/文章来源:https://blog.csdn.net/Zhangmaoyang/article/details/103735634

1 微信开放平台(https://open.weixin.qq.com/)资质认证并申请创建网站应用,拿到appId和appSecret以及回调url,已有的可跳过

   

2 后端将获取扫码用的二维码地址返回给前台

   

@Override
public Response getWechatQrCode() {try {LOGGER.info("开始获取微信登录二维码:");String oauthUrl = "https://open.weixin.qq.com/connect/qrconnect?            appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";String redirect_uri = URLEncoder.encode(Constant.WX_OPEN_REDIRECT_URL, "utf-8");System.out.println("redirect_uri:"+redirect_uri);oauthUrl =  oauthUrl.replace("APPID",Constant.WX_OPEN_APP_ID).replace("REDIRECT_URI",redirect_uri).replace("SCOPE",Constant.WX_OPEN_SCOPE);LOGGER.info("oauthUrl:"+oauthUrl);return new Response(Constant.RES_SUCCESS, "获取微信登录二维码成功", oauthUrl);} catch (Exception e) {LOGGER.info("获取微信登录二维码失败:"+e);Utils.getExceptionDetail(e);return new Response(Constant.RES_ERROR_SERVER,"服务器内部错误");}
}

  上面scope的值为snsapi_login,前端拿到oauthUrl就可以直接请求到微信扫码的页面

   

3 用户扫码之后就可以拿到code,使用code获取access_token和openid

   

4 用access_token和openid就可以获取用户的信息了

5 拿到用户信息(userInfoStr)了接下来就是判断用户是否存在,再做其他自定义代码的事了,如:

  

  至此网页微信扫码登录就算完成了,其中3-4步中的源码如下:

   

//通过code获取access_token
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
url = url.replace("APPID",Constant.WX_OPEN_APP_ID).replace("SECRET",Constant.WX_OPEN_APP_SECRET).replace("CODE",code);
JSONObject tokenInfoObject = HttpUtils.httpGet(url);
LOGGER.info("tokenInfoObject:{}",tokenInfoObject);//通过access_token和openid获取用户信息
String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
userInfoUrl = userInfoUrl.replace("ACCESS_TOKEN",tokenInfoObject.getString("access_token")).replace("OPENID",tokenInfoObject.getString("openid"));
JSONObject userInfoStr = HttpUtils.httpGet(userInfoUrl);
LOGGER.info("userInfoStr:{}",userInfoStr);

  上面用到的HttpUtils工具类:

   

package com.hy.bjggwhy.util;import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.IOException;/*** @author zhangmy* @date 2019-12-26 10:45* @description*/
public class HttpUtils {private static Logger logger = LoggerFactory.getLogger(HttpUtils.class);private static RequestConfig requestConfig = null;static {// 设置请求和传输超时时requestConfig = RequestConfig.custom().setSocketTimeout(2000).setConnectTimeout(2000).build();}/*** post请求传输json参数** @param url       url地址* @param jsonParam 参数* @return*/public static JSONObject httpPost(String url, JSONObject jsonParam) {// post请求返回结果CloseableHttpClient httpClient = HttpClients.createDefault();JSONObject jsonResult = null;HttpPost httpPost = new HttpPost(url);// 设置请求和传输超时时请求httpPost.setConfig(requestConfig);try {System.out.println(jsonParam);if (null != jsonParam) {// 解决中文乱码问题StringEntity entity = new StringEntity(jsonParam.toString(), "utf-8");entity.setContentEncoding("UTF-8");entity.setContentType("application/json");httpPost.setEntity(entity);}System.out.println(jsonParam);CloseableHttpResponse result = httpClient.execute(httpPost);// 请求发请求成功,并得到响应if (result.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {String str = "";try {// 读取服务器返回过来的json字符串数str = EntityUtils.toString(result.getEntity(), "utf-8");// 把json字符串转换成json对象jsonResult = JSONObject.parseObject(str);} catch (Exception e) {logger.error("post请求提交失败:" + url, e);}}} catch (IOException e) {logger.error("post请求提交失败:" + url, e);} finally {httpPost.releaseConnection();}return jsonResult;}/*** post请求传输String参数 例如:name=Jack&sex=1&type=2* Content-type:application/x-www-form-urlencoded** @param url      url地址* @param strParam 参数* @return*/public static JSONObject httpPost(String url, String strParam) {// post请求返回结果CloseableHttpClient httpClient = HttpClients.createDefault();JSONObject jsonResult = null;HttpPost httpPost = new HttpPost(url);httpPost.setConfig(requestConfig);try {if (null != strParam) {// 解决中文乱码问题StringEntity entity = new StringEntity(strParam, "utf-8");entity.setContentEncoding("UTF-8");entity.setContentType("application/x-www-form-urlencoded");httpPost.setEntity(entity);}CloseableHttpResponse result = httpClient.execute(httpPost);// 请求发宋成功,并得到响应if (result.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {String str = "";try {// 读取服务器返回过来的json字符串数据str = EntityUtils.toString(result.getEntity(), "utf-8");// 把json字符串转换成json对象jsonResult = JSONObject.parseObject(str);} catch (Exception e) {logger.error("post请求提交失败:" + url, e);}}} catch (IOException e) {logger.error("post请求提交失败:" + url, e);} finally {httpPost.releaseConnection();}return jsonResult;}/*** 发送get请求** @param url 路径* @return*/public static JSONObject httpGet(String url) {// get请求返回结果JSONObject jsonResult = null;CloseableHttpClient client = HttpClients.createDefault();// 发送get请求HttpGet request = new HttpGet(url);request.setConfig(requestConfig);try {CloseableHttpResponse response = client.execute(request);// 请求发送成功,并得到响应if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {// 读取服务器返回过来的json字符串数组HttpEntity entity = response.getEntity();String strResult = EntityUtils.toString(entity, "utf-8");// 把json字符串转换成json对象jsonResult = JSONObject.parseObject(strResult);} else {logger.error("get请求提交失败:" + url);}} catch (IOException e) {logger.error("get请求提交失败:" + url, e);} finally {request.releaseConnection();}return jsonResult;}
}

 

   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_903545.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows服务器下从零开始用wordpress一步步建站(适合新手)

windows服务器下从零开始用wordpress一步步建站(适合新手) wordpress介绍购买云服务器远程连接服务器下载安装XAMPP和wordpress搭建网站欢迎关注微信公众号:Java后台开发 wordpress介绍 WordPress是使用PHP语言开发的博客平台,当…

11款网站死链检测工具

11款网站死链检测工具 发表于 2013-12-13 17:29| 1751次阅读| 来源 Webdesigntalks| 8 条评论| 作者 Jason Smith 工具 网站 链接 摘要:网站中出现断链或死链,会导致部分资源无法访问,出现404报错,影响SEO。我们可以通过下面的11款…

利用Yslow查看网站性能

安装Yslow必须打开firefox,安装Firebug,然后下载YSlow,再进行安装。 重新打开Firefox浏览器,点击F12就能查看Yslow对网站页面进行的分析。

网站检测该注意的点

一、服务器响应代码 有几个服务器响应代码,会影响你进行搜索引擎优化,例如301、302和404。这些数字是指运行服务器指令,当用户试图请求一个页面。这些反应可能是301、302、或404这意味着请求的页面不存在。一个301响应代码意味着请求的页面已被永久地搬到一个新的位置&#xff…

chrome模拟手机访问网站

方法如下: 1、打开chrome浏览器,快捷键F12打开“开发者工具”。 2、在“开发者工具”界面的右侧有个“Show drawer”按钮,点击后在“drawer”界面再点击“Emulation”. 3、Device里面可以选择各种手机或者平板设备。点击“Emulate”按钮就可…

去掉网站首页index.html对排名有影响吗

去掉网站首页index.html对排名有影响吗?平时会遇到的一个情况,新站捡起来了,首页网址还有面带个index.html,index.html其实就是导航页的特点后缀,没有什么其他意义或者格式错误之类的问题。很多人都有问,首页怎么去掉index.html,在去掉之前,我们得弄清楚为什么要去掉首…

如何合理布局网站关键词

如何合理布局网站关键词:要做好网站优化,懂得合理布局网站关键词很重要。而我们平时写网站优化方案或是开始新站的网站优化,可以先从合理布局网站关键词开始。今天常州seo和大家谈如何合理布局网站关键词。 网站每个页面的等级权重不同&#…

稳定网站更新频率能提升百度排名?

稳定网站更新频率能提升百度排名?今天在phpwind论坛看到很多人讨论网站更新频率和百度排名的关系。有认为网站稳定更新频率可以提升SEO百度排名,也有人觉得网站稳定更新频率对百度排名没什么要多影响,对网站来说有利也有弊吧。 你要问我是什么想法,常州SEO觉得,一部分网站…

合格的SEO是宏观方向与微观操作的统一

合格的SEO是宏观方向与微观操作的统一:一名合格的SEO需要具备什么样的能力,很多人一直在思考这个问题。能够理出合理的优化方案?两个月相关关键词做上首页?每天写原创文章和有效外链的发布?这些都是SEO工作&#xff0c…

网站优化要坚持“三到”原则

网站优化要坚持“三到”原则:从开始做网站优化这份工作开始就一直听说SEO需要坚持,耐心。自己在优化工作的实践中也切实体会到坚持对于网站优化的重要性。而光坚持,却不知道如何坚持,确实是很多seoer头疼问题。坚持是seo工作中执行力的直接体…

企业网站优化用户体验以内容为主

企业网站优化用户体验以内容为主:如果用权威性的言语来讲企业网站优化用户体验怎么做的话,那百度官方的这句话很适合:是否是真心为用户去编辑他们想要的内容,是否具有高质量的原创内容。 企划网站优化用户体验是以内容为和核心的&…

如何对网站排名进行优化?带你深入理解SEO

一位爱好技术的橘右京的某个哥哥橘左京SEO介绍 SEO(Search Engine Optimization):汉译为搜索引擎优化。是一种方式:利用搜索引擎的规则提高网站在有关搜素引擎内的自然排名。目的是让其在行业内站在领先地位,获取品牌…

使用Teleport 进行网站扒取

工具使用 1.安装完成后,打开软件,新建项目向导 2.根据选择需要的模式,个人建议使用第二个,扒取所有目录 3.输入项目地址,如果需要越详细的页面,可以层数设置的大一点 4.选择文件类型 5.完成配置 6.将项目保…

机器学习实战k-近邻算法(kNN)应用之改进婚恋网站配对效果代码解

一.背景简要说明 问题背景不再详细赘述了,《机器学习实战》中有详细介绍,利用KNN想做的就是训练出一个分类器,能根据对方的一些特征判断他(她)对你的吸引程度,是不喜欢,还是一般喜欢&#xff0c…

我在B站学通过HUGO搭建网站

我在下载主题的时候遇到了GIT的问题, 错误是 git不是本地或内部指令 1、新建一个目录,存放下载下来的项目,我在D盘新建了一个“gitspace”文件夹,用来存放下载下来的项目 2、进入刚刚新建的文件夹,即进入“gitspace”…

基于vue框架Vant UI组件库移动端电商网站webapp项目总结

项目总结 一、项目名称 电商网站webapp开发二、技术栈 框架:vue框架 UI组件:Vant移动端Vue组件库安装:npm install vant -S项目中引用的部分组件:1、Tabbar标签栏:封装成底部标签栏,引入到其他组件中&am…

合作网站

我有兴趣并且现在也学习的不错了,html ,asp还自我感觉可以,做了一两个网站都是一两个页面,现在是在想真正做一个好的,但是一个人是很难做出来的。 没有时间,每天还得搞定那几门功课,所以想和志同…

nginx启用gzip(提升网站性能)

nginx服务器启用gzip可以对客户端请求的资源进行压缩,从而减少带宽和文件下载时间,提升网站加载速度。nginx关于gzip的配置内容如下: # 开启gzipgzip on;# 允许压缩文件的最小字节数,大于该阈值即可被压缩gzip_min_length 1024;# …

基于element的网站自适应方案(移动端适配)

一般而言,管理系统类的网站我们往往会按照PC的标准来设计,不会去考虑小屏幕的适配,甚至是移动端的适配,因为这种系统网站往往涉及到大量的列表查询页(表格列往往很多,列内容长短不一)&#xff0…

ASP.net 网站开发知识点总结

一、常用技术概括及介绍 1. SQL server:处理数据库的设计 2. asp.net 3. html :前端网页 4. css     :网页的布局设计 5. JavaScript :能够更好的操作页面 6. jQuery : 7. ajax    :处理局…