1. 程式人生 > >[JAVA]微信的請求重發解決辦法

[JAVA]微信的請求重發解決辦法

最近給客戶做了個微信公眾號,其中在選單上配置的查詢功能需要訪問客戶系統介面獲取資料;

微信端的http請求在一定時間內(微信開發文件中寫的是5s,實際開發檢視報文是7s)無法得到返回的話會重發此請求。

微信的請求中會帶有一個code引數用於再次請求微信伺服器獲取微信使用者資訊,重發請求傳送的也是相同的code;

而這個code是一次性的,action在接到重發請求時無法通過相同的code再次獲取微信使用者資訊。

專案會先通過code獲取微信使用者的OpenID,再查詢客戶系統介面。

但客戶的系統介面查詢比較慢,大約30秒左右,所以第一次的查詢通過code獲得了微信使用者的openID並等待客戶系統返回查詢結果時候,微信會用相同的code發起重發請求;

而重發請求的code由於已經被使用過,是無法獲得微信使用者的OpenID的,所以系統會先於第一次查詢返回給微信client端一個查詢失敗的結果頁,導致查詢功能不能使用。

由此,想出了以下的解決方案:

1.聯絡客戶系統提升介面速度

——聯絡過客戶進行優化,速度沒有提升

2.聯絡微信客服嘗試修改重發時間限制

——微信客服沒有迴應

3.儲存code,並過濾掉相同code的重發請求

——用filter和servlet寫demo測試沒有能成功實現攔截請求,總是會返回一個空白頁面

4.增加loading頁面相應微信端請求,再非同步執行查詢action

——這裡的實現上有很多種:

4.1在原有頁面中增加loading蒙版,並使用AJAX非同步請求Action查詢

——原來的頁面使用JSTL獲取資料,改由使用AJAX傳遞JSON與Action進行資料互動的話,頁面的獲取方式和Action類的返回方式都需要重寫

4.2新建loading頁面

實現後發現這種辦法比我想象的簡單,單獨的一個頁面實現loading的js效果,並且在頁面中加入如下的邏輯先獲取微信使用者的OpenID:

WeiXinClient weixin = new WeiXinClient ();
String OpenID = weixin.getOpenId(request);

並在頁面中加入如下JS程式碼即可實現效果:

	$(document).ready(function(){
		modal_loading();
		document.location.href="/action/getInfo?OpenID=<%=OpenID%>";
	});	 

modal_loading();是頁面loading的JS方法,這部分JS原始碼的實現方式我沒看懂,網上應該有很多類似JS功能程式碼;

Action類中的邏輯執行完成後會直接跳轉到結果展示頁,這樣原來的Action和展示頁面都不用改。

附:WeiXinClient中的功能程式碼,感謝實現這部分功能的我的同事:-P:

	public static String getOpenId(HttpServletRequest req){
		String code = req.getParameter("code");//獲取code
		String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+"公眾號的AppId"+"&secret="+"公眾號AppSecret"+"&code="+code+"&grant_type=authorization_code";
		JSONObject json = CommonUtil.httpsRequest(url, "GET", null);
		String openId = (String)json.get("openid");
		return openId;
	}