微信扫码登陆(JAVA)

  在web端用到weChat扫码登录,在手机扫码登陆成功后,跳转到相应的界面。

1、第一步请求code

  调用接口:https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect;

  参数信息说明:

参数 是否必须 说明
appid 应用唯一标识
redirect_uri 请使用urlEncode对链接进行处理
response_type 填code
scope 应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即
state 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验

前端代码信息如下(通过后台controller层返回url,来显示二维码):

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>微信扫码登录</title>    <script type="text/javascript" src="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>    <script type="text/javascript">        $().ready(function() {          $.ajax({             url: "${base}/weChat",              type: "post",              dataType: "json",              success: function(data) {                var div = document.getElementById("login_container");                 div.innerHTML = "";                 var iframe = document.createElement("iframe");                 var url = data.url;                 var redirect_uri = data.redirect_uri;                 var code = url+encodeURIComponent(redirect_uri);                 iframe.setAttribute("src",code);                 iframe.style.width = "100%";                 iframe.style.height = "100%";                 div.appendChild(iframe);        }      });    });    </script></head><body>  <!--内容-->  <div class="content">    <div id="login_container" class="login_container"></div>  </div></body></html>

  后台代码(controller层获取code的url信息)

    /**
     * 微信扫码登录二维码显示
     */
    @PostMapping("/weChat")
    public ResponseEntity weChat(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<>(5);
        String state = DigestUtils.md5Hex(UUID.randomUUID() + RandomStringUtils.randomAlphabetic(30));
        request.getSession().setAttribute(STATE_ATTRIBUTE_NAME, state);
        String redirect_uri = "http://hbbdjw.nat300.top/social_user_login/get_sign_in_weixinQrCodeLoginPlugin";//红色部分改为自己的redirect_url,蓝色部分改为自己的扫码后需要跳转的页面
        String url = "https://open.weixin.qq.com/connect/qrconnect?appid=【自己的appid】&scope=snsapi_login&response_type=code&state=" + state + "&redirect_uri=";
        map.put("url", url);
        map.put("redirect_uri", redirect_uri);
        return ResponseEntity.ok(map);
    }

2、第二步:通过code获取access_token

  登陆后处理(判断access_token是否为null,不为空,则验证成功,否则失败)

  /**
     * 登录后处理
     */
    @GetMapping({"/get_sign_in_weixinQrCodeLoginPlugin"})
    public ModelAndView getSignin(@PathVariable String loginPluginId, @PathVariable(required = false) String extra, HttpServletRequest request, HttpServletResponse response, ModelMap model, RedirectAttributes redirectAttributes) throws Exception {
     String getTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=【自己的appid】&secret=【自己的secret】&code=" + code + "&grant_type=authorization_code";     // 获取网页授权凭证     JSONObject jsonObject = JSONObject.fromObject(HttpUtil.Get(getTokenUrl));//get方法是自己写的     if (jsonObject != null) {       String openId = jsonObject.getString("access_token");       String accessToken = jsonObject.getString("openid");       String uniqueId = jsonObject.getString("openid");     }        SocialUser socialUser = socialUserService.find(uniqueId); //从数据库中查找用户,if (socialUser != null) {            //当数据库中不存在该user的时候,事件处理        } else {           //当数据库中存在该user的时候,事件处理(一般情况下新建user信息数据在数据库)        }return modelAndView;    }

  GET请求方法

  /**
      * 向指定URL发送GET方法的请求
      *
      * @param url   发送请求的URL
      * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
      * @return URL 所代表远程资源的响应结果
      */
     public static String Get(String url) {
         int connectionTimeOut=HTTP_CONNECTION_TIMEOUT,  readTimeOut =HTTP_READ_TIMEOUT;
         String result = "";
         BufferedReader in = null;
         String urlNameString = url;
         try {
             logger.info("请求url+参数:" + urlNameString);
             URL realUrl = new URL(urlNameString);
             // 打开和URL之间的连接
             URLConnection connection = realUrl.openConnection();
             // 设置通用的请求属性
             connection.setRequestProperty("accept", "*/*");
             connection.setRequestProperty("connection", "Keep-Alive");
             connection.setConnectTimeout(connectionTimeOut);
             connection.setReadTimeout(readTimeOut);
             // 建立实际的连接
             connection.connect();
             // 获取所有响应头字段
             // 定义 BufferedReader输入流来读取URL的响应
             in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
             String line;
             while ((line = in.readLine()) != null) {
                 result += line;
             }
         } catch (Exception e) {
             logger.error("发送GET请求出现异常!url: " + urlNameString + ", " + e);
         }
         // 使用finally块来关闭输入流
         finally {
             try {
                 if (in != null) {
                     in.close();
                 }
             } catch (Exception e2) {
                 logger.error("close exception", e2);
             }
         }
         return result;
     }

到此结束。

原文地址:https://www.cnblogs.com/g-smile/p/9096493.html

时间: 2024-11-02 02:47:00

微信扫码登陆(JAVA)的相关文章

微信扫码登录asp微信扫码登陆代码

网站接入微信扫码登录并获取用户基本信息(完美绕过微信开放平台) 电脑版网站实现微信扫码登录,注册会员还要设密码太麻烦,会员也记不住密码,采用微信扫码登录网站更方便,会员无需设密码,用他的微信做为系统登录用户名,全程自动操作更方便.源码是用asp写的,mdb的数据库,微信扫描电脑网页上的二维码实现登录. 只需要用微信扫一下二维码,这个网站就可以展示你的微信昵称和头像,免去注册账号和输入密码登录的步骤,还免去设置头像和昵称的步骤,所以是挺方便的.我这个asp写好的代码和微信开放平台不同,微信开放平台

网页版微信和微信公共号扫码登陆原理分析

看到知乎上有关于微信扫码登陆原理的讨论.现将自己的分析结果写出来,供大家参考,不正确的地方望指正. 用户打开网页版微信: https://wx.qq.com/,微信为用户生成了一张包含uuid的二维码,然后前台向后台发送轮询请求,查询此uuid是否已被绑定上登录签名.但如果uuid尚未绑定登录签名,后台不回立即返回结果,而是会阻塞30秒左右,在30秒内仍未扫描成功,后台会返回一个结果码.结果码的值为408,代表微信客户端尚未扫描. 发送轮询请求,判断uuid是否绑定了用户的登陆签名 如果30秒内

JAVA微信扫码支付模式二功能实现以及回调

一.准备工作 首先吐槽一下微信关于支付这块,本身支持的支付模式就好几种,但是官方文档特别零散,连像样的JAVA相关的demo也没几个.本人之前没有搞过微信支付,一开始真是被它搞晕,折腾两天终于调通了,特此写下来,以享后人吧! 关于准备工作,就"微信扫码支付模式二"官方文档地址在这 https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1 可以先看看,实际上需要准备的东西有以下几个: 其中APP_ID和APP_SECRET

php实现微信扫码自动登陆与注册功能

本文实例讲述了php实现微信扫码自动登陆与注册功能.分享给大家供大家参考,具体如下: 微信开发已经是现在程序员必须要掌握的一项基本的技术了,其实做过微信开发的都知道微信接口非常的强大做起来也非常的简单,这里我们一起来看一个微信自动登陆注册的例子. php 微信扫码 pc端自动登陆注册 用的接口scope 是snsapi_userinfo,微信登陆一个是网页授权登陆,另一个是微信联合登陆 网页授权登陆:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b647

java微信扫码支付(模式二)

微信扫码支付——模式二 代码: PayCommonUtil.java  微信支付常用方法 1 import java.text.SimpleDateFormat; 2 import java.util.Date; 3 import java.util.Iterator; 4 import java.util.Map; 5 import java.util.Set; 6 import java.util.SortedMap; 7 8 public class PayCommonUtil 9 { 1

spring boot项目之卖家扫码登陆获取openid(微信身份验证id)

卖家扫码登陆获取openid 注:此功能只能是微信公众帐号能够使用,个人账号无此功能. 一.打开微信开放平台(与支付阶段不同,特别注意!!!),进入网站应用的网站应用微信登陆开发指南. 二.你会发现和之前支付功能一样,基本步骤如下 1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数:2. 通过code参数加上AppID和AppSecret等,通过API换取access_token:3. 通过access_token

微信扫码支付(基于java ssm)

//微信扫码支付主要为返回预生成交易链接,所以需要生成二维码,前端可使用jquery.QRcode.js进行生成//主要的Controllerpackage Controllers; import Entity.UnifiedOrderRequest;import Entity.UnifiedOrderRespose;import com.alibaba.fastjson.JSONObject;import com.thoughtworks.xstream.XStream;import com.

微信扫码登录

一.微信官方参考文档地址: https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN 首先你需要在微信开放平台申请一个微信网站应用,获取 AppID:aaaaaaaaabbcc AppSecret: sfasfsafsafsafsads 二.jsp页面代码 <%@

C#开发微信门户及应用(45)--微信扫码登录

在前面随笔<C#开发微信门户及应用(41)--基于微信开放平台的扫码登录处理>介绍了基于微信开放平台接口实现的微信扫码直接登录的过程.本篇介绍对扫码登录的一些改进和处理,以便更方便应用在实际项目中. 1.扫码登录配置处理 在我前面的随笔扫码登录处理中,介绍了账号登陆和扫码登录并存的情况,有时候我们可能想只是允许用户扫码登录即可,也就是不需要账号登陆,这种情况我们可以通过进行配置实现处理.例如我在一个基于微信的系统应用里面,通过配置实现了仅仅允许扫码登录的效果.也就是我们可以根据配置,因此其他登