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