1. 程式人生 > >微信公眾號之授權獲取使用者資訊(獲取unionid)

微信公眾號之授權獲取使用者資訊(獲取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拿到暱稱、性別、所在地。並且,即使在未關注的情況下,只要使用者授權,也能獲取其資訊)


請求返回accessToken.do,根據code換取access_token和openid,根據返回的access_token和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對於解決實際問題好用了許多

參考連結: