业务需求上来了,这些都是必要的获取,特别是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对于解决实际问题好用了许多
参考链接:
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(图片借用地址)