錯誤情況概述: 啟動應用之後,微信調用 相機拍照 等介面是可以正常使用的, 但是過了一段時間(2個小時左右--token/jsapi_ticket的過期時間),微信調用相機拍照的功能失效,啟用debug模式: //步驟三:通過config介面註入許可權驗證配置 wx.config({ debug: t ...
錯誤情況概述:
啟動應用之後,微信調用 相機拍照 等介面是可以正常使用的, 但是過了一段時間(2個小時左右--token/jsapi_ticket的過期時間),微信調用相機拍照的功能失效,啟用debug模式:
//步驟三:通過config介面註入許可權驗證配置
wx.config({
debug: true,
報錯:invalide signature....
利用調試介面調試:
http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign
在 jsapi_ticket: 輸入本次失敗時的jsapi_ticket, 紅色信息顯示:jsapi_ticket 過期!
所以原因顯然是 過了2個小時之後,jsapi_ticket的獲取失敗!
查看想代碼:
核心代碼:
@Override public void run() { while(true) { try{ HttpsURLConnection conn = HttpUtil.initHttpsConnection(accessTokenUrl, "GET"); String result = HttpUtil.getHttpsContent(conn, "utf-8"); JSONObject json = null; if(result != null) json = JSON.parseObject(result); if(json != null){ System.out.println("--------------AccessTokenJsapiTicketThread.222"); accessToken = new AccessToken(json.getString("access_token"), json.getLong("expires_in")); System.out.println(JSON.toJSONString(json)); // 再獲取jsapi_ticket jsapiTicketUrl += accessToken.getAccess_token() + "&type=jsapi"; conn = HttpUtil.initHttpsConnection(jUrl, "GET"); result = HttpUtil.getHttpsContent(conn, "utf-8"); if(result != null){ json = JSON.parseObject(result); if(json != null && json.getString("errmsg").equals("ok")){ jsapiTicket = new JsapiTicket(json.getString("errcode"), json.getString("errmsg"), json.getString("ticket"), json.getLong("expires_in")); System.out.println(JSON.toJSONString(json)); }else{ System.out.println(json.toJSONString()); System.out.println("get jsapiTicket failed----"); } } }else{ System.out.println("get access_token failed----"); } }catch(IOException e){ e.printStackTrace(); } System.out.println("--------------AccessTokenJsapiTicketThread.444"); try{ if(null != accessToken){ Thread.sleep(60 * 1000); // 如果access_token為null,60秒後再獲取 // Thread.sleep((accessToken.getExpire_in() - 200) * 1000); // 休眠7000秒 }else{ Thread.sleep(60 * 1000); // 如果access_token為null,60秒後再獲取 } }catch(InterruptedException e){ System.out.println("--------------AccessTokenJsapiTicketThread.555"); try{ Thread.sleep(60 * 1000); }catch(InterruptedException e1){ e1.printStackTrace(); } } } }
後臺是 servlet隨伺服器啟動的一個線程,每隔2小時運行一次,獲取 token 和 jsapi_ticket.
關鍵的地方,在第二次獲取 jsapi_ticket 的地址是有問題的:
jsapiTicketUrl += accessToken.getAccess_token() + "&type=jsapi";
這裡導致 第二次 獲取 jsapi_ticket 時,攜帶上了 第一次的 token,也就是攜帶上兩個 token.
第二次的地址變成了:
https://api.weixin.qq.com/cgi-bin/ticket/getticket
?access_token=
HETAdAEwtAsz3GDeKwBxSq3JZt9FrD99vJc2Bvnp5ZmfU7BDVUR78TznZ8oQLmIGOqXfXOPYaJ8OlXBEdwlulf-XGkF1_K9FeHFUGndNIUIUMHjAEAEWR
&type=jsapi
qNpzWXz_d7GT1vchxHUuz5g5jqrwBb2OR5CXd7LldeDGsCa-8d8WQZkfDA157tcn_NmPglp-92c5AqTyqXTcM7aVG-Shw586QYjxmMVyrUxfz-P2GspidfCGAoEwvUsrKSHeAAARZO&
type=jsapi
可以看到 重覆了 一次 access_token 參數。所以導致了 獲取 jsapiTicket 失敗。
修改就極其簡單了:
String tmpUrl = jsapiTicketUrl + accessToken.getAccess_token() + "&type=jsapi";
conn = HttpUtil.initHttpsConnection(tmpUrl, "GET");
result = HttpUtil.getHttpsContent(conn, "utf-8");
定義一個臨時變數,不要直接修改 jsapiTicketUrl 這個類的屬性了。
總結:第一次成功,後面都失敗,應該想到是第二次的參數有問題了。
網上看到很多人遇到{"errcode":40097,"errmsg":"invalid args hint: [vjNe7xxxxxx8vr19]"}這個錯誤,基本沒有有價值的信息。還是自己調試解決問題。
記錄下,方便其他遇到相同問題的筒子。該錯誤一定是:url 的參數有錯誤。