最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java實(shí)現(xiàn)微信掃碼登錄第三方網(wǎng)站功能(原理和代碼)

 更新時間:2022年12月13日 11:04:49   投稿:yin  
為避免繁瑣的注冊登陸,很多平臺和網(wǎng)站都會實(shí)現(xiàn)三方登陸的功能,增強(qiáng)用戶的粘性。這篇文章主要介紹了java實(shí)現(xiàn)微信掃碼登錄第三方網(wǎng)站功能(原理和代碼),避免做微信登錄開發(fā)的朋友們少走彎路

為避免繁瑣的注冊登陸,很多平臺和網(wǎng)站都會實(shí)現(xiàn)三方登陸的功能,增強(qiáng)用戶的粘性。這篇文章主要介紹了java實(shí)現(xiàn)微信掃碼登錄第三方網(wǎng)站功能(原理和代碼),避免做微信登錄開發(fā)的朋友們少走彎路。

一.查看微信掃碼登錄官方文檔

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

1.在進(jìn)行第三方授權(quán)登錄之前,需要在微信開放平臺注冊開發(fā)者賬號,拿到相應(yīng)的AppId和AppSecret以及redirect_uri,即可進(jìn)行授權(quán)接入流程;

2.第三方可以獲取到用戶的接口調(diào)用憑證(access_token),通過access_token可以進(jìn)行微信開放平臺授權(quán)關(guān)系接口調(diào)用,從而可實(shí)現(xiàn)獲取微信用戶基本開放信息和幫助用戶實(shí)現(xiàn)基礎(chǔ)開放功能等。

獲取access_token時序圖:

二.實(shí)現(xiàn)微信第三方登錄流程:

1. 開發(fā)者調(diào)用微信接口用于獲取掃描二維碼。

調(diào)用接口:

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

參數(shù)介紹:

    appid: 微信申請已存在的服務(wù)號的應(yīng)用號;

    redirect_uri: 回調(diào)地址,掃完碼之后微信會將code這個值傳到這個地址上,注意:回調(diào)地址需要用urlEncode處理;

    responseType: 填code;

    scope: 網(wǎng)頁應(yīng)用僅填snsapi_login;

    state: 用于保持請求和回調(diào)的狀態(tài),授權(quán)請求后原樣帶給第三方,可用于防止跨站攻擊;

2. 用戶掃描二維碼后該接口會自動返回重定向的資源上,并且?guī)蟘ode和state參數(shù),如果用戶拒絕授權(quán)只會帶上state參數(shù)

3. 開發(fā)者通過用微信另一個接口根據(jù)code和 appid,secret獲取access_token(也就是調(diào)用接口的憑證,有了他可以獲取里面的openid等信息)

調(diào)用接口:

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

  •  參數(shù)介紹  

      appid: 微信申請已存在的服務(wù)號的應(yīng)用號;

      secret:微信申請已存在的應(yīng)用密匙;

      code:調(diào)用上面一個接口自動返回的臨時票據(jù)。

      grant_type:寫authorization_code

返回參數(shù)介紹

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

  access_token:接口調(diào)用憑證

  expires_in:access_token接口調(diào)用憑證超時時間,單位(秒)

  refresh_token: 用戶刷新access_token

  openid:授權(quán)用戶唯一標(biāo)識(常用)

  scope:用戶授權(quán)的作用域 

4.調(diào)用接口根據(jù)access_token和openid獲取個人用戶信息

調(diào)用接口:

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

     access_token:上個接口調(diào)用后返回的調(diào)用憑證

     openid:上個接口獲取的授權(quán)用戶唯一標(biāo)識返回參數(shù)介紹

示例;
{  
    "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:授權(quán)用戶唯一標(biāo)識

  nickname:普通用戶昵稱

  sex:普通用戶性別,1為男性,2為女性

  province:普通用戶個人資料填寫的省份

  city:普通用戶個人資料填寫的城市

  country:國家,如中國為CN

  headimgurl:用戶頭像,最后一個數(shù)值代表正方形頭像大?。ㄓ?、46、64、96、132數(shù)值可選,0代表640*640正方形頭像),用戶沒有頭像時該項(xiàng)為空

  privilege:用戶特權(quán)信息,json數(shù)組,如微信沃卡用戶為(chinaunicom)

  unionid:用戶統(tǒng)一標(biāo)識。針對一個微信開放平臺帳號下的應(yīng)用,同一用戶的unionid是唯一的。

三.代碼實(shí)現(xiàn):

1.創(chuàng)建相關(guān)工具類

封裝的幾個基礎(chǔ)類

a.  access_token封裝基礎(chǔ)類

public class Token {
    private String openid; //授權(quán)用戶唯一標(biāo)識
    private String accessToken; //接口調(diào)用憑證
    private Integer ExpiresIn; //access_token接口調(diào)用憑證超時時間,單位(秒)
    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. 根據(jù)openid獲取用戶信息封裝成基礎(chǔ)類

public class WechatUserInfo {
    private String unionid;  //用戶唯一標(biāo)識
    private String nickname; //昵稱
    private String headimgurl; //頭像地址
    private String subscribe; // 用戶是否訂閱該公眾號標(biāo)識,值為0時,代表此用戶沒有關(guān)注該公眾號,拉取不到其余信息。 1 用戶已經(jīng)綁定公眾號
    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進(jìn)行編碼)

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和用戶信息的接口的請求調(diào)用,返回相應(yīng)的數(shù)據(jù))

/**
* 發(fā)送https請求
* @param requestUrl 請求地址
* @param requestMethod 請求方式(GET、POST)
* @param outputStr 提交的數(shù)據(jù)
* @return 返回微信服務(wù)器響應(yīng)的信息
*/

public static String httpsRequest(String requestUrl, String requestMethod, String outputStr) {
        try {
            // 創(chuàng)建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);
            // 設(shè)置請求方式(GET/POST)
            conn.setRequestMethod(requestMethod);
            conn.setRequestProperty("content-type", "application/x-www-form-urlencoded"); 
            // 當(dāng)outputStr不為null時向輸出流寫數(shù)據(jù)
            if (null != outputStr) {
                OutputStream outputStream = conn.getOutputStream();
                // 注意編碼格式
                outputStream.write(outputStr.getBytes("UTF-8"));
                outputStream.close();
            }
            // 從輸入流讀取返回內(nèi)容
            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);// 發(fā)起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.  根據(jù)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. 跳轉(zhuǎn)至登錄授權(quán)頁面(頁面出現(xiàn)二維碼)

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 = "http://www.fzitv.net/weChatLogin_epf.action";//調(diào)用微信接口后返回的資源名
        String loginScope = "snsapi_login";//寫死
        redirectURL = requestUrl.replace("APPID", loginAppid).replace("REDIRECT_URI", CommonUtil.urlEncodeUTF8(loginRedirectUrl)).replace("SCOPE", loginScope);
        return SUCCESS;
    }

b. 授權(quán)成功后:

@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調(diào)用接口
            WechatUserInfo wxuse  = CommonUtil.getUserinfo(access_token, openid);
            return SUCCESS;
        }

到此這篇關(guān)于java實(shí)現(xiàn)微信掃碼登錄第三方網(wǎng)站功能(原理和代碼)的文章就介紹到這了,更多相關(guān)java微信第三方登錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java開發(fā)學(xué)習(xí) Java數(shù)組操作工具

    Java開發(fā)學(xué)習(xí) Java數(shù)組操作工具

    這篇文章主要為大家詳細(xì)介紹了自己編寫的Java數(shù)組操作工具,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 淺談Java 8 新增函數(shù)式接口到底是什么

    淺談Java 8 新增函數(shù)式接口到底是什么

    這篇文章主要介紹了淺談Java 8 新增函數(shù)式接口到底是什么,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Java Web會話技術(shù)Session的簡單使用

    Java Web會話技術(shù)Session的簡單使用

    在請求需要傳遞的信息比較多,使用Cookie技術(shù)就會增大請求的難度。而Session可以存儲對象、數(shù)組等信息,并且Session是存儲到服務(wù)器端的,在客戶端請求時只需要將session id一并攜帶給服務(wù)器端。本文將簡單的介紹如何使用Session
    2021-05-05
  • SpringMVC上傳文件的兩種方法

    SpringMVC上傳文件的兩種方法

    這篇文章主要為大家詳細(xì)介紹了SpringMVC上傳文件的兩種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • 教你在一分鐘之內(nèi)理解Java Lambda表達(dá)式并學(xué)會使用

    教你在一分鐘之內(nèi)理解Java Lambda表達(dá)式并學(xué)會使用

    今天給大家?guī)У奈恼率荍ava8新特性的相關(guān)知識,文章圍繞著如何在一分鐘之內(nèi)理解Java Lambda表達(dá)式并學(xué)會使用展開,文中有非常詳細(xì)的介紹,需要的朋友可以參考下
    2021-06-06
  • jstl之map,list訪問遍歷以及el表達(dá)式map取值的實(shí)現(xiàn)

    jstl之map,list訪問遍歷以及el表達(dá)式map取值的實(shí)現(xiàn)

    下面小編就為大家?guī)硪黄猨stl之map,list訪問遍歷以及el表達(dá)式map取值的實(shí)現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • 使用Redis incr解決并發(fā)問題的操作

    使用Redis incr解決并發(fā)問題的操作

    這篇文章主要介紹了使用Redis incr解決并發(fā)問題的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • IntelliJ IDEA中顯示和關(guān)閉工具欄與目錄欄的方法

    IntelliJ IDEA中顯示和關(guān)閉工具欄與目錄欄的方法

    今天小編就為大家分享一篇關(guān)于IntelliJ IDEA中顯示和關(guān)閉工具欄與目錄欄的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • java用兩個例子充分闡述多態(tài)的可拓展性介紹

    java用兩個例子充分闡述多態(tài)的可拓展性介紹

    下面小編就為大家?guī)硪黄猨ava用兩個例子充分闡述多態(tài)的可拓展性介紹。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • Spring 加載多份配置文件的問題及解決方案

    Spring 加載多份配置文件的問題及解決方案

    在Spring項(xiàng)目中,有時候需要加載多份配置文件以簡化復(fù)雜的配置管理,解決這一問題的方法是使用spring.config.import屬性,通過這種方式,可以在主配置文件中指定額外的配置文件路徑,支持文件、classpath或URL形式的路徑,感興趣的朋友跟隨小編一起看看吧
    2024-10-10

最新評論

孙吴县| 图木舒克市| 蓝田县| 天长市| 潮州市| 罗定市| 南乐县| 亳州市| 阜平县| 广宗县| 伊宁市| 通许县| 江孜县| 霍州市| 临湘市| 牙克石市| 孟村| 武宁县| 夹江县| 临潭县| 同江市| 辽阳市| 吕梁市| 墨江| 兴和县| 茂名市| 长沙市| 泉州市| 南丰县| 遵化市| 榆林市| 清新县| 健康| 上蔡县| 南充市| 哈尔滨市| 太原市| 集贤县| 尉氏县| 绵阳市| 博湖县|