微信OAuth方法获取用户信息的一些技巧:
当session失效时如何重新获取用户信息以及jsapi 签名
public ModelAndView goCreateOrder(HttpServletRequest request) {
String lang=request.getParameter("lang"); //应用自定义的参数
String code=request.getParameter("code"); //oauth 返回值
String state=request.getParameter("state"); //oauth 返回值
ModelAndView mv=new ModelAndView();
//当前页面的基础URL
String url=bundler.getString("domain")+"/smp/wxuserorder.do?goCreateOrder";
try{
//先判断是否应用参数传进来
if(lang!=null){
url=url+"&lang="+lang;
}
//判断用户是否有session
WxMpUser wxuser=(WxMpUser)request.getSession().getAttribute("WXMPUSER");
if(wxuser==null){
//用户没有正常通过oAuth进来或者session丢失,自动redirect 到oAuth路径,重新登录
if(code==null||code.isEmpty()){
//构建一个oauth url
String redirectUrl=wxMpService.oauth2buildAuthorizationUrl(url,WxConsts.OAUTH2_SCOPE_USER_INFO, "state");
logger.debug("----------------redirect url:"+redirectUrl);
//注意redirect: 之后没有"/" ,意思是redirect 到微信的OAUTH URL
return new ModelAndView("redirect:"+redirectUrl);
}
//二次oauth 回来之后,重新获取AccessCode -> 换取
WxMpOAuth2AccessToken wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);
WxMpUser wxMpUser = this.wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, null);
request.getSession().setAttribute("WXMPUSER", wxMpUser);
}
//oauth 回来之后,会带上code 和state 这两个参数,在制造签名的时候需要加上,jsapi签名要求请求的地址和签名的地址一模一样不允许有任何的差异
if(code!=null){
url=url+"&code="+code;
}
if(state!=null){
url=url+"&state="+state;
}
logger.debug("----------------jsapi url:"+url);
WxJsapiSignature signature=this.wxMpService.createJsapiSignature(url);