微信公众号获取用户信息(新)
注意:此access_token和基礎支持的access_token不同(此access_token相當于用戶的token,基礎的access_token相當于應用的token)
微信授權的流程:
詳細的流程:
?登錄微信公眾號——>設置與開發——接口權限——找到網頁授權進行修改(必須配置了你的域名,你的重定向地址才能被微信所允許)
?下載上面微信驗證服務器的文件
// 如果你想直接用一個springboot完成一系列的測試的話 // 寫這么一個接口返回你配置域名時下載的文件內容 // 此處我的文件名-MP_verify_2F6tdhplFiueD8UJ.txt 內容-2F6tdhplFiueD8UJ @RequestMapping("MP_verify_2F6tdhplFiueD8UJ.txt") public String wxCheck(){//直接返回你下載的授權文件里的內容就好return "2F6tdhplFiueD8UJ"; }配置公眾號自定義菜單中的跳轉地址,直接配置第一步
通過微信瀏覽器獲取對應的code為后面獲取token(注意:這個重定向路徑需要在微信公眾號的后臺進行配置)
redirect_uri:域名/getUserInfo 此處需要公網上的ip或者域名,如果你是局域網需要內網穿透
https://open.weixin.qq.com/connect/oauth2/authorize?appid=@{Appid}&redirect_uri=@{redirect_uri}&response_type=code&scope=snsapi_userinfo&state=STATE&connect_redirect=1#wechat_redirect
示例代碼
@RestController public class HelloController {// 1.使用httpClient@RequestMapping(value="/getUserInfo")public void getUserInfo(String code) throws IOException {String appId = "你的AppID";String secret = "你的AppSecret";CloseableHttpClient httpClient = HttpClients.createDefault();// 拼接URLString url = getAccessTokenUrl.replace("@{appId}", appId).replace("@{secret}", secret).replace("@{code}", code);// httpClient發送get請求HttpGet get = new HttpGet(url);// 獲取結果實體HttpEntity entity = httpClient.execute(get).getEntity();JSONObject accessTokenObject = null;if (entity != null) {// 按指定編碼轉換結果實體為String類型String json = EntityUtils.toString(entity, "UTF-8");accessTokenObject = JSONObject.parseObject(json);}String openid = (String) accessTokenObject.get("openid");String accessToken = (String) accessTokenObject.get("access_token");// 獲取用戶信息String getUserInfoUrl = getUserInfo.replace("@{accessToken}",accessToken).replace("@{openId}",openid);HttpGet get1 = new HttpGet(getUserInfoUrl);HttpEntity UserInfo = httpClient.execute(get1).getEntity();if (UserInfo != null) {// 按指定編碼轉換結果實體為String類型String json = EntityUtils.toString(UserInfo, "UTF-8");JSONObject jsonObject= JSONObject.parseObject(json, WxIndividualMessage.class);System.out.println(jsonObject.toString());}// 釋放response的流EntityUtils.consume(entity);EntityUtils.consume(UserInfo);} }可能碰到的異常:
如果彈出(請在微信客戶端打開鏈接)異常,說明鏈接需要在微信瀏覽器中打開
如果彈出(redirect_uri參數錯誤)異常,證明前面的微信公眾號后臺域名未配置
附贈:
使用resttemplate進行請求,不過需要配置restTemplate配置類
@Configuration public class RestTemplateConfig {/*** http連接管理器* @return*/@Beanpublic HttpClientConnectionManager poolingHttpClientConnectionManager() {PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager();// 最大連接數poolingHttpClientConnectionManager.setMaxTotal(200);// 并發數poolingHttpClientConnectionManager.setDefaultMaxPerRoute(20);return poolingHttpClientConnectionManager;}/*** httpClient* @param httpClientConnectionManager* @return*/@Beanpublic HttpClient httpClient(HttpClientConnectionManager httpClientConnectionManager) {HttpClientBuilder httpClient = HttpClientBuilder.create();// 設置http連接管理器httpClient.setConnectionManager(httpClientConnectionManager);return httpClient.build();}@Beanpublic ClientHttpRequestFactory clientHttpRequestFactory(HttpClient httpClient) {// httpClient創建器HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);// 連接超時時間/毫秒(連接上服務器(握手成功)的時間,超出拋出connect timeout)clientHttpRequestFactory.setConnectTimeout(5000);// 讀取超時時間/毫秒(從服務器讀取數據的時間,超出拋出read timeout)clientHttpRequestFactory.setReadTimeout(10000);// 連接不夠用的等待時間/毫秒(connect timeout的延遲)clientHttpRequestFactory.setConnectionRequestTimeout(10000);return clientHttpRequestFactory;}@Beanpublic RestTemplate restTemplate(ClientHttpRequestFactory clientHttpRequestFactory) {List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();StringHttpMessageConverter messageConverter = new StringHttpMessageConverter(StandardCharsets.UTF_8);messageConverters.add(messageConverter);RestTemplate restTemplate = new RestTemplate(messageConverters);restTemplate.setRequestFactory(clientHttpRequestFactory);return restTemplate;} } @RestController public class HelloController {@RequestMapping(value="/getUserInfoByRestTemplate")public void getUserInfoByRestTemplate(@RequestParam("code")String code){String appId = "你的AppID";String secret = "你的AppSecret";// 獲取accessToken和openIdString baseUrl = getAccessTokenUrl.replace("@{secret}", secret);baseUrl = baseUrl.replace("@{appId}", appId);baseUrl = baseUrl.replace("@{code}", code);String mapString = restTemplate.getForObject(baseUrl, String.class);JSONObject map = (JSONObject) JSONObject.parse(mapString);// 獲取用戶信息String openid = (String) map.get("openid");String accessToken = (String) map.get("access_token");String url = getUserInfo.replace("@{accessToken}",accessToken);url = url.replace("@{openId}",openid);String mapString1 = restTemplate.getForObject(url, String.class);JSONObject map1 = JSONObject.parseObject(mapString1, WxIndividualMessage.class);System.out.println(map1.toString());System.out.println(map1.getNickname());} }?初入博客,有問題請直言
總結
以上是生活随笔為你收集整理的微信公众号获取用户信息(新)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java md5签名算法_MD5请求签名
- 下一篇: android跳转到应用市场并进入指定包