微信網(wǎng)頁授權(quán)文檔地址:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
微信網(wǎng)頁授權(quán)步驟:
一夺谁、用戶同意授權(quán)目木,獲取code
注:公眾號需要有授權(quán)作用域
url=https://open.weixin.qq.com/connect/oauth2/authorize?appid=公眾號唯一標(biāo)識&redirect_uri=回調(diào)地址&response_type=code&scope=授權(quán)作用域&state=STATE#wechat_redirect
授權(quán)流程:
1.用戶點擊公眾號菜單
調(diào)用鏈接url,用戶在同意授權(quán)之后,回調(diào)地址將會拿到code
注:每次用戶授權(quán)帶上的code將不一樣阱缓,code只能使用一次被辑,5分鐘未被使用自動過期。
2.將code發(fā)送至第三方網(wǎng)頁服務(wù)器(就是我們開發(fā)服務(wù)器的后端接口)
二、通過code赁酝,獲取openid,獲取用戶基本信息
url=https://api.weixin.qq.com/sns/oauth2/access_token?appid=公眾號唯一標(biāo)識&secret=公眾號的appsecret&code=第一步拿到的code&grant_type=authorization_code
后端拿到code之后旭等,使用Spring RestTemplate類 進(jìn)行請求
注:對于RestTemplate類的使用方法酌呆,請查看:
https://docs.spring.io/spring/docs/5.1.8.RELEASE/javadoc-api/
服務(wù)器后端處理code
// 注意替換appid、appsecret與code
String tokenURL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=公眾號唯一標(biāo)識&secret=公眾號的appsecret&code=第一步拿到的code&grant_type=authorization_code";
// 實例化RestTemplate對象
RestTemplate restTemplate = new RestTemplate();
// 調(diào)用RestTemplate對象的getForObject()方法搔耕,執(zhí)行url請求隙袁,獲得相應(yīng)結(jié)果
String tokenResponse = restTemplate.getForObject(tokenURL, String.class);
請求結(jié)果詳解:
// 請求結(jié)果樣例(請求正確痰娱,將返回一個json字符串)
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
此時拿到了access_token,可以進(jìn)行用戶信息的拉取
url=https://api.weixin.qq.com/sns/userinfo?access_token=獲取的access_token&openid=獲取的openid&lang=zh_CN
服務(wù)器后端請求獲取用戶信息
// 注意替換參數(shù)
String userinfoURL = "https://api.weixin.qq.com/sns/userinfo?access_token=獲取的access_token&openid=獲取的openid&lang=zh_CN";
// 調(diào)用RestTemplate對象的getForObject()方法菩收,執(zhí)行url請求梨睁,獲得相應(yīng)結(jié)果
String userinfoResponse = restTemplate.getForObject(userinfoURL, String.class);
請求結(jié)果詳解:
// 請求結(jié)果樣例(請求正確,將返回一個json字符串)
{
"openid":" OPENID",
" nickname": NICKNAME,
"sex":"1",
"province":"PROVINCE"
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
"privilege":[ "PRIVILEGE1" "PRIVILEGE2" ],
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
注:在獲取用戶信息的時候娜饵,微信使用ISO-8859-1編碼坡贺,需要進(jìn)行編碼轉(zhuǎn)化
// 注userinfoJson是將請求結(jié)果轉(zhuǎn)化為JSONObject
String nickname = new String(userinfoJson.getString("nickname").getBytes("ISO-8859-1"), "UTF-8");
到此,網(wǎng)頁授權(quán)結(jié)束