首页 > 其他分享 >聊聊公众号联动扫码登录功能如何实现

聊聊公众号联动扫码登录功能如何实现

时间:2024-11-01 12:21:15浏览次数:2  
标签:扫码 聊聊 登录 微信 用户 二维码 联动 String

大家好,我是 V哥。扫码登录是个很普遍的功能,通过与公众号联动实现扫码登录功能,要怎么做呢,V 哥整理了以下步骤和代码,供你参考。这里假设你已经有一个Java后端应用,并且微信开发者平台的配置也已经完成。(相信你可以根据微信开放平台的操作进行)整个流程包括二维码生成、扫码后获取微信用户信息、并将用户登录状态返回到你的应用中。

1. 微信公众号扫码登录流程

  1. 申请扫码登录权限:在微信开放平台申请扫码登录权限。
  2. 生成二维码:使用微信提供的接口生成一个包含应用授权信息的二维码。
  3. 用户扫码授权:用户扫描二维码,授权登录。
  4. 获取授权码:用户授权后,微信会回调给开发者一个授权码。
  5. 获取用户信息:使用授权码获取用户的基本信息(如昵称、头像等)。
  6. 建立会话:将用户信息与系统的会话绑定,完成登录流程。

2. 前置准备

确保你在微信开放平台上配置了以下信息:

  • AppID 和 AppSecret:在“公众号设置”页面可以找到。
  • 授权回调域名:在开放平台进行授权配置。

3. Java 实现扫码登录

使用Spring Boot实现一个简单的微信扫码登录后端接口:

导入依赖

pom.xml 中添加必要的依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

代码实现

  1. 配置微信相关信息
   @Configuration
   public class WeChatConfig {
       @Value("${wechat.appId}")
       private String appId;
       
       @Value("${wechat.appSecret}")
       private String appSecret;
       
       @Value("${wechat.redirectUri}")
       private String redirectUri;
       
       public String getAppId() {
           return appId;
       }

       public String getAppSecret() {
           return appSecret;
       }

       public String getRedirectUri() {
           return redirectUri;
       }
   }
  1. 生成二维码

    创建一个控制器来生成微信扫码二维码URL。

   @RestController
   @RequestMapping("/api/wechat")
   public class WeChatLoginController {
       @Autowired
       private WeChatConfig weChatConfig;

       @GetMapping("/login/qrcode")
       public ResponseEntity<String> getQRCode() {
           String url = "https://open.weixin.qq.com/connect/qrconnect" +
                   "?appid=" + weChatConfig.getAppId() +
                   "&redirect_uri=" + URLEncoder.encode(weChatConfig.getRedirectUri(), StandardCharsets.UTF_8) +
                   "&response_type=code" +
                   "&scope=snsapi_login" +
                   "&state=STATE#wechat_redirect";
           return ResponseEntity.ok(url);
       }
   }

通过此接口可以生成微信扫码登录的二维码URL。

  1. 回调接口

    微信扫码后会将用户重定向到配置的回调URL,在回调中处理授权码并获取用户信息。

   @GetMapping("/callback")
   public ResponseEntity<String> weChatCallback(@RequestParam("code") String code) {
       String accessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + weChatConfig.getAppId() +
               "&secret=" + weChatConfig.getAppSecret() +
               "&code=" + code +
               "&grant_type=authorization_code";

       RestTemplate restTemplate = new RestTemplate();
       String response = restTemplate.getForObject(accessTokenUrl, String.class);

       JSONObject json = new JSONObject(response);
       String accessToken = json.getString("access_token");
       String openId = json.getString("openid");

       // 获取用户信息
       String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId;
       String userInfoResponse = restTemplate.getForObject(userInfoUrl, String.class);

       // 返回或保存用户信息
       return ResponseEntity.ok(userInfoResponse);
   }
  1. 会话管理与重定向

    在获取到用户信息后,可以将用户数据存入Redis(或数据库),并生成一个登录态。

   @Autowired
   private RedisTemplate<String, Object> redisTemplate;

   @PostMapping("/saveSession")
   public ResponseEntity<String> saveSession(@RequestBody Map<String, String> userInfo) {
       String sessionId = UUID.randomUUID().toString();
       redisTemplate.opsForValue().set(sessionId, userInfo);

       // 返回Session ID作为登录凭证
       return ResponseEntity.ok(sessionId);
   }

4. 前端处理

在前端页面中调用 /api/wechat/login/qrcode 接口,将二维码显示给用户。当用户扫码并完成授权后,前端可以获取后端传回的Session ID,表示登录成功。

完整流程小结

  1. 访问后端接口生成二维码链接。
  2. 前端显示二维码,用户扫码后进入微信授权页面。
  3. 授权成功后,微信重定向至后端的 /callback
  4. 后端使用 code 获取用户信息,并保存会话信息(如Redis)。
  5. 返回前端Session ID作为登录凭证。

使用以上代码和步骤可以实现完整的微信公众号扫码登录流程,前端就可以使用得到的Session ID来维护用户登录状态啦。

由于演示案例涉及自己的账号信息和微信开放平台的私密信息,请根据自己的情况使用代码案例,下课。

标签:扫码,聊聊,登录,微信,用户,二维码,联动,String
From: https://www.cnblogs.com/wgjava/p/18515479

相关文章

  • 记一次“网络安全扫描工具联动”自动化扫描漏洞流程,网络渗透必看基础教程!
    大家好,我是向阳假如你在一次攻防演练或者渗透测试中有多个攻击测试目标,一个一个去手动测试是肯定不现实的,可以先借助安全扫描工具去“自动扫描测试目标站点”的薄弱漏洞的位置,为你后续的深入测试提供事半功倍的效果。前言:随着当前网络安全威胁的不断扩展与升级,开展渗透测......
  • 高校联动,创新无限!“2024 深圳国际金融科技大赛”校园行活动圆满结束
    在金融科技蓬勃发展的当下,人才培养成为推动行业前行的关键。为推进深圳市金融科技人才高地建设,向高校学子提供一个展示自身知识、能力和创意的平台,2024FinTechathon深圳国际金融科技大赛——西丽湖金融科技大学生挑战赛重磅开启,并精心筹备了一系列精彩活动。自报名启动后,大......
  • 聊聊spring项目如何根据事件条件进行事件分发
    前言spring的事件驱动模型,想必大家都比较熟,今天就来水一期,如何使用事件条件来进行事件触发。直接上示例正文注:本示例主要模拟当用户注册,发送阿里云短信,模拟下单,发送腾讯云短信,模拟发送短信的逻辑,下放到事件监听里面做1、模拟创建阿里云短信publicclassAliyunSmsService......
  • dedeCMS 自定义表单地区联动类型不可用
    问题:自定义表单地区联动类型不可用。解决办法:打开 /dede/templets/diy_field_edit.htm 文件,找到:<optionvalue="stepselect">联动类型</option-->修改为:<!--><optionvalue="stepselect">联动类型</option>打开 /dede/templets/diy_field_......
  • uni-app 扫码插件推荐:基于支付宝 mPaaS 扫码组件开发,支持 Android 和 iOS
    一.前言之前说到,我的一个uni-app项目遭到用户吐槽:“你们这个App扫码的正确率太低了,尤其是安卓的设备。经常性的扫码扫不出来,就算是扫出来了,也是错误的结果!”面对以上这个问题,我在当时的项目是使用了一个基于安卓原生zxing扫码插件实现的,虽然扫码效率可观,但是它也有一......
  • uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝扫码支付/收付款
    uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝扫码支付/收付款等功能,界面漂亮颜值高,视频商城小工具等,蚂蚁森林种树养鸡农场偷菜样样齐用于视频,商城,直播,聊天等sumer-alipay介绍uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝......
  • 聊聊gitlab免费版和收费版本有哪些区别
    GitLab,一款受欢迎的代码托管和持续集成工具,有多个版本,包括免费版(GitLabCommunityEdition)和多种收费版本(GitLabEnterpriseEdition)。这些版本主要有以下不同:1、功能上的差异;2、性能与可扩展性;3、专业支持;4、集成与API;5、定价与许可;6、安全性与合规性;7、更新与维护。1、功能......
  • vue - 菜单栏联动选项卡
    在vue环境下,制作一个与菜单联动的选项卡(el-tabs)。能看到这个文章,大体是有自己动手的打算了,这里给一下关键思路。关键点路由的设计传统的选项卡设计,一般通过iframe实现,在vue环境中,则是使用router-view。问题是,一个界面上,同时存在多个router-view(如果不做标记),内容是完......
  • 聊聊性能测试中的性能调优的效益
    目录一、提升用户体验。二、提升业务稳定性。三、提升系统稳定性。人力成本。公关成本。硬件成本。运维成本。四、提升资源利用率,节省硬件资源。性能调优为企业带来的收益是显而易见的,包括但不限于如下几个层面。一、提升用户体验。性能调优可以通过降低响应时间......