现如今使用微信的人越来越多,很多网站都实现了让用户直接扫码就能登录网站,正是这种方式给用户带来了极多的好处,最重要的是用户不用担心自己总记不住账户密码,从而登录不了网站。

为了方便用户登录,我也想接入微信扫码登录。但因为微信开发者需要企业认证,所以没办法接入个人网站实现微信扫码登录。最近我发现了一个小程序“码上登录”,对个人开发者提供了免费的微信扫一扫登录入口,其实就是一个桥接入口,为我们去获取用户扫码之后的信息,从而在发给我们,我们接收再返回信息即可。

好了,撸起袖子直接干吧!

准备工作

在码上登录注册,然后创建自己的应用并指定回调地址,会生成一个secretKey,后面获取二维码链接用得到

微信登录时序图

首先我们向码上登录的服务器发送请求获取二维码信息,然后用户扫码,用户跳转到登录的小程序,用户点击登录,授权,码上登录服务器向自己的服务器回调入口返回数据,然后我们返回登录状态信息。

后台开发

向码上登录服务器发送请求,返回二维码数据信息

secretKey(即我们创建应用时生成的secretKey)调用码上登录服务器时候需要进行验证的凭据
@FeignClient(name = "wx", url = "https://server01.vicy.cn")
public interface UserFeignClient {/*** 向码上登录服务器请求二维码*/@GetMapping(value = "/8lXdSX7FSMykbl9nFDWESdc6zfouSAEz/wxLogin/tempUserId")String getQrCode(@RequestParam(required = true, value = "secretKey") String secretKey);}

@FeignClient标签的常用属性如下:

  • name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
  • url: url一般用于调试,可以手动指定@FeignClient调用的地址
  • decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
  • configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
  • fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
  • fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码
  • path: 定义当前FeignClient的统一前缀

发送请求

获取登录二维码信息

@Value(value = "${justAuth.clientSecret.wechat}")
private String wechatClientSecret;@ApiOperation(value = "获取码上登录微信二维码链接", notes = "获取码上登录微信二维码链接")@GetMapping("/getWechatQrCodeReturnUrl")public String getWechatQrCodeReturnUrl () {// 将传递过来的转换成大写String source = SysConf.WECHAT;Boolean isOpenLoginType = webConfigService.isOpenLoginType(source.toUpperCase());if (!isOpenLoginType) {return ResultUtil.result(SysConf.ERROR, "后台未开启该登录方式!");}return ResultUtil.result(SysConf.SUCCESS,userService.getWechatQrCodeReturnUrl(wechatClientSecret));}

实现类


@Service
public class UserServiceImpl implements UserService {@Resourceprivate UserFeignClient userFeignClient;@Overridepublic String getWechatQrCodeReturnUrl(String wechatClientSecret) {String result = userFeignClient.getQrCode(wechatClientSecret);return result;}
}

返回数据

{"errcode":0,"data":{"qrCodeReturnUrl":"http://login.vicy.cn?tempUserId=18d55e78f66848e781bc7ce65a1fe5b4",
"tempUserId":"18d55e78f66848e781bc7ce65a1fe5b4"},"message":"成功"}

errcode:错误码

message:描述信息

data:存放二维码信息集合

tempUserId:登录会话临时凭证

qrCodeReturnUrl:发送给前端用于生成二维码

回调地址

@ApiOperation(value = "码上登录回调地址", notes = "码上登录回调地址")@PostMapping(value = "/callback")public JSONObject backUserScanedInfo(@RequestParam(value = "userId",required = false)  String userId,@RequestParam(value = "tempUserId",required = false) String tempUserId,@RequestParam(value = "nickname",required = false) String nickname,@RequestParam(value = "avatar",required = false) String avatar,@RequestParam(value = "ipAddr",required = false) String ipAddr,HttpServletResponse httpServletResponse) throws IOException {log.info("用户信息============\r\n"+ "【userId】"+userId+ " 【tempUserId】 "+tempUserId+ " 【nickname】 "+nickname+ " 【headimgurl】 "+avatar+ " 【ipAddr】"+ipAddr);// TODO 写自己的逻辑 保存用户或更新用户信息到数据库// 返回状态码JSONObject jsonObject = new JSONObject();if (userId != null){jsonObject.put("errcode",0);jsonObject.put("message","success");}else {jsonObject.put("errcode",1);jsonObject.put("message","error");}return jsonObject;}

前端实现

<template><div><div v-if="showPasswordLogin == false" style="text-align: center" class="block"><el-image :src="qrcode" style="width: 250px;" id="qrcode" ref="qrCodeUrl"><div slot="error" class="image-slot" @click="getWechatQrCodeReturnUrl"><i class="el-icon-refresh" style="height: 250px; line-height: 250px; cursor: pointer">点击刷新</i></div></el-image></div></div>
</template><script>
import {getWechatQrCodeReturnUrl} from '@/api/user'
import QRCode from "qrcode";
export default {name: 'share',data () {return {url: "http://www.baidu.com",  //识别二维码后跳转的地址qrcode:'' //存储二维码地址}},components: {},created () {},methods: {// 获取码上登录返回的数据生成二维码getWechatQrCodeReturnUrl: function () {let that = thisgetWechatQrCodeReturnUrl().then(response => {// eslint-disable-next-line eqeqeqif (response.code == this.$ECode.SUCCESS) {this.showPasswordLogin = falselet dataz = JSON.parse(response.data);this.url = dataz.data.qrCodeReturnUrlQRCode.toDataURL(this.url,{version: 7,errorCorrectionLevel: 'Q',width: 280,height: 280,margin: 0,}).then(url => {// console.log(url);this.qrcode = url}).catch(err => {// console.error(err)})this.tempUserId = dataz.data.tempUserIdlet count = 0let interval = setInterval(() => {count++if (count > 5) {this.qrcode = ''clearInterval(interval)}let params = new URLSearchParams()params.append('ticket', this.tempUserId)getUserLoginStatus(params).then(response => {console.log('获取用户登录状态', response)if (response.code == that.$ECode.SUCCESS) {let token = this.tempUserIdif (token != undefined) {setCookie('token', token, 7)}this.setUserInfo(response.data)this.setLoginState(true)// location.reload()// 跳转到首页location.replace(this.vueXqCodingWebUrl + '/#/?token=' + token)//window.location.reload()}})}, 3000)} else {this.$message.error(response.message)}})}}
}
</script>

效果

使用码上登录实现微信扫码登录相关推荐

  1. 网站上做企业微信扫码授权登录怎么做?(超详细教程)

    企业微信已经搞了这一套完整的教程! https://developer.work.weixin.qq.com/tutorial/detail/56 第1步:企业微信自建应用 第2步:浏览企业微信开发文 ...

  2. 第三方登录之微信扫码登录

    文章目录 1. 申请微信接入: 2. 项目环境搭建: 3.后端Controller接口: 4.HTML页面代码: 5.测试结果: 6.补充说明: 小伙伴们有各种疑问可以去参考官方文档进行详细的学习下 ...

  3. 资产管理二维码应用方案:微信扫码实现一物一码管理

    固定资产管理的重要性不言而喻,涉及资产分类.采购管理.使用管理.维修管理.资产处置等多个环节.不仅可以帮助企业实现固定资产的最佳利用,也有利于延长固定资产的使用寿命,保护企业的资产安全. 但在固定资产 ...

  4. 微信扫码支付demo java_微信扫码支付JavaDemo

    [实例简介] 完全可用的微信扫码支付JavaDemo,如不能使用请站内联系本人 [实例截图] [核心代码] weChatpay_demo └── weChatpay_demo ├── src │   ...

  5. 微信扫码html,CSS实现微信扫码特效

    微信扫码效果如下所示: 下面是实际效果:(可以自己移动鼠标,尝试效果) (由于篇幅长度,没有加兼容性前缀,演示环境为谷歌浏览器.) 现在就一个一个效果单独演示: 演示demo的HTML内容为: 复制代 ...

  6. 开通微信扫码支付,申请微信扫码支付怎么用

    微信扫码支付是在网页里, 生成一个支付二维码, 让用户用微信扫码支付二维码付款的一种方式. 微信扫码支付是PC电脑端, 用户非常方便的一种方式, 如果你的电脑h5网站想要, 让用户在线付款购买你的产品 ...

  7. 整合第三方登录之微信扫码登录

    文章目录 前言 一.引入相关依赖 二.操作步骤 1.生成微信登录二维码 2.获取微信用户信息并实现微信注册登录 总结 前言 前置条件:具备微信开发者资质. 通过微信开放平台注册.完善开发者资料.申请开 ...

  8. Spring学习笔记(二十三)——实现网站微信扫码登录获取微信用户信息Demo

    目录 微信扫码登录介绍 开发步骤 微信扫码登录示例 微信开放文档 遇到的问题 使用第三方工具实现网站微信扫码登录 开发前介绍 开发步骤 微信扫码登录获取微信用户信息Demo实现流程 实现效果 实现过程 ...

  9. Web应用多账号系统设计及微信扫码登录实现

    https://www.cnblogs.com/beer/p/5538403.html 1 前言概述 公司对功能测试,性能测试,安全测试等等都做了比较好的自动化后,急需要一个MIS系统来统一管理这些结 ...

最新文章

  1. Docker了解(官方解读)
  2. android仿微信的activity平滑水平切换动画,Android实现简单底部导航栏 Android仿微信滑动切换效果...
  3. IOS 远程测试方案
  4. ARM(IMX6U)裸机模仿STM32驱动开发实验(定义外设结构体)
  5. FCOS: A Simple and Strong Anchor-free Object Detector
  6. 微擎 php开发手册,目录结构
  7. 555定时器的应用——施密特触发器
  8. 五分钟快速了解EM算法
  9. 浪潮之巅阅读笔记02
  10. linux手机拍照翻译软件,拍图识字翻译软件-拍图识字翻译app下载v1.1.3-Linux公社
  11. 网址导航7654推广
  12. 张亚勤寄语哥伦比亚大学2020年毕业生:引领未知时代
  13. oppo便签误删怎么办_oppo手机便签误删怎么办?oppo便签如何导入新手机
  14. 搞笑的chitgpt
  15. 国产开源「文本-视频生成」模型!免费在线体验,一键实现视频生成自由
  16. win10禁用全角,教你恢复win10系统屏蔽全角/半角快捷键的办法
  17. 3.2 语音和语言处理简史
  18. byte buddy学习笔记
  19. android:关于Handle
  20. 【学习笔记】| 集合泛型

热门文章

  1. 蓝懿ios网络请求bock
  2. 学好简笔画,再学思维导图
  3. 电路图:LM3886低音炮电路
  4. 线性子空间模型 linear subspace model
  5. java下拉框怎么做_java下拉框怎么做?
  6. 用Qemu搭建x86学习环境
  7. 北京理工大学 计算机考研真题,北京理工大学考研真题汇总
  8. html播放rtsp低延时(局域网测试500ms左右)
  9. mysql 备份 恢复
  10. 【基础编程题目集编程题及其答案】