微信開發(fā)交流群:148540125
系列文章參考地址 極速開發(fā)微信公眾號
歡迎留言、轉(zhuǎn)發(fā)仔涩、打賞
項目源碼參考地址 點我點我--歡迎Start
前幾篇文章已講完如何導(dǎo)入項目,如何啟動配置項目屁倔,如何成為開發(fā)者卵凑,重源碼分析消息是如何交互、如何自定義菜單(如果以上不是很清楚可以看這里 極速開發(fā)微信公眾號貌虾。這篇文章就來聊聊授權(quán)獲取用戶信息
一吞加、什么是OAuth2.0
這里整理了一篇文章 理解OAuth2.0
二、微信公眾平臺OAuth2.0授權(quán)詳細(xì)步驟
- 用戶關(guān)注微信公眾賬號(現(xiàn)在也可以不關(guān)注)尽狠。
- 微信公眾賬號提供用戶請求授權(quán)頁面URL衔憨。
- 用戶點擊授權(quán)頁面URL,將向服務(wù)器發(fā)起請求
- 服務(wù)器詢問用戶是否同意授權(quán)給微信公眾賬號(scope為snsapi_base時無此步驟)
- 用戶同意(scope為snsapi_base時無此步驟,不彈出授權(quán)頁面袄膏,直接跳轉(zhuǎn)践图,只能獲取用戶openid)
- 服務(wù)器將code參數(shù)通過回調(diào)傳給微信公眾賬號
- 微信公眾賬號獲得code參數(shù)
- 微信公眾賬號通過code參數(shù)向服務(wù)器請求Access Token
- 服務(wù)器返回Access Token和OpenID給微信公眾賬號
- 微信公眾賬號通過Access Token向服務(wù)器請求用戶信息(scope為snsapi_base時無此步驟)
- 服務(wù)器將用戶信息回送給微信公眾賬號(scope為snsapi_base時無此步驟)
三、配置授權(quán)回調(diào)頁面域名
沙盒號(測試號)回調(diào)地址支持域名和ip沉馆,正式公眾號回調(diào)地址只支持域名并且域名需使用字母平项、數(shù)字及“-”的組合赫舒,須通過ICP備案的驗證,不支持端口號及短鏈闽瓢。
測試號:找到 網(wǎng)頁授權(quán)獲取用戶基本信息>點擊修改>設(shè)置域名
服務(wù)號:找到 開發(fā)>接口權(quán)限>網(wǎng)頁授權(quán)獲取用戶基本信息>>點擊修改>設(shè)置域名
詳細(xì)介紹參考官方文檔
四接癌、用戶授權(quán)并獲取code ,使用code換取access_token 并使用access_token獲取用戶信息
授權(quán)訪問的URL:
具體封裝實現(xiàn)可以查看com.jfinal.weixin.sdk.api.SnsAccessTokenApi.getAuthorizeURL(....)
方法
之前博客使用Servlet 也寫了一個簡單的授權(quán)參考地址
五扣讼、使用封裝的接口實現(xiàn)授權(quán)獲取用戶信息
封裝之后使用就非常的簡單缺猛,SnsAccessTokenApi.getAuthorizeURL(....)
- 第一個參數(shù)為
appId
- 第二個參數(shù)為授權(quán)后回調(diào)的地址
http://域名/oauth
- 第三個參數(shù)為
state
重定向后會帶上state參數(shù),開發(fā)者可以填寫a-zA-Z0-9的參數(shù)值椭符,最多128字節(jié) 第四個參數(shù) 應(yīng)用授權(quán)作用域荔燎,簡單講是否彈出授權(quán)頁面 。true
為不彈出授權(quán)頁面
應(yīng)用授權(quán)作用域销钝,snsapi_base (不彈出授權(quán)頁面有咨,直接跳轉(zhuǎn),只能獲取用戶openid)蒸健,snsapi_userinfo (彈出授權(quán)頁面座享,可通過openid拿到昵稱、性別似忧、所在地渣叛。并且,即使在未關(guān)注的情況下盯捌,只要用戶授權(quán)淳衙,也能獲取其信息)
具體實現(xiàn)代碼如下
//跳轉(zhuǎn)到授權(quán)頁面
public void toOauth(){
String calbackUrl=PropKit.get("domain")+"/oauth";
String url=SnsAccessTokenApi.getAuthorizeURL(PropKit.get("appId"), calbackUrl, "111",false);
redirect(url);
}
oauth Controller 具體實現(xiàn)步驟如下:
- 當(dāng)用戶同意授權(quán),獲取code以及state
- 如果code不為null饺著,就可以通過code換取網(wǎng)頁授權(quán)access_token
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
- 拉取用戶信息(需scope為 snsapi_userinfo)
{
"openid":" OPENID",
" nickname": NICKNAME,
"sex":"1",
"province":"PROVINCE"
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ
4eMsv84eavHiaiceqxibJxCfHe/46",
"privilege":[ "PRIVILEGE1" "PRIVILEGE2" ],
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
- 獲取用戶信息之后可以根據(jù)上面的state跳轉(zhuǎn)到不同的頁面
具體實現(xiàn)代碼如下
public class WeiXinOauthController extends ApiController{
static Log log = Log.getLog(WeiXinOauthController.class);
/**
* 如果要支持多公眾賬號箫攀,只需要在此返回各個公眾號對應(yīng)的 ApiConfig 對象即可
* 可以通過在請求 url 中掛參數(shù)來動態(tài)從數(shù)據(jù)庫中獲取 ApiConfig 屬性值
*/
public ApiConfig getApiConfig() {
ApiConfig ac = new ApiConfig();
// 配置微信 API 相關(guān)常量
ac.setToken(PropKit.get("token"));
ac.setAppId(PropKit.get("appId"));
ac.setAppSecret(PropKit.get("appSecret"));
/**
* 是否對消息進行加密,對應(yīng)于微信平臺的消息加解密方式:
* 1:true進行加密且必須配置 encodingAesKey
* 2:false采用明文模式幼衰,同時也支持混合模式
*/
ac.setEncryptMessage(PropKit.getBoolean("encryptMessage", false));
ac.setEncodingAesKey(PropKit.get("encodingAesKey", "setting it in config file"));
return ac;
}
public void index() {
int subscribe=0;
//用戶同意授權(quán)靴跛,獲取code
String code=getPara("code");
String state=getPara("state");
if (code!=null) {
String appId=ApiConfigKit.getApiConfig().getAppId();
String secret=ApiConfigKit.getApiConfig().getAppSecret();
//通過code換取網(wǎng)頁授權(quán)access_token
SnsAccessToken snsAccessToken=SnsAccessTokenApi.getSnsAccessToken(appId,secret,code);
// String json=snsAccessToken.getJson();
String token=snsAccessToken.getAccessToken();
String openId=snsAccessToken.getOpenid();
//拉取用戶信息(需scope為 snsapi_userinfo)
ApiResult apiResult=SnsApi.getUserInfo(token, openId);
log.warn("getUserInfo:"+apiResult.getJson());
if (apiResult.isSucceed()) {
JSONObject jsonObject=JSON.parseObject(apiResult.getJson());
String nickName=jsonObject.getString("nickname");
//用戶的性別,值為1時是男性塑顺,值為2時是女性,值為0時是未知
int sex=jsonObject.getIntValue("sex");
String city=jsonObject.getString("city");//城市
String province=jsonObject.getString("province");//省份
String country=jsonObject.getString("country");//國家
String headimgurl=jsonObject.getString("headimgurl");
String unionid=jsonObject.getString("unionid");
//獲取用戶信息判斷是否關(guān)注
ApiResult userInfo = UserApi.getUserInfo(openId);
log.warn(JsonKit.toJson("is subsribe>>"+userInfo));
if (userInfo.isSucceed()) {
String userStr = userInfo.toString();
subscribe=JSON.parseObject(userStr).getIntValue("subscribe");
}
Users.me.save(openId, WeiXinUtils.filterWeixinEmoji(nickName), unionid, headimgurl, country, city, province, sex);
}
setSessionAttr("openId", openId);
if (subscribe==0) {
redirect(PropKit.get("subscribe_rul"));
}else {
//根據(jù)state 跳轉(zhuǎn)到不同的頁面
if (state.equals("2222")) {
redirect("http://www.cnblogs.com/zyw-205520/");
}else {
redirect("/login");
}
}
}else {
renderText("code is null");
}
}
}
以上是授權(quán)獲取用戶信息的全過程俏险。
歡迎留言严拒、轉(zhuǎn)發(fā)、打賞
項目源碼參考地址 點我點我--歡迎Start