授權碼code獲取用戶基本信息
上一遍已經獲得微信回調的code,網址:回調獲取code 那這篇通過code和其它參數去獲得用戶基本信息。
github源碼地址:https://github.com/yudiandemingzi/spring-boot-wechat-login
1、UserServiceImpl關鍵代碼
@Override public User saveWeChatUser(String code) { //1、通過openAppid和openAppsecret和微信返回的code,拼接URL String accessTokenUrl = String.format(WeChatConfig.getOpenAccessTokenUrl(),weChatConfig.getOpenAppid(),weChatConfig.getOpenAppsecret(),code); //2、通過URL再去回調微信接口 (使用了httpclient和gson工具) Map<String ,Object> baseMap = HttpUtils.doGet(accessTokenUrl); //3、回調成功后獲取access_token和oppid if(baseMap == null || baseMap.isEmpty()){ return null; } String accessToken = (String)baseMap.get("access_token"); String openId = (String) baseMap.get("openid"); //4、去數據庫查看該用戶之前是否已經掃碼登陸過(openid是用戶唯一標志) User dbUser = userMapper.findByopenid(openId); if(dbUser!=null) { //如果用戶已經存在,直接返回 return dbUser; } //4、access_token和openid拼接URL String userInfoUrl = String.format(WeChatConfig.getOpenUserInfoUrl(),accessToken,openId); //5、通過URL再去調微信接口獲取用戶基本信息 Map<String ,Object> baseUserMap = HttpUtils.doGet(userInfoUrl); if(baseUserMap == null || baseUserMap.isEmpty()){ return null; } //6、獲取用戶姓名、性別、城市、頭像等基本信息 String nickname = (String)baseUserMap.get("nickname"); Double sexTemp = (Double) baseUserMap.get("sex"); int sex = sexTemp.intValue(); String province = (String)baseUserMap.get("province"); String city = (String)baseUserMap.get("city"); String country = (String)baseUserMap.get("country"); String headimgurl = (String)baseUserMap.get("headimgurl"); StringBuilder sb = new StringBuilder(country).append("||").append(province).append("||").append(city); String finalAddress = sb.toString(); try { //解決用戶名亂碼 nickname = new String(nickname.getBytes("ISO-8859-1"), "UTF-8"); finalAddress = new String(finalAddress.getBytes("ISO-8859-1"), "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } //7、新用戶存入數據庫 User user = new User(); user.setName(nickname); user.setHeadImg(headimgurl); user.setCity(finalAddress); user.setOpenid(openId); user.setSex(sex); user.setCreateTime(new Date()); userMapper.save(user); return user; }
2、HttpUtils工具類
(1)首先需要httpclient、gson相關jar包
<!--httpclient相關jar包--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.3</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> <version>4.5.2</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> </dependency> <!-- gson工具,封裝http的時候使用 --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.0</version> </dependency>
/** * 封裝http get post */ public class HttpUtils { private static final Gson gson = new Gson(); /** * get方法 * @param url * @return */ public static Map<String,Object> doGet(String url){ Map<String,Object> map = new HashMap<>(); CloseableHttpClient httpClient = HttpClients.createDefault(); RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(5000) //連接超時 .setConnectionRequestTimeout(5000)//請求超時 .setSocketTimeout(5000) .setRedirectsEnabled(true) //允許自動重定向 .build(); HttpGet httpGet = new HttpGet(url); httpGet.setConfig(requestConfig); try{ HttpResponse httpResponse = httpClient.execute(httpGet); if(httpResponse.getStatusLine().getStatusCode() == 200){ String jsonResult = EntityUtils.toString( httpResponse.getEntity()); map = gson.fromJson(jsonResult,map.getClass()); } }catch (Exception e){ e.printStackTrace(); }finally { try { httpClient.close(); }catch (Exception e){ e.printStackTrace(); } } return map; } /** * 封裝post * @return */ public static String doPost(String url, String data,int timeout){ CloseableHttpClient httpClient = HttpClients.createDefault(); //超時設置 RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeout) //連接超時 .setConnectionRequestTimeout(timeout)//請求超時 .setSocketTimeout(timeout) .setRedirectsEnabled(true) //允許自動重定向 .build(); HttpPost httpPost = new HttpPost(url); httpPost.setConfig(requestConfig); httpPost.addHeader("Content-Type","text/html; chartset=UTF-8"); if(data != null && data instanceof String){ //使用字符串傳參 StringEntity stringEntity = new StringEntity(data,"UTF-8"); httpPost.setEntity(stringEntity); } try{ CloseableHttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); if(httpResponse.getStatusLine().getStatusCode() == 200){ String result = EntityUtils.toString(httpEntity); return result; } }catch (Exception e){ e.printStackTrace(); }finally { try{ httpClient.close(); }catch (Exception e){ e.printStackTrace(); } } return null; } }