微信網頁授權code請求多次回撥的坑
阿新 • • 發佈:2019-02-17
在之前的專案裡需要用到微信授權,我也是一次第一次用,看著微信開發文件寫了,然後就掉進了一個坑裡。
剛開始在授權頁面寫的微信授權連結:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx5250b8b9d4cfdf76&redirect_uri=(將code直接回調到業務controller)&response_type=code&scope=snsapi_userinfo&state=state#wechat_redirect';
我自己進行測試的時候,那是一點問題都沒,然後就叫同事過來一起測試下,問題就出現了。。。當時那是一臉的懵逼啊。。。
我去好好看了下微信開發文件也沒找到什麼有用的訊息。。。。。。。上網查了下有人說請求code會多次回撥。。。我開啟遠端debug走了幾圈還真是那麼一會事,在用code拿openId那邊那邊報錯了,這樣子我接下去的業務程式碼就執行不下去了。
然後我開始重新改造程式碼了,在到達真正業務controller前,先走一箇中間controller(這個來獲得回撥的code,去拿openId),然後重定向到真正的業務controller
修改後的程式碼
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx5250b8b9d4cfdf76&redirect_uri=(將code直接回調到中間controller)&response_type=code&scope=snsapi_userinfo&state=state#wechat_redirect';
中間controller
@RequestMapping("xxxxx") public void accreditBack(String data, Model model,HttpServletRequest request,HttpServletResponse response) throws Exception{ String code = request.getParameter("code"); String publishId = request.getParameter("state"); String contextPath = request.getContextPath();//獲取專案名 String url=contextPath+"/xxxx"; if(!StringUtils.isEmpty(code)){ WxCommoneUtils wxCommoneUtils =new WxCommoneUtils(); //String openId = wxCommoneUtils.getOpenId(code); JSONObject wxUserInfo = wxCommoneUtils.getWxUserInfo(code); String openId = wxUserInfo.getString("openid"); String headImgUrl = wxUserInfo.getString("headimgurl");//使用者頭像 // BASE64Encoder be =new BASE64Encoder(); // String encode = be.encode(headImgUrl.getBytes()); // String string = encode.replaceAll(" ", ""); url=url+"?"openId="+openId+"&headImgUrl="+headImgUrl; } response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); response.setHeader("Location",url); //清除快取 response.setHeader( "Connection", "close" ); response.setHeader( "Pragma", "no-cache" ); response.addHeader( "Cache-Control", "must-revalidate" ); response.addHeader( "Cache-Control", "no-cache" ); response.addHeader( "Cache-Control", "no-store" ); response.setDateHeader("Expires", 0); }
真正的業務controller
@RequestMapping(value="xxxxxxxx")
public String fxDetails( String openId, String headImgUrl,Model model,HttpSession session,HttpServletResponse response) throws IOException {
return "xxxxxxx";
}