微信公众号之授权获取用户信息(获取unionid)

来源:互联网 发布:二代身份证阅读软件 编辑:程序博客网 时间:2024/06/05 18:05

微信公众号支付

微信外浏览器支付

业务需求上来了,这些都是必要的获取,特别是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();//获取用户的codeString code = request.getParameter("code");String state=request.getParameter("state");String openId=null;//List<Object> list = accessToken(code);//通过code换取网页授权access_tokenSnsAccessToken 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(图片借用地址)

阅读全文
0 0
原创粉丝点击