最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

微信js sdk invalid signature簽名錯誤問題的解決方法分析

 更新時間:2019年04月08日 14:12:36   作者:Oscarfff  
這篇文章主要介紹了微信js sdk invalid signature簽名錯誤問題的解決方法,結(jié)合實例形式分析了微信簽名錯誤問題相關(guān)解決方法,需要的朋友可以參考下

本文實例講述了微信js sdk invalid signature簽名錯誤問題的解決方法。分享給大家供大家參考,具體如下:

/**最近在做微信js sdk 接口調(diào)用說明*/
***相信很多人都遇見像我這樣的問題,再加上自己只能算是半個程序員,所以苦苦摸索了好久終于搞懂了。
****下面就把自己所遇見的各種問題和大家分享一下,都是自己親手實驗過的********/

一、問題說明

如果出現(xiàn) invalid signature,首先可以確定的是你的簽名算法有問題。

建議:首先查看微信官方網(wǎng)站給出的解決方案,鏈接為 http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html

invalid signature簽名錯誤。建議按如下順序檢查:

2. 確認(rèn)簽名算法正確,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 頁面工具進(jìn)行校驗。也就是你自己后臺生成簽名要和微信校驗算法生成的簽名一致才可以(可能大小寫不同)

3. 注意:

簽名生成規(guī)則如下:

參與簽名的字段包括有效的 jsapi_ticket(獲取方式詳見微信 JSSDK 文檔), noncestr (隨機(jī)字符串,由開發(fā)者隨機(jī)生成),timestamp (由開發(fā)者生成的當(dāng)前時間戳), url(當(dāng)前網(wǎng)頁的URL,不包含#及其后面部分。注意:對于沒有只有域名沒有 path 的 URL ,瀏覽器會自動加上 / 作為 path,如打開 http://qq.com 則獲取到的 URL 為 http://qq.com/)。

特別注意:你在利用參數(shù)生成簽名的時候,要對所有待簽名參數(shù)按照字段名的 ASCII 碼從小到大排序(字典序)后,使用 URL 鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串 string1。這里需要注意的是所有參數(shù)名均為小寫字符。

我的最開始的錯誤就是沒有注意到生成簽名的那幾個參數(shù)要按照key=value的樣式連接成一個字符串,然后在sha1加密生成。

/****Java寫的參數(shù)拼接算法***/
String[] paramArr = new String[] { "jsapi_ticket=" + jsapi_ticket,
        "timestamp=" + timestamp, "noncestr=" + nonce, "url=" + jsurl };
Arrays.sort(paramArr);
// 將排序后的結(jié)果拼接成一個字符串
String content = paramArr[0].concat("&"+paramArr[1]).concat("&"+paramArr[2])
        .concat("&"+paramArr[3]);
System.out.println("拼接之后的content為:"+content);

4. 確認(rèn)config中nonceStr(js中駝峰標(biāo)準(zhǔn)大寫S), timestamp與用以簽名中的對應(yīng)noncestr, timestamp一致。

5. 確認(rèn)url是頁面完整的url(請在當(dāng)前頁面alert(location.href.split('#')[0])確認(rèn)),包括'http(s)://'部分,以及'?'后面的GET參數(shù)部分,但不包括'#'hash后面的部分。

6. 確認(rèn) config 中的 appid 與用來獲取 jsapi_ticket 的 appid 一致。

7. 確保一定緩存access_token和jsapi_ticket。

8. 確保你獲取用來簽名的url是動態(tài)生成的,動態(tài)頁面可參見實例代碼中php的實現(xiàn)方式。如果是html的靜態(tài)頁面在前端通過ajax將url傳到后臺簽名,前端需要用js獲取當(dāng)前頁面除去'#'hash部分的鏈接(可用location.href.split('#')[0]獲?。驗轫撁嬉坏┓窒?,微信客戶端會在你的鏈接末尾加入其它參數(shù),如果不是動態(tài)獲取當(dāng)前鏈接,將導(dǎo)致分享后的頁面簽名失敗。

錯誤2、每次后臺網(wǎng)頁更新之后,微信訪問效果沒有出來。

問題:手機(jī)端,網(wǎng)頁緩沖導(dǎo)致。

解決方案:重啟手機(jī),再試一下。

錯誤3、微信分享接口,可以在自己的網(wǎng)頁上面自定義一個按鈕,當(dāng)用戶點擊的時候完成分享。

問題:我最開始也是這樣想的,后來發(fā)現(xiàn),原來不是這樣的,只有當(dāng)你用微信客戶端打開,在最上面右邊的 “分享到朋友圈”按鈕按的時候效果才會出來。

錯誤4、微信圖像接口 permission denied

首先查看微信給出的錯誤說明:該公眾號沒有權(quán)限使用這個JSAPI(部分接口需要認(rèn)證之后才能使用)。

說明:只要通過了公眾號認(rèn)證,都不會有問題。

檢查對象:如果出現(xiàn)這個說明程序上基本上不會有問題 微信后臺已經(jīng)返回了數(shù)據(jù)。

第一、要檢查 你的config 文件中相應(yīng)的 jsapilist  是否包含了該接口喲。

/***用戶打開頁面的時候就加載**/
$(document).ready(function(){
initPage();
});
function initPage() {
//alert(window.location.href);/***用于獲得當(dāng)前連接url用**/
/***用戶點擊分享到微信圈后加載接口接口*******/
$.post("http://******",{"url":window.location.href},function(data,status){
data=eval("("+data+")");
wx.config({
     debug: false,
     appId: 'wxa7a1ad4cc5116437',
     timestamp:data.timestamp,
     nonceStr:data.noncestr,
     signature:data.signature,
     jsApiList: [
     'checkJsApi',
     'onMenuShareTimeline',
     'hideOptionMenu',
     ]
   });
wx.ready(function(){
  wx.hideOptionMenu();/***隱藏分享菜單****/ 
});
});
};

說明:這一塊我是通過寫一個方法,然后用戶用AJax 的post 獲得這樣的請求,然后參數(shù)是URL。

二、實例說明

獲得jsticket

public static String getjsTicket(String accesstoken) {
  String appid = "XXXXXXX";
  String appsecret = "XXXX";
  String result = "";
  String url = js_ticketurl.replace("ACCESS_TOKEN", accesstoken);
  System.out.println("查看js_url:" + url);
  // 調(diào)用接口返回json字符串
  JSONObject jsonObject = httpRequest(url, "GET", "");
  System.out.println("查看紅的js_ticket:" + jsonObject.toString());
  if (null != jsonObject) {
    result = jsonObject.getString("ticket");// 獲得ticket
    System.out.println("ticket為:" + result);
  }
  return result;
}

獲得signature

// 獲得js signature
  public static String getSignature(String jsapi_ticket, String timestamp,
      String nonce, String jsurl) throws IOException {
    /****
     * 對 jsapi_ticket、 timestamp 和 nonce 按字典排序 對所有待簽名參數(shù)按照字段名的 ASCII
     * 碼從小到大排序(字典序)后,使用 URL 鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串
     * string1。這里需要注意的是所有參數(shù)名均為小寫字符。 接下來對 string1 作 sha1 加密,字段名和字段值都采用原始值,不進(jìn)行
     * URL 轉(zhuǎn)義。即 signature=sha1(string1)。
     * **如果沒有按照生成的key1=value&key2=value拼接的話會報錯
     */
    String[] paramArr = new String[] { "jsapi_ticket=" + jsapi_ticket,
        "timestamp=" + timestamp, "noncestr=" + nonce, "url=" + jsurl };
    Arrays.sort(paramArr);
    // 將排序后的結(jié)果拼接成一個字符串
    String content = paramArr[0].concat("&"+paramArr[1]).concat("&"+paramArr[2])
        .concat("&"+paramArr[3]);
    System.out.println("拼接之后的content為:"+content);
    String gensignature = null;
    try {
      MessageDigest md = MessageDigest.getInstance("SHA-1");
      // 對拼接后的字符串進(jìn)行 sha1 加密
      byte[] digest = md.digest(content.toString().getBytes());
      gensignature = byteToStr(digest);
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    }
    // 將 sha1 加密后的字符串與 signature 進(jìn)行對比
    if (gensignature != null) {
      return gensignature;// 返回signature
    } else {
      return "false";
    }
    // return (String) (ciphertext != null ? ciphertext: false);
  }
  /**
   * 將字節(jié)數(shù)組轉(zhuǎn)換為十六進(jìn)制字符串
   *
   * @param byteArray
   * @return
   */
  private static String byteToStr(byte[] byteArray) {
    String strDigest = "";
    for (int i = 0; i < byteArray.length; i++) {
      strDigest += byteToHexStr(byteArray[i]);
    }
    return strDigest;
  }
  /**
   * 將字節(jié)轉(zhuǎn)換為十六進(jìn)制字符串
   *
   * @param mByte
   * @return
   */
  private static String byteToHexStr(byte mByte) {
    char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
        'B', 'C', 'D', 'E', 'F' };
    char[] tempArr = new char[2];
    tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
    tempArr[1] = Digit[mByte & 0X0F];
    String s = new String(tempArr);
    return s;
  }

希望本文所述對大家微信程序設(shè)計有所幫助。

相關(guān)文章

  • Java工程使用ffmpeg進(jìn)行音視頻格式轉(zhuǎn)換的實現(xiàn)

    Java工程使用ffmpeg進(jìn)行音視頻格式轉(zhuǎn)換的實現(xiàn)

    FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計算機(jī)程序,本文主要介紹了Java工程使用ffmpeg進(jìn)行音視頻格式轉(zhuǎn)換的實現(xiàn)
    2024-02-02
  • 提升java開發(fā)效率工具lombok使用爭議

    提升java開發(fā)效率工具lombok使用爭議

    這篇文章主要介紹了提升java開發(fā)效率工具lombok使用爭議到底該不該使用的分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 關(guān)于Java 并發(fā)的 CAS

    關(guān)于Java 并發(fā)的 CAS

    后端開發(fā)鎖成為一個不可避免的話題,今天我們討論的是與之對應(yīng)的無鎖 CAS。本文會從怎么來的、是什么、怎么用、原理分析、遇到的問題等不同的角度帶你真正搞懂 CAS。
    2021-09-09
  • SpringBoot啟動及自動裝配原理過程詳解

    SpringBoot啟動及自動裝配原理過程詳解

    這篇文章主要介紹了SpringBoot啟動及自動裝配原理過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • Java listener簡介_動力節(jié)點Java學(xué)院整理

    Java listener簡介_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了Java listener簡介,可以用于統(tǒng)計用戶在線人數(shù)等,有興趣的可以了解一下
    2017-07-07
  • SpringBoot利用validation實現(xiàn)優(yōu)雅的校驗參數(shù)

    SpringBoot利用validation實現(xiàn)優(yōu)雅的校驗參數(shù)

    數(shù)據(jù)的校驗是交互式網(wǎng)站一個不可或缺的功能,如果數(shù)據(jù)庫中出現(xiàn)一個非法的郵箱格式,會讓運維人員頭疼不已。本文將介紹如何利用validation來對數(shù)據(jù)進(jìn)行校驗,感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2022-06-06
  • 如何為Spring Cloud Gateway加上全局過濾器

    如何為Spring Cloud Gateway加上全局過濾器

    這篇文章主要介紹了如何為Spring Cloud Gateway加上全局過濾器,幫助大家更好得理解和學(xué)習(xí)使用Gateway,感興趣的朋友可以了解下
    2021-03-03
  • Java輕松使用工具類實現(xiàn)獲取wav時間長度

    Java輕松使用工具類實現(xiàn)獲取wav時間長度

    在Java中,工具類定義了一組公共方法,這篇文章將介紹Java中使用工具類來獲取一個wav文件的時間長度,感興趣的同學(xué)繼續(xù)往下閱讀吧
    2021-10-10
  • 利用ClasserLoader實現(xiàn)jar包加載并調(diào)用里面的方法

    利用ClasserLoader實現(xiàn)jar包加載并調(diào)用里面的方法

    classloader即是類加載,虛擬機(jī)把描述類的數(shù)據(jù)從class字節(jié)碼文件加載到內(nèi)存,并對數(shù)據(jù)進(jìn)行檢驗、轉(zhuǎn)換解析和初始化,了解java的類加載機(jī)制,可以快速解決運行時的各種加載問題并快速定位其背后的本質(zhì)原因,本文介紹了如何利用ClasserLoader來實現(xiàn)jar包加載并調(diào)用里面的方法
    2024-09-09
  • Spring Boot集成kubernetes客戶端實現(xiàn)API操作k8s集群的方案

    Spring Boot集成kubernetes客戶端實現(xiàn)API操作k8s集群的方案

    Kubernetes是一個開源的容器編排平臺,可以自動化在部署、管理和擴(kuò)展容器化應(yīng)用過程中涉及的許多手動操作,這篇文章主要介紹了Spring Boot集成kubernetes客戶端實現(xiàn)API操作k8s集群,需要的朋友可以參考下
    2024-08-08

最新評論

华阴市| 静海县| 晴隆县| 平原县| 泰来县| 东源县| 丁青县| 榕江县| 垣曲县| 于都县| 开鲁县| 拉萨市| 沂源县| 军事| 中方县| 星子县| 东宁县| 元朗区| 翁源县| 深州市| 化德县| 潍坊市| 南康市| 固始县| 通江县| 咸宁市| 开阳县| 措美县| 夹江县| 宁陕县| 惠水县| 巨野县| 古田县| 洞口县| 泰宁县| 佳木斯市| 南召县| 江源县| 丰原市| 芦山县| 柳河县|