首先我們需要一個登錄頁面,在登錄頁面中點擊微信圖標時進入另一個頁面並且彈出微信框,在此就直接寫入微信頁面的代碼
<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文件中將回調的域名給添加進去,否者是會報錯的。
/
