java 扫描微信公众号二维码,关注并登录逻辑

场景:户扫描微信公众号的二维码,关注后自动登录网站,若已关注则直接登录。

逻辑:

  1. 系统生成带参数的临时二维码:参数 scene_str 自定义为唯一值(可以是uuid),临时二维码的生成方式参照官方接口的开发文档
  2. 用户使用微信扫描该二维码,关注后微信服务器会将关注事件的响应数据返回给我们的应用服务器:微信通过我们在公众号配置的“服务器地址(URL)”,将响应数据返回给我们的应用服务器,响应数据包括 参数 scene_str 和 openid
  3. 应用服务器将接收到的openid再次向微信服务器发起请求,获取该用户的信息(昵称、头像、地域、unionid(若绑定了微信开放平台,则有此参数))
  4. 将返回的信息存储到数据库,用于登录:特别是 scene_str 也要记录,因为需要根据这个唯一值来判断当前是谁在扫描关注并登录

准备工作:登录微信公众号平台,在基本配置下获取 AppID,AppSecret,“服务器地址(URL)”即“回调函数”,令牌Token。如下图:

  

 

 本人用的开发框架是 springboot,代码如下:

  1. 后台代码:
    • HttpClientKit.java:封装https请求,调用微信接口
      package com.ht.website.utils;
      
      import java.io.BufferedReader;
      import java.io.InputStream;
      import java.io.InputStreamReader;
      import java.io.OutputStream;
      import java.net.URL;
      import java.security.cert.CertificateException;
      import java.security.cert.X509Certificate;
      
      import javax.net.ssl.HttpsURLConnection;
      import javax.net.ssl.SSLContext;
      import javax.net.ssl.SSLSocketFactory;
      import javax.net.ssl.TrustManager;
      import javax.net.ssl.X509TrustManager;
      
      import com.alibaba.fastjson.JSONObject;
      
      public class HttpClientKit {
      
          /**
           * https请求信任管理器
           * @author Timely-03
           */
          private static class TrustAnyTrustManager implements X509TrustManager {
              
              public X509Certificate[] getAcceptedIssuers() {
                  return null;  
              }
              
              public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                  
              }
              
              public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                  
              }
          }
          
          /**
           * 发送https请求
           */
          private static JSONObject https(String requestUrl, String requestMethod, String submitData) {
              HttpsURLConnection httpsURLCon = null;
              
              try {
                  // 设置https访问模式,采用SSL加密
                  TrustManager[] tm = { new TrustAnyTrustManager() };
                  
                  // 创建SSLContext对象,并使用我们指定的信任管理器初始化
                  SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
                  sslContext.init(null, tm, new java.security.SecureRandom());
                  
                  // 从sslContext获取SSLSocketFactory
                  SSLSocketFactory ssf = sslContext.getSocketFactory();
                  URL url = new URL(requestUrl);
                  httpsURLCon = (HttpsURLConnection) url.openConnection();
                  httpsURLCon.setSSLSocketFactory(ssf);
                  httpsURLCon.setDoInput(true);
                  httpsURLCon.setDoOutput(true);
                  httpsURLCon.setUseCaches(false);
                  httpsURLCon.setRequestMethod(requestMethod);// 设置请求方式get;post
                  
                  if ("GET".equalsIgnoreCase(requestMethod)) {
                      httpsURLCon.connect();
                  }
                  
                  // 当需要有数据提交给微信接口时
                  if (submitData != null) {
                      OutputStream outputStream = httpsURLCon.getOutputStream();
                      outputStream.write(submitData.getBytes(WSConst.ENCODE_UTF_8));
                      outputStream.close();
                  }
                  
                  // 从输入流读取返回内容
                  InputStream inputStream = httpsURLCon.getInputStream();
                  InputStreamReader inputStreamReader = new InputStreamReader(inputStream, WSConst.ENCODE_UTF_8);
                  BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                  String str = null;
                  StringBuffer buffer = new StringBuffer();
                  while ((str = bufferedReader.readLine()) != null) {
                      buffer.append(str);
                  }
       
                  // 释放资源
                  bufferedReader.close();
                  inputStreamReader.close();
                  inputStream.close();
                  inputStream = null;
                  httpsURLCon.disconnect();
       
                  return JSONObject.parseObject(buffer.toString());
                  
              } catch (Exception e) {
                  throw new RuntimeException(e);
              } finally {
                  if (httpsURLCon != null) {
                      httpsURLCon.disconnect();
                  }
              }
          }
          
          /**
           * 发送https请求,请求方法:POST
           * @param requestUrl 请求地址,比如:https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token=
           * @param submitData 提交参数
           * @return 返回请求结果字符串
           */
          public static JSONObject httpsPost(String requestUrl, String submitData) {
              return https(requestUrl, "POST", submitData);
          }
          
          /**
           * 发送https请求,请求方法:GET
           * @param requestUrl 请求地址,比如:https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token=
           * @param submitData 提交参数
           * @return 返回请求结果字符串
           */
          public static JSONObject httpsGet(String requestUrl, String submitData) {
              return https(requestUrl, "GET", submitData);
          }
          
      }
      View Code
    • application.properties:配置微信appid,appSecret
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java实现微信公众号关注登录可以通过调用微信开放平台的接口来实现。首先,需要在微信开放平台注册一个开发者账号,并创建一个应用。然后,使用Java开发框架可以通过发送HTTP请求来调用微信开放平台的接口。 在用户登录微信公众号时,首先需要引导用户点击关注按钮,跳转至微信登录授权页面。用户在页面中输入微信账号和密码,进行登录确认。然后根据微信开放平台提供的接口,获取用户的基本信息。Java中可以使用HttpClient或OkHttp等库来发送HTTP请求,获取用户登录的授权凭证access_token。 接下来,通过获取到的access_token,可以调用微信开放平台的接口来获取用户的详细信息,如用户名、头像等。具体调用的接口可以根据微信开放平台的文档进行选择和调用。 最后,将获取到的用户信息保存到数据库中,以便后续使用。在用户再次登录时,可以根据用户的微信账号来查询数据库中是否已存在该用户的信息,若存在则进行登录操作,若不存在则要求用户重新关注并进行登录授权。 总体来说,Java实现微信公众号关注登录需要通过调用微信开放平台的接口来获取用户的授权凭证和详细信息,并将信息保存至数据库。在用户登录时,需要检查用户是否已关注并进行相应的登陆授权操作。这样,就可以实现Java微信公众号关注登录的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值