微信公众平台--服务号/订阅号--网页授权获取用户基本信息
官方Api文檔:
http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
說的很清楚,可以仔細看看。
1.登錄微信公眾平臺
https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=42879889&lang=zh_CN
2.點擊開發者中心
點擊修改
填寫授權回調頁面域名,我寫的是我本機的局域網IP地址
然后點擊確定。
3.誘導用戶微信打開授權頁面:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
用戶會看到如下類似頁面:
如果用戶同意授權,頁面將跳轉至 redirect_uri/?code=CODE&state=STATE。若用戶禁止授權,則重定向后不會帶上code參數,僅會帶上state參數redirect_uri?state=STATE
code說明 : code作為換取access_token的票據,每次用戶授權帶上的code將不一樣,code只能使用一次,5分鐘未被使用自動過期。
4.通過code獲取網頁授權access_token
在上一步獲取code后,請求以下鏈接獲取access_token: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
| 參數 | 是否必須 | 說明 |
|---|---|---|
| appid | 是 | 公眾號的唯一標識 |
| secret | 是 | 公眾號的appsecret |
| code | 是 | 填寫第一步獲取的code參數 |
| grant_type | 是 | 填寫為authorization_code |
返回說明
正確時返回的JSON數據包如下:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
| 參數 | 描述 |
|---|---|
| access_token | 網頁授權接口調用憑證,注意:此access_token與基礎支持的access_token不同 |
| expires_in | access_token接口調用憑證超時時間,單位(秒) |
| refresh_token | 用戶刷新access_token |
| openid | 用戶唯一標識,請注意,在未關注公眾號時,用戶訪問公眾號的網頁,也會產生一個用戶和公眾號唯一的OpenID |
| scope | 用戶授權的作用域,使用逗號(,)分隔 |
5.拉取用戶信息
如果網頁授權作用域為snsapi_userinfo,則此時開發者可以通過access_token和openid拉取用戶信息了。
請求方法
http:GET(請使用https協議) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
參數說明
| 參數 | 描述 |
|---|---|
| access_token | 網頁授權接口調用憑證,注意:此access_token與基礎支持的access_token不同 |
| openid | 用戶的唯一標識 |
| lang | 返回國家地區語言版本,zh_CN 簡體,zh_TW 繁體,en 英語 |
返回說明
正確時返回的JSON數據包如下:
{
"openid":" OPENID",
" nickname": NICKNAME,
"sex":"1",
"province":"PROVINCE"
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
"privilege":[
"PRIVILEGE1"
"PRIVILEGE2"
]
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
后端簡單代碼如下:
/**
* 獲取微信登錄用戶信息
* @param code
* @param request
* @param response
* @throws IOException
* @throws ServletException
*/
@RequestMapping(value= "vote/getCode")
public void getCode(String code,HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException{
System. out.println(code);
//https://open.weixin.qq.com/connect/oauth2/authorize?appid=XXXXXXX&redirect_uri=http://192.168.246.172/business/vote/getCode.do&response_type=code&scope=snsapi_userinfo &state=STATE#wechat_redirect
//格式https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
//1.通過code換取網頁授權access_token的URL連接
tokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" +WeixinConf.AppID+"&secret="+WeixinConf. AppSecret+ "&code="+code+ "&grant_type=authorization_code";
//System.out.println("拼接后的token連接:" + tokenUrl);
//獲取access_token
token = WebUtils. getUrlReturnData(tokenUrl);
access_token = token.substring( token.indexOf( "":"") + 3 , token.indexOf( "",""));
openId = token.substring( token.indexOf( "openid":"")+9,token .indexOf("","scope"" ));
//2.獲取用戶信息 請求格式:https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
String userUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" +access_token +"&openid=" +openId +"&lang=zh_CN" ;
String userInfo = WebUtils. getUrlReturnData(userUrl);
nickname = userInfo.substring(userInfo.indexOf("nickname":"" )+11,userInfo.indexOf("","sex" ));
sex = userInfo.substring(userInfo.indexOf("sex":" )+5,userInfo.indexOf(","language":"" ));
headimgurl = userInfo.substring(userInfo.indexOf(""headimgurl":"" )+14,userInfo.indexOf("","privilege"" ));
System. out.println( " token = " + token);
System. out.println( "access_token = " + access_token );
System. out.println( "openID = "+ openId);
System. out.println( "userInfo = " + userInfo);
System. out.println( "nickname = " + nickname);
System. out.println( "sex = " + sex);
System. out.println( "imgurl = " + headimgurl);
if(code == null || "".equals(code) || token == null || "".equals(token ) || userInfo == null || "".equals(userInfo)){
//登錄失敗,用戶重新登錄,從新拉取用戶信息
String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxfb42d3d1c8d4c11b&redirect_uri=http://192.168.246.172/business/vote/getCode.do&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect" ;
response.sendRedirect(url);
} else{
//登錄成功后要跳到的頁面
response.sendRedirect( "http://192.168.246.172/business/index.html" );
}
}
測試結果圖如下:
注:
1.此為網頁授權獲取用戶基本信息,必須為服務號,訂閱號是沒有權限通過網頁授權來獲取用戶基本信息的
2.必須是80端口
3.用戶授權獲取code連接必須在微信客戶端打開
4.開發者中心的服務器配置可以不用啟用,最后我還是成功的獲取到了用戶的信息
總結
以上是生活随笔為你收集整理的微信公众平台--服务号/订阅号--网页授权获取用户基本信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求最大子数组03
- 下一篇: [奉献]通过命令快速启动应用程序的小软件