微信公眾號之授權獲取使用者資訊(獲取unionid)
業務需求上來了,這些都是必要的獲取,特別是unionid,這裡使用的依然是IJPay,畢竟封裝好用嘛,頂一下,說一下大概流程
若要獲取使用者資訊需要scope=snsapi_userinfo,當然,備案的域名是必不可少的,在公眾平臺的網頁授權中設定好,必須使用80埠,不明白可以看上篇文章
1、使用者點選授權頁面URL,將向伺服器發起請求
伺服器詢問使用者是否同意授權給微信公眾賬號(scope為snsapi_base時無此步驟)
使用者同意(scope為snsapi_base時無此步驟,不彈出授權頁面,直接跳轉,只能獲取使用者openid)
伺服器將code引數通過回撥傳給微信公眾賬號
微信公眾賬號獲得code引數
2、微信公眾賬號通過code引數向伺服器請求Access Token
伺服器返回Access Token和OpenID給微信公眾賬號
3、微信公眾賬號通過Access Token向伺服器請求使用者資訊(scope為snsapi_base時無此步驟)
伺服器將使用者資訊回送給微信公眾賬號(scope為snsapi_base時無此步驟)
使用者在點選時可以直接請求授權toOauth.do
//授權頁面 @RequestMapping("/toOauth.do") public void toOauth(HttpServletResponse response) throws IOException { System.out.println("--tooauth--"); String calbackUrl="http://www.xxx.cn/PayGame/wc/accessToken.do"; String url = SnsAccessTokenApi.getAuthorizeURL(appID,calbackUrl,"111",false); System.out.println("--url--"+url); response.sendRedirect(url); }
請求的url已經封裝,形式如下:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
封裝的getAuthorizeURL方法如下
public static String getAuthorizeURL(String appId, String redirectUri, String state, boolean snsapiBase)
第一個引數是appId,第二個引數是回撥,第三個是state,第四個用於判斷應用授權作用域
if (snsapiBase) {
params.put("scope", "snsapi_base");
} else {
params.put("scope", "snsapi_userinfo");
}
應用授權作用域,snsapi_base (不彈出授權頁面,直接跳轉,只能獲取使用者openid),snsapi_userinfo (彈出授權頁面,可通過openid拿到暱稱、性別、所在地。並且,即使在未關注的情況下,只要使用者授權,也能獲取其資訊)
//獲取個人資訊
@RequestMapping("/accessToken.do")
public ModelAndView accessToken(HttpServletRequest request,HttpServletResponse response,Users users){
ModelAndView model=new ModelAndView();
int subscribe=0;
ModelAndView mv=new ModelAndView();
//獲取使用者的code
String code = request.getParameter("code");
String state=request.getParameter("state");
String openId=null;
// List<Object> list = accessToken(code);
//通過code換取網頁授權access_token
SnsAccessToken snsAccessToken= SnsAccessTokenApi.getSnsAccessToken(appID,secret,code);
String token=snsAccessToken.getAccessToken();
openId=snsAccessToken.getOpenid();
//拉取使用者資訊(需scope為snsapi_userinfo)
ApiResult apiResult=SnsApi.getUserInfo(token,openId);
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");
users.setNickName(nickName);
users.setSex(sex);
users.setCity(city);
users.setProvince(province);
users.setCountry(country);
users.setHeadimgurl(headimgurl);
users.setUnionid(unionid);
//獲取使用者資訊判斷是否關注
/*WxPayApiConfigKit.putApiConfig(getApiConfig());
ApiResult userInfo= UserApi.getUserInfo(openId);
if (userInfo.isSucceed()){
String userStr=userInfo.toString();
System.out.println("userStr---"+userStr);
subscribe=JSON.parseObject(userStr).getIntValue("subscribe");
System.out.println("subscribe-----"+subscribe);
}*/
}
model.setViewName("mainList");
model.addObject(users);
return model;
}
下面便是獲取到的個人資訊這裡需要注意,unionid只有繫結後才會出現,我掉坑了,繫結後如約出現
封裝好的就是好用,你只需知道如何獲取它,不再需要什麼都去查,不再把程式碼設計的亂七八糟了
說一下unionid和openid的區別:
同一個公司有多個公眾號需要互通,這就需要unionid來實現
unionid:unionid是唯一的,也就是說同一個公眾賬號的不同應用的unionid是相同的,但是openid在不同的應用下會不同,這樣unionid對於解決實際問題好用了許多
參考連結: