微信公众号之授权获取用户信息(获取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对于解决实际问题好用了许多


参考链接:

http://blog.csdn.net/zyw_java/article/details/61415123

http://www.huanju.org/biancheng/wechat/676408.html

http://blog.csdn.net/Panda_IAmGoodPanda/article/details/53739544(图片借用地址)

猜你喜欢

转载自blog.csdn.net/Goligory/article/details/78522721
今日推荐