程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> {"errcode":40097,"errmsg":"invalid args hint: [vjNe7xxxxxx8vr19]"}——記錄一次微信錯誤處理,errcode40097

{"errcode":40097,"errmsg":"invalid args hint: [vjNe7xxxxxx8vr19]"}——記錄一次微信錯誤處理,errcode40097

編輯:JAVA綜合教程

{"errcode":40097,"errmsg":"invalid args hint: [vjNe7xxxxxx8vr19]"}——記錄一次微信錯誤處理,errcode40097


錯誤情況概述:

啟動應用之後,微信調用 相機拍照 等接口是可以正常使用的, 但是過了一段時間(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 的參數有錯誤。

 

 

 

  

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved