實現微信第三方登錄


首先我們需要一個登錄頁面,在登錄頁面中點擊微信圖標時進入另一個頁面並且彈出微信框,在此就直接寫入微信頁面的代碼

<body>
<div id="login_container"></div>
<%--引入微信的js支持--%>
<script type="text/javascript" src="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>
<script type="text/javascript">
    var obj = new WxLogin({
        self_redirect:true,
        id:"login_container",
        appid: "wxd853562a0548a7d0",
        scope: "snsapi_login",
        redirect_uri: "http://bugtracker.itsource.cn/wechat/callback",
        state: "xxx",
        style: "white",
        href: ""
    });
</script>
</body>

然后我們登錄掃碼后,然后回調controller的方法,並且將cod傳入到后台。然后我們准備一個工具類和一個靜態字段類。

靜態字段類主要用來變更接收到的參數,

 1 public class WeConstants {
 2         //創建應用的時候生成的id
 3         public final static String APPID = "wxd853562a0548a7d0";
 4         //用戶授權后微信的回調域名
 5         public final static String CALLBACK="http://bugtracker.itsource.cn";
 6         public final static String SCOPE = "snsapi_login";//表示一個網站應用
 7         public final static String APPSECRET = "4a5d5615f93f24bdba2ba8534642dbb6";
 8 
 9         //微信上獲取code的地址
10         public final static String CODEURL = "https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
11         //微信上獲取at的地址
12         public final static String ACCESSTOKEURL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
13         //微信上獲取用戶信息的地址
14         public final static String USERINFOURL = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
15 
16 }

 

工具類主要用來處理數據,將傳入的cod拿取到憑證等

public class HttpClientUtil {
    // http://bugtracker.itsource.cn/wechat/callback?code=222&state=99
    // http://bugtracker.itsource.cn/wechat/callback    code=222&state=99
    public  static String doGet(String uri){
        //1:創建一個HttpClient的實例
        CloseableHttpClient httpclient = HttpClients.createDefault();
        //2:創建一個get請求實例
        HttpGet httpGet = new HttpGet(uri);

        //請求的響應:
        CloseableHttpResponse response1=null;
        try {
            //3:使用HttpClient的實例執行get請求
            response1= httpclient.execute(httpGet);
            //http請求的狀態:404 500 200
            System.out.println(response1.getStatusLine());
            int statusCode = response1.getStatusLine().getStatusCode();
            if(statusCode==200){
              //請求成功:
                HttpEntity entity1 = response1.getEntity();
                String result = EntityUtils.toString(entity1, "utf-8");
                System.out.println(result);
                return result;
            }else{
                //請求失敗:自己做自己的業務邏輯
            }

        }catch (Exception ex){
            ex.printStackTrace();
        }
        return null;
    }
}

然后就是 controller類中調用的這個方法了

 1     @RequestMapping("/callback")
 2     public String callback(String code, String state, Model model, HttpServletRequest req){
 3         System.out.println("---------------------------------------");
 4         System.out.println();
 5         //通過code 和 state 得到 access_token
 6         //public final static String ACCESSTOKEURL = "https://api.weixin.qq.com/sns/oauth2/access_token?
 7         // appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
 8         String atUrl = WeConstants.ACCESSTOKEURL.replace("APPID", WeConstants.APPID)
 9                 .replace("SECRET", WeConstants.APPSECRET)
10                 .replace("CODE", code);
11 
12         //在發送請求獲取access_tonken
13         //借助發送請求工具類
14         String result = HttpClientUtil.doGet(atUrl);
15         System.out.println(result);
16 
17         //獲取用戶信息
18         //解析jsonStr的字符串
19         JSONObject jsonObject = (JSONObject)JSON.parse(result);
20         String access_token = String.valueOf(jsonObject.get("access_token"));
21         String openid = String.valueOf(jsonObject.get("openid"));
22         //"https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
23         String userinfoStr = WeConstants.USERINFOURL.replace("ACCESS_TOKEN", access_token)
24                 .replace("OPENID", openid);
25 
26         String userInfoJsonStr = HttpClientUtil.doGet(userinfoStr);
27         System.out.println(userInfoJsonStr);
28 
29         JSONObject userInfoJsonObj = (JSONObject)JSON.parse(userInfoJsonStr);
30         String nickname = (String)userInfoJsonObj.get("nickname");
31         model.addAttribute("nickname",nickname);
32         return "main";
33     }
34 }

至此微信登錄就完成了,需要注意的是,這個登錄方式需要在本地host文件中將回調的域名給添加進去,否者是會報錯的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM