免费男女视频_国产系列 视频二区_羞羞视频免费入口网站_久国久产久精永久网页_国产免费观看av_一区二区三区日韩在线观看

微信JS-SDK获取signature签名以及config配置

微信的JS-SDK通過config接口注入權(quán)限驗證配置,官網(wǎng)上的文檔說的很清楚:

Js代碼  收藏代碼
  1. wx.config({  
  2.     debug: true// 開啟調(diào)試模式,調(diào)用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會通過log打出,僅在pc端時才會打印。  
  3.     appId: ''// 必填,公眾號的唯一標(biāo)識  
  4.     timestamp: , // 必填,生成簽名的時間戳  
  5.     nonceStr: ''// 必填,生成簽名的隨機串  
  6.     signature: '',// 必填,簽名,見附錄1  
  7.     jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表見附錄2  
  8. });  
 上面的幾個參數(shù),對于像我這樣子的初學(xué)者而言,不簡單,所以在弄這塊的時候沒少碰釘子,這里說一下。

 

先說那個最煩人的signature,官網(wǎng)附錄1是這么說的:

-------------------------------------------------------------------------------------------------------------------------------------

jsapi_ticket

生成簽名之前必須先了解一下jsapi_ticket,jsapi_ticket是公眾號用于調(diào)用微信JS接口的臨時票據(jù)。正常情況下,jsapi_ticket的有效期為7200秒,通過access_token來獲取。由于獲取jsapi_ticket的api調(diào)用次數(shù)非常有限,頻繁刷新jsapi_ticket會導(dǎo)致api調(diào)用受限,影響自身業(yè)務(wù),開發(fā)者必須在自己的服務(wù)全局緩存jsapi_ticket 。

1、參考以下文檔獲取access_token(有效期7200秒,開發(fā)者必須在自己的服務(wù)全局緩存access_token):../15/54ce45d8d30b6bf6758f68d2e95bc627.html

2、用第一步拿到的access_token 采用http GET方式請求獲得jsapi_ticket(有效期7200秒,開發(fā)者必須在自己的服務(wù)全局緩存jsapi_ticket):https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi

成功返回如下JSON:

Js代碼  收藏代碼
  1. {  
  2. "errcode":0,  
  3. "errmsg":"ok",  
  4. "ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",  
  5. "expires_in":7200  
  6. }  
 獲得jsapi_ticket之后,就可以生成JS-SDK權(quán)限驗證的簽名了。

 

簽名算法

簽名生成規(guī)則如下:參與簽名的字段包括noncestr(隨機字符串), 有效的jsapi_ticket, timestamp(時間戳), url(當(dāng)前網(wǎng)頁的URL,不包含#及其后面部分) 。對所有待簽名參數(shù)按照字段名的ASCII 碼從小到大排序(字典序)后,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串string1。這里 需要注意的是所有參數(shù)名均為小寫字符。對string1作sha1加密,字段名和字段值都采用原始值,不進行URL 轉(zhuǎn)義。


即signature=sha1(string1)。 示例:

  • noncestr=Wm3WZYTPz0wzccnW
  • jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg
  • timestamp=1414587457
  • url=http://mp.weixin.qq.com?params=value

步驟1. 對所有待簽名參數(shù)按照字段名的ASCII 碼從小到大排序(字典序)后,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串string1:

jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW&timestamp=1414587457&url=http://mp.weixin.qq.com?params=value

 

步驟2. 對string1進行sha1簽名,得到signature:

0f9de62fce790f9a083d5c99e95740ceb90c27ed

 

注意事項:

1、簽名用的noncestr和timestamp必須與wx.config中的nonceStr和timestamp相同。
2、簽名用的url必須是調(diào)用JS接口頁面的完整URL。
3、出于安全考慮,開發(fā)者必須在服務(wù)器端實現(xiàn)簽名的邏輯。

-------------------------------------------------------------------------------------------------------------------------------------

以上的東西加起來就是四步:

1、使用APPID和APPSecret獲取access_token;

2、使用access_token獲取jsapi_ticket ;

3、用時間戳、隨機數(shù)、jsapi_ticket和要訪問的url按照簽名算法拼接字符串;

4、對第三步的字符串進行SHA1加密,得到簽名。

 

第一步、獲取access_token

這里是官網(wǎng)的說法,可以看看。

以下是我的代碼實現(xiàn):

Java代碼  收藏代碼
  1. public static String getAccessToken() {  
  2.     String access_token = "";  
  3.     String grant_type = "client_credential";//獲取access_token填寫client_credential   
  4.     String AppId="APPID";//第三方用戶唯一憑證  
  5.     String secret="APPSECRET";//第三方用戶唯一憑證密鑰,即appsecret   
  6.     //這個url鏈接地址和參數(shù)皆不能變  
  7.     String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type="+grant_type+"&appid="+AppId+"&secret="+secret;  
  8.        
  9.     try {  
  10.         URL urlGet = new URL(url);  
  11.         HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();  
  12.         http.setRequestMethod("GET"); // 必須是get方式請求  
  13.         http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");  
  14.         http.setDoOutput(true);  
  15.         http.setDoInput(true);  
  16.         System.setProperty("sun.net.client.defaultConnectTimeout""30000");// 連接超時30秒  
  17.         System.setProperty("sun.net.client.defaultReadTimeout""30000"); // 讀取超時30秒  
  18.         http.connect();  
  19.         InputStream is = http.getInputStream();  
  20.         int size = is.available();  
  21.         byte[] jsonBytes = new byte[size];  
  22.         is.read(jsonBytes);  
  23.         String message = new String(jsonBytes, "UTF-8");  
  24.         JSONObject demoJson = JSONObject.fromObject(message);  
  25.         System.out.println("JSON字符串:"+demoJson);  
  26.         access_token = demoJson.getString("access_token");  
  27.         is.close();  
  28.     } catch (Exception e) {  
  29.             e.printStackTrace();  
  30.     }  
  31.     return access_token;  
  32. }  

APPID和APPSECRET可以去微信公眾平臺---“開發(fā)----基本配置”中查找。

 

第二步、獲取jsapi_ticket

Java代碼  收藏代碼
  1. public static String getTicket(String access_token) {  
  2.     String ticket = null;  
  3.     String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+ access_token +"&type=jsapi";//這個url鏈接和參數(shù)不能變  
  4.     try {  
  5.         URL urlGet = new URL(url);  
  6.         HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();  
  7.         http.setRequestMethod("GET"); // 必須是get方式請求  
  8.         http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");  
  9.         http.setDoOutput(true);  
  10.         http.setDoInput(true);  
  11.         System.setProperty("sun.net.client.defaultConnectTimeout""30000");// 連接超時30秒  
  12.         System.setProperty("sun.net.client.defaultReadTimeout""30000"); // 讀取超時30秒  
  13.         http.connect();  
  14.         InputStream is = http.getInputStream();  
  15.         int size = is.available();  
  16.         byte[] jsonBytes = new byte[size];  
  17.         is.read(jsonBytes);  
  18.         String message = new String(jsonBytes, "UTF-8");  
  19.         JSONObject demoJson = JSONObject.fromObject(message);  
  20.         System.out.println("JSON字符串:"+demoJson);  
  21.         ticket = demoJson.getString("ticket");  
  22.         is.close();  
  23.     } catch (Exception e) {  
  24.             e.printStackTrace();  
  25.     }  
  26.     return ticket;  
  27. }  

 

拿到了jsapi_ticket之后就要參數(shù)名排序和拼接字符串,并加密了。以下為sha1的加密算法:

Java代碼  收藏代碼
  1. public static String SHA1(String decript) {  
  2.     try {  
  3.         MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");  
  4.         digest.update(decript.getBytes());  
  5.         byte messageDigest[] = digest.digest();  
  6.         // Create Hex String  
  7.         StringBuffer hexString = new StringBuffer();  
  8.         // 字節(jié)數(shù)組轉(zhuǎn)換為 十六進制 數(shù)  
  9.             for (int i = 0; i < messageDigest.length; i++) {  
  10.                 String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);  
  11.                 if (shaHex.length() < 2) {  
  12.                     hexString.append(0);  
  13.                 }  
  14.                 hexString.append(shaHex);  
  15.             }  
  16.             return hexString.toString();  
  17.    
  18.         } catch (NoSuchAlgorithmException e) {  
  19.             e.printStackTrace();  
  20.         }  
  21.         return "";  
  22. }  

加密算法轉(zhuǎn)載自:http://www.open-open.com/lib/view/open1392185662160.html

 

獲取簽名:

Java代碼  收藏代碼
  1. public static void main(String[] args) {  
  2.     //1、獲取AccessToken  
  3.     String accessToken = getAccessToken();  
  4.       
  5.     //2、獲取Ticket  
  6.     String jsapi_ticket = getTicket(accessToken);  
  7.       
  8.     //3、時間戳和隨機字符串  
  9.     String noncestr = UUID.randomUUID().toString().replace("-""").substring(016);//隨機字符串  
  10.     String timestamp = String.valueOf(System.currentTimeMillis() / 1000);//時間戳  
  11.       
  12.     System.out.println("accessToken:"+accessToken+"\njsapi_ticket:"+jsapi_ticket+"\n時間戳:"+timestamp+"\n隨機字符串:"+noncestr);  
  13.       
  14.     //4、獲取url  
  15.     String url="http://www.luiyang.com/add.html";  
  16.     /*根據(jù)JSSDK上面的規(guī)則進行計算,這里比較簡單,我就手動寫啦 
  17.     String[] ArrTmp = {"jsapi_ticket","timestamp","nonce","url"}; 
  18.     Arrays.sort(ArrTmp); 
  19.     StringBuffer sf = new StringBuffer(); 
  20.     for(int i=0;i<ArrTmp.length;i++){ 
  21.         sf.append(ArrTmp[i]); 
  22.     } 
  23.     */  
  24.       
  25.     //5、將參數(shù)排序并拼接字符串  
  26.     String str = "jsapi_ticket="+jsapi_ticket+"&noncestr="+noncestr+"&timestamp="+timestamp+"&url="+url;  
  27.      
  28.     //6、將字符串進行sha1加密  
  29.     String signature =SHA1(str);  
  30.     System.out.println("參數(shù):"+str+"\n簽名:"+signature);  
  31. }  

 

 該要的都有了,再次回到最開始的config配置,此時應(yīng)該為:

Js代碼  收藏代碼
  1. wx.config({  
  2.     debug: true//調(diào)試階段建議開啟  
  3.     appId: "APPID",//APPID  
  4.     timestamp: "timestamp",//上面main方法中拿到的時間戳timestamp  
  5.     nonceStr: "nonceStr",//上面main方法中拿到的隨機數(shù)nonceStr  
  6.     signature: "signature",//上面main方法中拿到的簽名signature  
  7.     jsApiList: [  
  8.            //所有要調(diào)用的 API 都要加到這個列表中  
  9.           "chooseImage"//從本地的相冊、圖庫選擇圖片  
  10.     ]  
  11. });  

 以上的時間戳、隨機數(shù)、簽名一定要跟main方法中獲取到的一致,否則會報invalid signature錯誤。

另外,這個簽名的有效時間為7200秒,也就是2個小時,因此當(dāng)超過兩個小時候,再訪問也會報invalid signature錯誤。

 

另外還有一個錯誤:invalid url domain

這個跟生成簽名時用的url有關(guān)系,官網(wǎng)的說法是:

invalid url domain當(dāng)前頁面所在域名與使用的appid沒有綁定,請確認正確填寫綁定的域名,如果使用了端口號,則配置的綁定域名也要加上端口號(一個appid可以綁定三個有效域名)

這個url必須是:“公眾號設(shè)置---功能設(shè)置----JS接口安全域名”中綁定的三個域名之一

 

若是以上的配置沒有問題,且dubug也設(shè)置為了true,那么再訪問的時候,就會出現(xiàn)一個config:ok,這就說明配置成功了。

主站蜘蛛池模板: 免费观看国产视频 | 国产成年人在线观看 | 亚洲第一色片 | 成人免费观看av | 成人国产在线视频 | 黄色毛片观看 | 久草在线观看福利视频 | www.成人在线 | 国产一区在线观看视频 | 色婷婷一区二区三区 | av国产片 | 欧美一级小视频 | 成人毛片免费播放 | 欧美人与zoxxxx另类9 | 国产精品免费一区二区 | asiass极品裸体女pics | 日韩黄色在线播放 | 9999久久| 国产自在线 | 爱草成年 | 丁香天堂网 | 国产午夜精品久久久 | a级在线 | 99国产精成人午夜视频一区二区 | 伊人午夜 | 国产午夜亚洲精品 | 日韩一级毛毛片 | 成人三级视频网站 | 久久精品视频首页 | 蜜桃视频在线免费观看 | 亚洲第一视频在线 | 欧美精品一区二区久久久 | 羞羞的视频在线观看 | 久久久久久麻豆 | 久草在线综合网 | 在线播放免费播放av片 | 亚洲成人在线免费观看 | 亚洲一二区精品 | 成年片在线观看 | 亚洲视频在线网 | 日韩黄色一级视频 |