1. 程式人生 > >微信網頁授權code請求多次回撥的坑

微信網頁授權code請求多次回撥的坑

在之前的專案裡需要用到微信授權,我也是一次第一次用,看著微信開發文件寫了,然後就掉進了一個坑裡。

剛開始在授權頁面寫的微信授權連結:

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";
}