java实现微信扫码登录第三方网站功能(原理和代码)

目录
  • 一.查看微信扫码登录官方文档
  • 二.实现微信第三方登录流程:
  • 三.代码实现:

为避免繁琐的注册登陆,很多平台和网站都会实现三方登陆的功能,增强用户的粘性。这篇文章主要介绍了java实现微信扫码登录第三方网站功能(原理和代码),避免做微信登录开发的朋友们少走弯路。

一.查看微信扫码登录官方文档

官方文档:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN

1.在进行第三方授权登录之前,需要在微信开放平台注册开发者账号,拿到相应的AppId和AppSecret以及redirect_uri,即可进行授权接入流程;

2.第三方可以获取到用户的接口调用凭证(access_token),通过access_token可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。

获取access_token时序图:

二.实现微信第三方登录流程:

1. 开发者调用微信接口用于获取扫描二维码。

调用接口:

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: 回调地址,扫完码之后微信会将code这个值传到这个地址上,注意:回调地址需要用urlEncode处理;

    responseType: 填code;

    scope: 网页应用仅填snsapi_login;

    state: 用于保持请求和回调的状态,授权请求后原样带给第三方,可用于防止跨站攻击;

2. 用户扫描二维码后该接口会自动返回重定向的资源上,并且带上code和state参数,如果用户拒绝授权只会带上state参数

3. 开发者通过用微信另一个接口根据code和 appid,secret获取access_token(也就是调用接口的凭证,有了他可以获取里面的openid等信息)

调用接口:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

  •  参数介绍  

     appid: 微信申请已存在的服务号的应用号;

      secret:微信申请已存在的应用密匙;

      code:调用上面一个接口自动返回的临时票据。

      grant_type:写authorization_code

返回参数介绍

示例:  
{    
    "access_token":"ACCESS_TOKEN",
    "expires_in":7200,    
    "refresh_token":"REFRESH_TOKEN",    
    "openid":"OPENID",    
    "scope":"SCOPE"  
}

  access_token:接口调用凭证

  expires_in:access_token接口调用凭证超时时间,单位(秒)

  refresh_token: 用户刷新access_token

  openid:授权用户唯一标识(常用)

  scope:用户授权的作用域 

4.调用接口根据access_token和openid获取个人用户信息

调用接口:

http请求方式: GET
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID

     access_token:上个接口调用后返回的调用凭证

     openid:上个接口获取的授权用户唯一标识返回参数介绍

示例;
{ 
    "openid":"OPENID",
  "nickname":"NICKNAME",
  "sex":1,
  "province":"PROVINCE",
  "city":"CITY",
  "country":"COUNTRY",
  "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
  "privilege":["PRIVILEGE1","PRIVILEGE2"],
  "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

  openid:授权用户唯一标识

  nickname:普通用户昵称

  sex:普通用户性别,1为男性,2为女性

  province:普通用户个人资料填写的省份

  city:普通用户个人资料填写的城市

  country:国家,如中国为CN

  headimgurl:用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空

  privilege:用户特权信息,json数组,如微信沃卡用户为(chinaunicom)

  unionid:用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。

三.代码实现:

1.创建相关工具类

封装的几个基础类

a.  access_token封装基础类

public class Token {
    private String openid; //授权用户唯一标识
    private String accessToken; //接口调用凭证
    private Integer ExpiresIn; //access_token接口调用凭证超时时间,单位(秒)
    public String getOpenid() {
        return openid;
    }
    public void setOpenid(String openid) {
        this.openid = openid;
    }
    public String getAccessToken() {
        return accessToken;
    }
    public void setAccessToken(String accessToken) {
        this.accessToken = accessToken;
    }
    public Integer getExpiresIn() {
        return ExpiresIn;
    }
    public void setExpiresIn(Integer expiresIn) {
        ExpiresIn = expiresIn;
    }

b. 根据openid获取用户信息封装成基础类

public class WechatUserInfo {
    private String unionid;  //用户唯一标识
    private String nickname; //昵称
    private String headimgurl; //头像地址
    private String subscribe; // 用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。 1 用户已经绑定公众号
    public String getUnionid() {
        return unionid;
    }
    public void setUnionid(String unionid) {
        this.unionid = unionid;
    }
    public String getNickname() {
        return nickname;
    }
    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
    public String getHeadimgurl() {
        return headimgurl;
    }
    public void setHeadimgurl(String headimgurl) {
        this.headimgurl = headimgurl;
    }
    public String getSubscribe() {
        return subscribe;
    }
    public void setSubscribe(String subscribe) {
        this.subscribe = subscribe;
    }

工具类

a. urlEncodeUTF8工具类(用于将扫描二维码后重定向的资源url进行编码)

public static String urlEncodeUTF8(String source){
    String result = source;
    try {
        result = java.net.URLEncoder.encode(source,"utf-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return result;
}

b. httpsRequest工具类(用于处理微信的获取openid和用户信息的接口的请求调用,返回相应的数据)

/**
* 发送https请求
* @param requestUrl 请求地址
* @param requestMethod 请求方式(GET、POST)
* @param outputStr 提交的数据
* @return 返回微信服务器响应的信息
*/

public static String httpsRequest(String requestUrl, String requestMethod, String outputStr) {
        try {
            // 创建SSLContext对象,并使用我们指定的信任管理器初始化
            TrustManager[] tm = { new MyX509TrustManager() };
            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);
            HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
            conn.setSSLSocketFactory(ssf);
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            // 设置请求方式(GET/POST)
            conn.setRequestMethod(requestMethod);
            conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
            // 当outputStr不为null时向输出流写数据
            if (null != outputStr) {
                OutputStream outputStream = conn.getOutputStream();
                // 注意编码格式
                outputStream.write(outputStr.getBytes("UTF-8"));
                outputStream.close();
            }
            // 从输入流读取返回内容
            InputStream inputStream = conn.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "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;
            conn.disconnect();
            return buffer.toString();
        } catch (ConnectException ce) {
            log.error("连接超时:{}", ce);
        } catch (Exception e) {
            log.error("https请求异常:{}", e);
        }
        return null;
    }
    

c.  获取openid等信息的方法

public static Token getTokenWithOpenid(String appid, String appsecret, String code) {
        String findAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
        Token token = null;
        String requestUrl = findAccessTokenUrl.replace("APPID", appid).replace("SECRET", appsecret).replace("CODE", code);// 发起GET请求获取凭证
        JSONObject jsonObject = JSONObject.fromObject(httpsRequest(requestUrl, "GET", null));

        if (null != jsonObject) {
            try {
                token = new Token();
                token.setOpenid(jsonObject.getString("openid"));
                token.setAccessToken(jsonObject.getString("access_token"));
                token.setExpiresIn(jsonObject.getInt("expires_in"));
            } catch (JSONException e) {
                token = null;
                // 获取token失败
                log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
            }
        }
        return token;
    }

d.  根据openid获取用户信息的方法

public static WechatUserInfo  getUserinfo(String access_token, String openid) {
        WechatUserInfo wxuse = new WechatUserInfo();
        String findUseinfo = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
        String requestUrl = findUseinfo.replace("ACCESS_TOKEN", access_token).replace("OPENID", openid);
        JSONObject jsonObject = JSONObject.fromObject(httpsRequest(requestUrl, "GET", null));

        if (null != jsonObject) {
            try {
                wxuse.setNickname(jsonObject.getString("nickname"));
                wxuse.setHeadimgurl(jsonObject.getString("headimgurl"));
                wxuse.setUnionid(jsonObject.getString("unionid"));
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        return wxuse;
    }

操作:   

a. 跳转至登录授权页面(页面出现二维码)

public String weChatLanded(){
        String requestUrl  = "https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
        String loginAppid = "wxea43f181e32e8df0";  //微信申请的appid
        String loginRedirectUrl = "https://www.jb51.net/weChatLogin_epf.action";//调用微信接口后返回的资源名
        String loginScope = "snsapi_login";//写死
        redirectURL = requestUrl.replace("APPID", loginAppid).replace("REDIRECT_URI", CommonUtil.urlEncodeUTF8(loginRedirectUrl)).replace("SCOPE", loginScope);
        return SUCCESS;
    }

b. 授权成功后:

@SuppressWarnings("static-access")
        public String weChatLogin_epf(){
            //通过code获取access_token
            String loginAppid = "wxea43f181e32e8df0";
            String loginSecrect = "4721e5f744e6c0f3c4094b25449ee7e3";
            Token tokenWithOpenid = CommonUtil.getTokenWithOpenid(loginAppid, loginSecrect,code);
            String openid = tokenWithOpenid.getOpenid();
            String access_token = tokenWithOpenid.getAccessToken();
            //通过access_token调用接口
            WechatUserInfo wxuse  = CommonUtil.getUserinfo(access_token, openid);
            return SUCCESS;
        }

到此这篇关于java实现微信扫码登录第三方网站功能(原理和代码)的文章就介绍到这了,更多相关java微信第三方登录内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Vue PC端实现扫码登录功能示例代码

    目录 需求描述 思路解析 前端功能实现 如何控制二维码的时效性? 前端如何获取服务器二维码的状态? 本篇文章给大家带来了关于Vue的相关知识,其中主要介绍了在PC端实现扫码的原理是什么?怎么生成二维码图片?怎么用Vue实现前端扫码登录?感兴趣的朋友,下面一起来看一下吧,希望对大家有帮助. 需求描述 目前大多数PC端应用都有配套的移动端APP,如微信,淘宝等,通过使用手机APP上的扫一扫功能去扫页面二维码图片进行登录,使得用户登录操作更方便,安全,快捷. 思路解析 PC 扫码原理? 扫码登录功能涉

  • vue3 微信扫码登录及获取个人信息实现的三种方法

    目录 一.流程: 二.前置条件: 三.具体登录实现 实现方式一: 方式二: 方式三:结合后端获取到二维码 四.登录微信后获取微信中用户头像和昵称 一.流程: 微信提供的扫码方式有两种,分别是: 跳转二维码扫描页面 内嵌式二维码 根据文档我们可以知道关于扫码授权的模式整体流程为: 1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据 code 参数: 2. 通过 code 参数加上 AppID 和AppSecret等,通过 API

  • Python中如何实现MOOC扫码登录

    目录 1.基本原理 2.代码实现 1.访问网站扫码登录页,并下载二维码 2.模拟轮询 3.弹出二维码,扫码登录 4.带上token请求资源 总结 1.基本原理 访问网站扫码登录页,网站给浏览器返回一个二维码和一个唯一标志KEY 浏览器开启定时轮询服务器,确认KEY对应的扫码结果 用户使用app扫码二维码,app获取KEY并告知服务器已扫码 App确认登陆(包含个性化校验过程),服务器更新KEY的校验结果 浏览器轮询结果成功,获得一次性token 带上token请求资源,获得有效cookie,正常

  • Web端扫码登录的原理和实现讲解

    1 概述 在日常 Web 端产品的使用中,一般都会支持扫码登录,这种方式操作简单,相对传统的手机号登录等方式速度更快.安全性更高,还可以增加自家产品的粘合度. 2 登录原理 扫码登录本质是解决将 APP 端的用户登录信息(通常是 Token)通过扫码的形式安全稳定地同步给 Web 端. 1)用户打开 Web 端网页,进入扫码登录的界面:2)从 Web 端服务器获取二维码的图并获取其状态:3)Web 端服务器在生成二维码时,会生成一个 uuid 和二维码进行关联,并将 uuid 存入 db 记录中

  • springBoot基于webSocket实现扫码登录

    最近单位又有一个新Java项目. 涉及到扫码登录.之前项目使用的是 ajax轮询的方式.感觉太low了. 所以这次用webSocket的方式进行实现 好.废话不多说!咱们开始!! 一.首先咱们需要一张表 这表是干啥的呢? 就是记录一下谁扫码了.谁登录了. User_Token表 字段如下: 1.uuid : 用于确保唯一性 2.userId : 谁登录的 3.loginTime : 登录时间 4.createTime :创建时间 用于判断是否过期 5.state: 是否二维码失效  0有效 1失

  • Vue PC前端扫码登录功能实现

    目录 需求描述 思路解析 PC 扫码原理? 前端功能实现 如何生成二维码图片? 如何控制二维码的时效性? 前端如何获取服务器二维码的状态? 参考资料: 总结 需求描述 目前大多数PC端应用都有配套的移动端APP,如微信,淘宝等,通过使用手机APP上的扫一扫功能去扫页面二维码图片进行登录,使得用户登录操作更方便,安全,快捷. 思路解析 PC 扫码原理? 扫码登录功能涉及到网页端.服务器和手机端,三端之间交互大致步骤如下: 网页端展示二维码,同时不断的向服务端发送请求询问该二维码的状态: 手机端扫描

  • javaweb实现app扫码登录功能

    本文为大家分享了javaweb实现app扫码登录的具体代码,供大家参考,具体内容如下 1.web页面主动向服务器索要一张由服务器生成包含维一标识的二维码图片,也可以直接向后台索要一个维一标识,拿到标识后通过js生成二维码.这里本人采用的是第二种方式,至于为什么吗?个人感觉这样方便,后台也不要导入架包,最后将该标识存入List集合中,接下来会用到该标识 2.app扫码后解析二维码内的维一标识,然后再携带该标识跟用户名发回给服务器,服务器接到请求后,遍历List集合,验证该标识是否为本系统生成的,若

  • java实现微信扫码登录第三方网站功能(原理和代码)

    目录 一.查看微信扫码登录官方文档 二.实现微信第三方登录流程: 三.代码实现: 为避免繁琐的注册登陆,很多平台和网站都会实现三方登陆的功能,增强用户的粘性.这篇文章主要介绍了java实现微信扫码登录第三方网站功能(原理和代码),避免做微信登录开发的朋友们少走弯路. 一.查看微信扫码登录官方文档 官方文档:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&

  • 详解java实现简单扫码登录功能(模仿微信网页版扫码)

    java实现简单扫码登录功能 模仿微信pc网页版扫码登录 使用js代码生成qrcode二维码减轻服务器压力 js循环请求服务端,判断是否qrcode被扫 二维码超时失效功能 二维码被扫成功登录,服务端产生sessionId,传到页面使用js保存cookie 多线程 生成qrcode相关js jquery.qrcode.js 代码 页面div <div class="pc_qr_code"> <input type="hidden" id="

  • Vue+abp微信扫码登录的实现代码示例

    最近系统中要使用微信扫码登录,根据微信官方文档和网络搜索相关文献实现了.分享给需要的人,也作为自己的一个笔记.后端系统是基于ABP的,所以部分代码直接使用了abp的接口,直接拷贝代码编译不通过. 注册微信开放平台账号# 在微信开放平台注册,注意是开放平台不是公众平台,这里需要300元,然后申请网站应用.审核通过后获取到AppID和AppSecret以及登记的网站url.只有此url下的地址微信扫码后才能回调. 具体申请条件见官方文档. 生成登录二维码# 在vue登录页面嵌入登录二维码,根据官方文

  • Spring Boot实现微信扫码登录功能流程分析

    目录 1. 授权流程说明 第一步:请求CODE 第二步:通过code获取access_token 第三步:通过access_token调用接口 2. 授权流程代码 3. 用户登录和登出 4. Spring AOP校验用户有没有登录 5. 拦截登录校验不通过抛出的异常 微信开放平台:微信扫码登录功能 官方文档:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html 1. 授权

  • 基于 Swoole 的微信扫码登录功能实现代码

    随着微信的普及,扫码登录方式越来越被现在的应用所使用.它因为不用去记住密码,只要有微信号即可方便快捷登录.微信的开放平台原生就有支持扫码登录的功能,不过大部分人还是在用公众平台,所以扫码登录只能自行实现.这里基于微信公众平台的带参数临时二维码,并且结合 Swoole 的 WebSocket 服务实现扫码登录.大体流程如下: 客户端打开登录界面,连接到 WebSocket 服务 WebScoket 服务生成带参数二维码返回给客户端 用户扫描展示的带参数二维码 微信服务器回调扫码事件并通知开发者服务

  • Java实现微信扫码登入的实例代码

    微信扫码登入 首先去通过微信开放平台做好开发者资质认证,创建网站应用然后等待审核 开发者资质认证 网站应用 审核通过的话就是这个样子 还有最底下的授权回调地址 (www.xxxxx.com) 填写域名即可 pom <!-- WeChatQrCode --> <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-mp</artifactId&

  • 自定义PC微信扫码登录样式写法

    PC微信扫码登录 近期做一个PC端微信扫码登录的需求,微信扫码有两种方式,一种是新开一个二维码页面,另一种是内嵌入产品网页.本次以内嵌二维码为例,具体怎样在页面中显示一个登陆二维码,文档说的很清楚,就不赘述了,文档地址:https://open.weixin.qq.com/cg... 解决自定义微信二维码样式问题 当一切准备妥当之后,网页上的二维码初始默认是这个样子. 特别大不说(默认二维码大小280x280),还有微信登录的title,下方也有扫码登录的提示. 幸运的是,微信留了一个api给我

  • java实现微信扫码支付功能

    本文实例为大家分享了java实现微信扫码支付的具体代码,供大家参考,具体内容如下 1.maven项目的pom.xml中添加如下jar包: <dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId> <version>0.0.3</version> </dependency> 2.编写WeWxConfig类

  • 浅析微信扫码登录原理(小结)

    微信扫码登录原理解析 扫码登录是现在流行的登录方式,使用这种方式及其方便,而且安全 扫码登录流程 原理 获取唯一的uuid, 以及包含uid信息的二维码 // 获取uuid getUUID: function() { var e = t.defer(); return window.QRLogin = {}, $.ajax({ url: i.API_jsLogin, dataType: "script" }).done(function() { 200 == window.QRLogi

随机推荐