微信登录功能(1)

  • 2、服务器端(后端)开发

    • 2.1、返回微信登录参数
    • 2.1.1、添加配置
  • 2.1.2、添加配置类

  • 2.1.3、添加接口

  • 2.1.4、微信二维码调用网关配置

  • 2.2、前端显示登录二维码

    • 2.2.1、封装api请求
  • 2.2.2、修改组件

  • 2.3、处理微信回调

    • 2.3.1、引入依赖
  • 2.3.2、添加httpclient工具类

  • 2.3.2、添加回调接口获取access_token

1、微信登录介绍

=======================================================================

1.1、前期准备


1、注册

微信开放平台:https://open.weixin.qq.com

2、邮箱激活

3、完善开发者资料

4、开发者资质认证

准备营业执照,1-2个工作日审批、300元

5、创建网站应用

提交审核,7个工作日审批

6、内网穿透

ngrok的使用

1.2、授权流程


参考文档:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=e547653f995d8f402704d5cb2945177dc8aa4e7e&lang=zh_CN

获取access_token时序图

在这里插入图片描述

第一步:请求CODE(生成授权URL)

第二步:通过code获取access_token(开发回调URL)

2、服务器端(后端)开发

===========================================================================

操作模块:service-user

说明:微信登录二维码我们是以弹出层的形式打开,不是以页面形式,所以做法是不一样的,参考如下链接,上面有相关弹出层的方式

https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html

如图:

在这里插入图片描述

因此我们的操作步骤为:

第一步我们通过接口把对应参数返回页面;

第二步在头部页面启动打开微信登录二维码;

第三步处理登录回调接口;

第四步回调返回页面通知微信登录层回调成功

第五步如果是第一次扫描登录,则绑定手机号码,登录成功

接下来我们根据步骤,一步一步实现

2.1、返回微信登录参数


2.1.1、添加配置

在application-dev.yml添加配置

在这里插入图片描述

服务端口

server.port=8160

wx.open.app_id=wxed9954c01bb89b47

wx.open.app_secret=a7482517235173ddb4083788de60b90e

wx.open.redirect_url=http://localhost:8160/api/ucenter/wx/callback

yygh.baseUrl=http://localhost:3000

2.1.2、添加配置类

在这里插入图片描述

@Component

public class ConstantWxPropertiesUtil implements InitializingBean {

@Value(“${wx.open.app_id}”)

private String appId;

@Value(“${wx.open.app_secret}”)

private String appSecret;

@Value(“${wx.open.redirect_url}”)

private String redirectUrl;

@Value(“${yygh.baseUrl}”)

private String yyghBaseUrl;

public static String WX_OPEN_APP_ID;

public static String WX_OPEN_APP_SECRET;

public static String WX_OPEN_REDIRECT_URL;

public static String YYGH_BASE_URL;

@Override

public void afterPropertiesSet() throws Exception {

WX_OPEN_APP_ID = appId;

WX_OPEN_APP_SECRET = appSecret;

WX_OPEN_REDIRECT_URL = redirectUrl;

YYGH_BASE_URL = yyghBaseUrl;

}

}

2.1.3、添加接口

添加com.atguigu.yygh.user.api.WeixinApiController 类

在这里插入图片描述

@Controller

@RequestMapping(“/api/ucenter/wx”)

public class WeixinApiController {

//1、生成微信扫描二维码

//返回生成二维码需要的参数

@GetMapping(“getLoginParam”)

@ResponseBody

public Result genQrConnect() {

try {

Map<String, Object> map = new HashMap<>();

map.put(“appid”, ConstantWxPropertiesUtil.WX_OPEN_APP_ID);

map.put(“scope”, “snsapi_login”);

String wxOpenRedirectUrl = ConstantWxPropertiesUtil.WX_OPEN_REDIRECT_URL;

wxOpenRedirectUrl = URLEncoder.encode(wxOpenRedirectUrl, “utf-8”);

map.put(“redirect_uri”, wxOpenRedirectUrl);

map.put(“state”, System.currentTimeMillis() + “”);//System.currentTimeMillis()+“”

return Result.ok(map);

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

return null;

}

}

}

2.1.4、微信二维码调用网关配置

在这里插入图片描述

#5、微信二维码显示

#设置路由id

spring.cloud.gateway.routes[4].id=service-user

#设置路由的uri

spring.cloud.gateway.routes[4].uri=lb://service-user

#设置路由断言,代理servicerId为auth-service的/auth/路径

spring.cloud.gateway.routes[4].predicates= Path=/*/ucenter/**

2.2、前端显示登录二维码


2.2.1、封装api请求

创建/api/user/wexin.js文件

import request from ‘@/utils/request’

const api_name = /api/ucenter/wx

export default {

getLoginParam() {

return request({

url: ${api_name}/getLoginParam,

method: get

})

}

}

2.2.2、修改组件

修改layouts/myheader.vue文件,添加微信二维码登录逻辑

1、引入api

在这里插入图片描述

import weixinApi from ‘@/api/weixin’

2、引入微信js

在这里插入图片描述

mounted() {

// 注册全局登录事件对象

window.loginEvent = new Vue();

// 监听登录事件

loginEvent.$on(‘loginDialogEvent’, function () {

document.getElementById(“loginDialog”).click();

})

// 触发事件,显示登录层:loginEvent.$emit(‘loginDialogEvent’)

//初始化微信js

const script = document.createElement(‘script’)

script.type = ‘text/javascript’

script.src = ‘https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js’

document.body.appendChild(script)

// 微信登录回调处理

let self = this;

window[“loginCallback”] = (name,token, openid) => {

self.loginCallback(name, token, openid);

}

},

3、实例化微信JS对象

添加微信登录方法

在这里插入图片描述

//微信二维码显示

weixinLogin() {

this.dialogAtrr.showLoginType = ‘weixin’

weixinApi.getLoginParam().then(response => {

var obj = new WxLogin({

self_redirect:true,

id: ‘weixinLogin’, // 需要显示的容器id

appid: response.data.appid, // 公众号appid wx*******

scope: response.data.scope, // 网页默认即可

redirect_uri: response.data.redirect_uri, // 授权成功后回调的url

state: response.data.state, // 可设置为简单的随机数加session用来校验

style: ‘black’, // 提供"black"、"white"可选。二维码的样式

href: ‘’ // 外部css文件url,需要https

})

})

},

说明:微信登录方法已绑定weixinLogin(),查看页面

4、测试

刷新页面,查看效果

在这里插入图片描述

在这里插入图片描述

2.3、处理微信回调


2.3.1、引入依赖

在这里插入图片描述

org.apache.httpcomponents

httpclient

4.5.1

2.3.2、添加httpclient工具类

添加com.study.yygh.user.util.HttpClientUtils类

package com.study.yygh.user.utils;

import org.apache.commons.io.IOUtils;

import org.apache.commons.lang.StringUtils;

import org.apache.http.Consts;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.NameValuePair;

import org.apache.http.client.HttpClient;

import org.apache.http.client.config.RequestConfig;

import org.apache.http.client.config.RequestConfig.Builder;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.conn.ConnectTimeoutException;

import org.apache.http.conn.ssl.SSLConnectionSocketFactory;

import org.apache.http.conn.ssl.SSLContextBuilder;

import org.apache.http.conn.ssl.TrustStrategy;

import org.apache.http.conn.ssl.X509HostnameVerifier;

import org.apache.http.entity.ContentType;

import org.apache.http.entity.StringEntity;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;

import org.apache.http.message.BasicNameValuePair;

import javax.net.ssl.SSLContext;

import javax.net.ssl.SSLException;

import javax.net.ssl.SSLSession;

import javax.net.ssl.SSLSocket;

import java.io.IOException;

import java.net.SocketTimeoutException;

import java.security.GeneralSecurityException;

import java.security.cert.CertificateException;

import java.security.cert.X509Certificate;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Set;

public class HttpClientUtils {

public static final int connTimeout=10000;

public static final int readTimeout=10000;

public static final String charset=“UTF-8”;

private static HttpClient client = null;

static {

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();

cm.setMaxTotal(128);

cm.setDefaultMaxPerRoute(128);

client = HttpClients.custom().setConnectionManager(cm).build();

}

public static String postParameters(String url, String parameterStr) throws ConnectTimeoutException, SocketTimeoutException, Exception{

return post(url,parameterStr,“application/x-www-form-urlencoded”,charset,connTimeout,readTimeout);

}

public static String postParameters(String url, String parameterStr,String charset, Integer connTimeout, Integer readTimeout) throws ConnectTimeoutException, SocketTimeoutException, Exception{

return post(url,parameterStr,“application/x-www-form-urlencoded”,charset,connTimeout,readTimeout);

}

public static String postParameters(String url, Map<String, String> params) throws ConnectTimeoutException,

SocketTimeoutException, Exception {

return postForm(url, params, null, connTimeout, readTimeout);

}

public static String postParameters(String url, Map<String, String> params, Integer connTimeout,Integer readTimeout) throws ConnectTimeoutException,

SocketTimeoutException, Exception {

return postForm(url, params, null, connTimeout, readTimeout);

}

public static String get(String url) throws Exception {

return get(url, charset, null, null);

}

public static String get(String url, String charset) throws Exception {

return get(url, charset, connTimeout, readTimeout);

}

/**

  • 发送一个 Post 请求, 使用指定的字符集编码.

  • @param url

  • @param body RequestBody

  • @param mimeType 例如 application/xml “application/x-www-form-urlencoded” a=1&b=2&c=3

  • @param charset 编码

  • @param connTimeout 建立链接超时时间,毫秒.

  • @param readTimeout 响应超时时间,毫秒.

  • @return ResponseBody, 使用指定的字符集编码.

  • @throws ConnectTimeoutException 建立链接超时异常

  • @throws SocketTimeoutException 响应超时

  • @throws Exception

*/

public static String post(String url, String body, String mimeType,String charset, Integer connTimeout, Integer readTimeout)

throws ConnectTimeoutException, SocketTimeoutException, Exception {

HttpClient client = null;

HttpPost post = new HttpPost(url);

String result = “”;

try {

if (StringUtils.isNotBlank(body)) {

HttpEntity entity = new StringEntity(body, ContentType.create(mimeType, charset));

post.setEntity(entity);

}

// 设置参数

RequestConfig.Builder customReqConf = RequestConfig.custom();

if (connTimeout != null) {

customReqConf.setConnectTimeout(connTimeout);

}

if (readTimeout != null) {

customReqConf.setSocketTimeout(readTimeout);

}

post.setConfig(customReqConf.build());

HttpResponse res;

if (url.startsWith(“https”)) {

// 执行 Https 请求.

client = createSSLInsecureClient();

res = client.execute(post);

} else {

// 执行 Http 请求.

client = HttpClientUtils.client;

res = client.execute(post);

}

result = IOUtils.toString(res.getEntity().getContent(), charset);

} finally {

post.releaseConnection();

if (url.startsWith(“https”) && client != null&& client instanceof CloseableHttpClient) {

((CloseableHttpClient) client).close();

}

}

return result;

}

/**

  • 提交form表单

  • @param url

  • @param params

  • @param connTimeout

  • @param readTimeout

  • @return

  • @throws ConnectTimeoutException

  • @throws SocketTimeoutException

  • @throws Exception

*/

public static String postForm(String url, Map<String, String> params, Map<String, String> headers, Integer connTimeout,Integer readTimeout) throws ConnectTimeoutException,

SocketTimeoutException, Exception {

HttpClient client = null;

HttpPost post = new HttpPost(url);

try {

if (params != null && !params.isEmpty()) {

List formParams = new ArrayList();

Set<Entry<String, String>> entrySet = params.entrySet();
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

整理面试题,不是让大家去只刷面试题,而是熟悉目前实际面试中常见的考察方式和知识点,做到心中有数,也可以用来自查及完善知识体系。

《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》PDF完整版点击这里领取

前端面试题宝典

前端校招面试题详解

厂,18年进入阿里一直到现在。**

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-yNBvf20e-1712753295239)]

[外链图片转存中…(img-lfFoi9hk-1712753295240)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

[外链图片转存中…(img-JgQBeJi6-1712753295240)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

整理面试题,不是让大家去只刷面试题,而是熟悉目前实际面试中常见的考察方式和知识点,做到心中有数,也可以用来自查及完善知识体系。

《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》PDF完整版点击这里领取

[外链图片转存中…(img-Jgtn1DyS-1712753295240)]

[外链图片转存中…(img-wveEMlwF-1712753295241)]

[外链图片转存中…(img-nuLrcOnB-1712753295241)]

  • 17
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值