基於weixin-java-mp 做微信JS簽名 invalid signature簽名錯誤 官方說明


    
    
    
            
微信JS簽名詳情請見:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN
獲取用戶基本信息 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

附錄5-常見錯誤及解決方法

調用config 接口的時候傳入參數 debug: true 可以開啟debug模式,頁面會alert出錯誤信息。以下為常見錯誤及解決方法:

1.invalid url domain當前頁面所在域名與使用的appid沒有綁定,請確認正確填寫綁定的域名,僅支持80(http)和443(https)兩個端口,因此不需要填寫端口號(一個appid可以綁定三個有效域名,見 ]目錄1.1.1)。


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

1.確認簽名算法正確,可用http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 頁面工具進行校驗。

2.確認config中nonceStr(js中駝峰標准大寫S), timestamp與用以簽名中的對應noncestr, timestamp一致。

采坑點: 
3.確認url是頁面完整的url(請在當前頁面alert(location.href.split('#')[0])確認),包括'http(s)://'部分,以及'?'后面的GET參數部分,但不包括'#'hash后面的部分。

4.確認 config 中的 appid 與用來獲取 jsapi_ticket 的 appid 一致。

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

6.確保你獲取用來簽名的url是動態獲取的,動態頁面可參見實例代碼中php的實現方式。如果是html的靜態頁面在前端通過ajax將url傳到后台簽名,前端需要用js獲取當前頁面除去'#'hash部分的鏈接(可用location.href.split('#')[0]獲取,而且需要encodeURIComponent),因為頁面一旦分享,微信客戶端會在你的鏈接末尾加入其它參數,如果不是動態獲取當前鏈接,將導致分享后的頁面簽名失敗。


3.the permission value is offline verifying這個錯誤是因為config沒有正確執行,或者是調用的JSAPI沒有傳入config的jsApiList參數中。建議按如下順序檢查:

1.確認config正確通過。

2.如果是在頁面加載好時就調用了JSAPI,則必須寫在wx.ready的回調中。

3.確認config的jsApiList參數包含了這個JSAPI。

4.permission denied該公眾號沒有權限使用這個JSAPI,或者是調用的JSAPI沒有傳入config的jsApiList參數中(部分接口需要認證之后才能使用)。

5.function not exist當前客戶端版本不支持該接口,請升級到新版體驗。

6.為什么6.0.1版本config:ok,但是6.0.2版本之后不ok(因為6.0.2版本之前沒有做權限驗證,所以config都是ok,但這並不意味着你config中的簽名是OK的,請在6.0.2檢驗是否生成正確的簽名以保證config在高版本中也ok。)

7.在iOS和Android都無法分享(請確認公眾號已經認證,只有認證的公眾號才具有分享相關接口權限,如果確實已經認證,則要檢查監聽接口是否在wx.ready回調函數中觸發)

8.服務上線之后無法獲取jsapi_ticket,自己測試時沒問題。(因為access_token和jsapi_ticket必須要在自己的服務器緩存,否則上線后會觸發頻率限制。請確保一定對token和ticket做緩存以減少2次服務器請求,不僅可以避免觸發頻率限制,還加快你們自己的服務速度。目前為了方便測試提供了1w的獲取量,超過閥值后,服務將不再可用,請確保在服務上線前一定全局緩存access_token和jsapi_ticket,兩者有效期均為7200秒,否則一旦上線觸發頻率限制,服務將不再可用)。

9.uploadImage怎么傳多圖(目前只支持一次上傳一張,多張圖片需等前一張圖片上傳之后再調用該接口)

10.沒法對本地選擇的圖片進行預覽(chooseImage接口本身就支持預覽,不需要額外支持)

11.通過a鏈接(例如先通過微信授權登錄)跳轉到b鏈接,invalid signature簽名失敗(后台生成簽名的鏈接為使用jssdk的當前鏈接,也就是跳轉后的b鏈接,請不要用微信登錄的授權鏈接進行簽名計算,后台簽名的url一定是使用jssdk的當前頁面的完整url除去'#'部分)

12.出現config:fail錯誤(這是由於傳入的config參數不全導致,請確保傳入正確的appId、timestamp、nonceStr、signature和需要使用的jsApiList)

13.如何把jsapi上傳到微信的多媒體資源下載到自己的服務器(請參見文檔中uploadVoice和uploadImage接口的備注說明)

14.Android通過jssdk上傳到微信服務器,第三方再從微信下載到自己的服務器,會出現雜音(微信團隊已經修復此問題,目前后台已優化上線)

15.綁定父級域名,是否其子域名也是可用的(是的,合法的子域名在綁定父域名之后是完全支持的)

16.在iOS微信6.1版本中,分享的圖片外鏈不顯示,只能顯示公眾號頁面內鏈的圖片或者微信服務器的圖片,已在6.2中修復

17.是否需要對低版本自己做兼容(jssdk都是兼容低版本的,不需要第三方自己額外做更多工作,但有的接口是6.0.2新引入的,只有新版才可調用)

18.該公眾號支付簽名無效,無法發起該筆交易(請確保你使用的jweixin.js是官方線上版本,不僅可以減少用戶流量,還有可能對某些bug進行修復,拷貝到第三方服務器中使用,官方將不對其出現的任何問題提供保障,具體支付簽名算法可參考 JSSDK微信支付一欄)

19.目前Android微信客戶端不支持pushState的H5新特性,所以使用pushState來實現web app的頁面會導致簽名失敗,此問題已在Android6.2中修復

20.uploadImage在chooseImage的回調中有時候Android會不執行,Android6.2會解決此問題,若需支持低版本可以把調用uploadImage放在setTimeout中延遲100ms解決

21.require subscribe錯誤說明你沒有訂閱該測試號,該錯誤僅測試號會出現

22.getLocation返回的坐標在openLocation有偏差,因為getLocation返回的是gps坐標,openLocation打開的騰訊地圖為火星坐標,需要第三方自己做轉換,6.2版本開始已經支持直接獲取火星坐標

23.查看公眾號(未添加): "menuItem:addContact"不顯示,目前僅有從公眾號傳播出去的鏈接才能顯示,來源必須是公眾號

24.ICP備案數據同步有一天延遲,所以請在第二日綁定


//配置 WxMpService 在被 Spring可掃瞄的包下
@Value("${activity.getopenid.appid}")
private String getOpenidAPPID = "";

@Value("${activity.getopenid.appsecret}")
private String getOpenidAPPSECRET = "";

@Bean
public WxMpService wxMpService() {
WxMpService wxMpService = new WxMpServiceImpl();
wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
return wxMpService;
}

@Bean
public WxMpConfigStorage wxMpConfigStorage() {
WxMpInMemoryConfigStorage wxMpConfigStorage = new WxMpInMemoryConfigStorage();
wxMpConfigStorage.setAppId(getOpenidAPPID);
wxMpConfigStorage.setSecret(getOpenidAPPSECRET);
return wxMpConfigStorage;
}
// 微信 Service 實現類 提供服務 @Autowired
private WxMpService wxMpService;

/**
* <pre>
* 創建調用jsapi時所需要的簽名
*
* 詳情請見:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN
* </pre>
*/
@Override
public ResultModel getJsApiSignature(WxOAuth2ParamModel paramModel) {
if (StringUtils.isEmpty(paramModel.getWxUrl())){
return ResultModel.getResult(404, "params url are null", null);
}
try { //原有鏈接類似 http://www.aa.com/getJsApiSignature?wxUrl=http://www.testaaa.cn/group.html?code=071EsBt60EnbND1W4eu60OJOt60EsBth&state=STATE#/channel95

// 第一個采坑點 前端傳過來的時候 做了 URLENCODE 如果沒做 請用原鏈接 如果做了 請 DECODE 后在操作
        // 第二個采坑點 獲取JsApiSignature 傳送的 URL 需要截取URL # 前面的內容
String appUrl = URLDecoder.decode(paramModel.getWxUrl(), "UTF-8");
String newAppUrl = appUrl.split("#")[0];
String jsapiTicket = wxMpService.getJsapiTicket();
log.info("jsapiTicket={} paramModel={} ",jsapiTicket ,JSON.toJSONString(paramModel));
WxJsapiSignature jsapiSignature = wxMpService.createJsapiSignature(newAppUrl);
log.info("jsapiSignature={} ",JSON.toJSONString(jsapiSignature));
return ResultModel.getSuccess(jsapiSignature);
} catch (Exception e) {
log.info("code= {} 【創建調用jsapi時所需要的簽名異常】{}", paramModel.getCode(), e.getMessage());
return ResultModel.getError("創建調用jsapi時所需要的簽名失敗");
}
}

/**
* https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
* 第二步:通過code換取網頁授權access_token scop = snsapi_userinfo
* scope 是 應用授權作用域,snsapi_base (不彈出授權頁面,直接跳轉,只能獲取用戶openid),snsapi_userinfo (彈出授權頁面,可通過openid拿到昵稱、性別、所在地。並且, 即使在未關注的情況下,只要用戶授權,也能獲取其信息 )
* @param paramModel
* @return
*/
@Override
public ResultModel oauth2Accesstoken(WxOAuth2ParamModel paramModel) {
if (StringUtils.isEmpty(paramModel.getCode())){
return ResultModel.getResult(404, "params code are null", null);
}
WxMpOAuth2AccessToken wxMpOAuth2AccessToken;
try {
wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(paramModel.getCode());
if(!wxMpService.oauth2validateAccessToken(wxMpOAuth2AccessToken)){
wxMpOAuth2AccessToken = wxMpService.oauth2refreshAccessToken(wxMpOAuth2AccessToken.getRefreshToken());
}
WxMpUser userInfo = wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, "zh_CN");
log.info("code= {} token={} userInfo={} ",paramModel.getCode(),JSON.toJSONString(userInfo), JSON.toJSONString(wxMpOAuth2AccessToken));
return ResultModel.getSuccess(userInfo);
} catch (WxErrorException e) {
log.info("code= {} 【微信網頁授權】{}", paramModel.getCode(), e.getError().getErrorMsg());
return ResultModel.getError("授權登錄失敗");
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM