个人网站实现微信扫码登录

体验

我的网站

我的小程序

前期准备

个人网站

个人小程序

概述

自己搞了个人网站和小程序之后,发现各种各样的限制真的好多;最近做了一个小程序,给它配一个PC网站,就遇上了各种各样的问题,废话就不多说,先看思维导图。

整体流程

实现逻辑核心思想

核心是用户扫小程序一个页面的二维码,来通知网站用户已在微信小程序登录。

具体步骤

1.用户打开网站的的登录页面时,前端页面通过生成一个随机码(这个随机码是串联整个登录流程的信息),请求访问后端服务

这里的scene就是随机码,url为图片展示地址

scene = decodeURIComponent(Date.now());
url.value = `${servUrl}/login/qrcode?scene=${scene}`;

2.后端服务缓存随机码,用作记录这次登录的情况,带着随机码调用微信服务getUnlimitedQRCode接口,获取二维码图片流

注意,这里涉及到access_token这个参数,这是调用微信服务的凭据,每获取一次的默认生效时间是7200秒,获取access_token需要用到个人小程序的appId和secret,这些调用微信服务接口的实现,没放在前端的原因就是会暴露个人小程序的appId和secret

HashMap<String, Object> params = new HashMap<>();
params.put("scene", scene);
params.put("env_version", wechatConfig.getEnv());
params.put("check_path", false);
params.put("page", "pages/login/login");
InputStream inputStream = RestTemplateUtil.sendPostByJson(wechatConfig.getQrCodeUrl()+"?access_token="+token, params, InputStream.class);

response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=\""+ IdUtil.getSnowflakeNextIdStr() +".png\"");
try {
	IoUtil.copy(inputStream, response.getOutputStream());
} catch (IOException e) {
	throw new BizException();
}finally {
	IoUtil.close(inputStream);
}

3.前端加载完成返回的图片,立刻开始轮询登录状态,如登录成功,立刻完成登录

前端:

if(res.isFinish && res.state == 'SUCCESS'){
	setToken(res.token)
	loginFinish = true;
	setCookie("user", res.user)
	store.commit("login", res.user)
	messageSucc("登录成功")
}if(res.isFinish && res.state == 'CANCEL'){
	qrcodeExpire.value = true;
}else{
	if(!loginFinish){
		setTimeout(() => handleLoadLoginState(), 1000);
	}
}

后端:

String userId = WechatLoginCache.getScene(scene);
if(userId == null){
	return new LoginState().setIsFinish(true).setState(WechatQrCodeLoginState.CANCEL);
}
if(WechatLoginCache.CACHE_INIT_VALUE.equals(userId)){
	return new WechatQrCodeLoginStateVo().setIsFinish(false).setState(WechatQrCodeLoginState.LOGGING);
}
User user = userGateway.findOne(userId);
return new LoginState()
		.setIsFinish(true)
		.setState(WechatQrCodeLoginState.SUCCESS)
		.setToken(LoginRegisterUtils.buildLoginVo(user).getToken())
		.setUser(UserBuilder.toVo(user));

4.用户通过返回来的二维码扫码,就会带着随机码scene访问到小程序的页面(pages/login/login),在小程序就可以获取到微信用户的唯一ID,完成登录操作

前端

onLoad(options) {
	scene = options.scene;
	wx.login({
		success: (res) => {
			wechatLogin({ code }).then(res2 => {
				const { token, user } = res2.data;
				wx.setStorageSync('token', token)
				wx.setStorageSync('user', user)
				wx.switchTab({
					url: '/pages/home/home',
				})
				updateWechatLogin({scene, userId: user.id, state:'SUCCESS'});
			})
		}
	})
}

后端

WechatQrCodeLoginState state = param.getState();
if(state == WechatQrCodeLoginState.FAIL || state == WechatQrCodeLoginState.CANCEL){
	WechatLoginCache.removeScene(scene);
	return;
}

if(state == WechatQrCodeLoginState.SUCCESS){
	WechatLoginCache.updateScene(scene, param.getUserId());
}

5.到此,整个实现逻辑已完成,感谢完成阅读

以上参考的内容来自《个人网站实现微信扫码登录

微信服务的接口文档信息请点击这里

在此抛转引玉,有不对的地方请大家指出,共同讨论、进步。

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue企业微信扫码登录是一种在Vue框架下实现的方式,用于实现用户通过扫描企业微信二维码进行系统登录的需求。在实现这个需求时,需要解决两个关键技术问题。首先是如何在网页端生成企业微信的二维码,其次是用户扫码完成后如何确定是哪个用户扫描的二维码,或者如何将这个信息告知后端。下面我将一步步为您解释如何实现这个需求。 首先,生成企业微信的二维码可以通过构造扫码登录链接来实现。在企业微信扫码登录流程中,有两种方法可以构造扫码登录链接:一种是构造独立窗口登录二维码,另一种是内嵌登录二维码。根据您的需求,内嵌登录二维码更符合要求。 其次,为了确定是哪个用户扫描的二维码,或者将这个信息告知后端,需要进行企业微信后台管理平台的配置。您可以登录企业微信后台管理平台,通过扫描企业微信二维码进入管理平台。请注意,只有企业的管理员角色才能登录进入管理平台。如果您没有权限,可以请管理员帮助您赋予权限。如果没有企业或者想先进行测试,您可以在企业微信的app端上以个人为主体创建一个企业组织。 通过以上步骤,您就可以在Vue框架下实现企业微信扫码登录的需求了。希望对您有所帮助。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [Vue 实现企业微信扫码登录](https://blog.csdn.net/weixin_36894745/article/details/106125761)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [vue实现网页端企业微信扫码登录功能(前端部分)](https://blog.csdn.net/weixin_38611617/article/details/128643445)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值