這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 測試環境好好地功能,上了生產,莫名其妙報錯,開始以為是沒有設置Js安全介面功能變數名稱,結果讓相應人員一查,已經設置了相應的功能變數名稱,再看下公眾號內的介面許可權部分,相關js許可權也都是已授權,沒辦法,只能按照微信文檔上的常見錯誤及解決方法,設置debu ...
這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助
測試環境好好地功能,上了生產,莫名其妙報錯,開始以為是沒有設置Js安全介面功能變數名稱
,結果讓相應人員一查,已經設置了相應的功能變數名稱,再看下公眾號內的介面許可權
部分,相關js許可權也都是已授權,沒辦法,只能按照微信文檔上的常見錯誤及解決方法,設置debug: true
,然後測試出現如下錯誤提示:
網上按realAuthUrl搜了下,居然沒搜到任何這方面的內容,奇了怪了,然後再按invalid signature搜索,這次搜到的內容就比較多了,但所有的內容都在描述一件事情:這東西只能猜!!
既然只能猜,而且後端有沒有對簽名這個過程做日誌,生產也不能反覆發佈,那就猜吧,因為提示內容里有Url,js的簽名也需要Url,所以是不是這個地址不對呢?讓用戶將微信網頁的地址共用出來,結果發現地址沒錯,的確是正確的地址,那是不是後端的簽名的地址與前端的地址不一致呢?因為項目是MVC項目,後端用於獲取請求地址的代碼如下:
public static string GetJsSdkSignatureUrl(string url = null) { if (string.IsNullOrWhiteSpace(url)) { url = HttpContext.Current.Request.Url.ToString(); } var idx = url.IndexOf('#'); if (idx > 0) { return url.Substring(0, idx); } return url; }
代碼在預設調用時,都是沒有傳遞參數進來,所以懷疑是不是請求地址發生了變化,想了下生產環境有可能是通過路由進行了轉發,所以HttpContext.Current.Request.Url有可能與前端的地址不一致,於是在調用的代碼上,額外再封裝了一次,通過功能變數名稱和路徑來獲取請求地址,功能變數名稱從配置文件讀取(當前應用是.Net Framework,不是.Net Core)
private string GetRequestUrl(string path) { string url = null; var host = ConfigurationManager.AppSettings["Host.Local"]; if (!string.IsNullOrWhiteSpace(path) && !string.IsNullOrWhiteSpace(host)) { url = $"{host}{path}"; } return JSSDKLocalHelper.GetJsSdkSignatureUrl(url); }
測試環境測試了下沒問題,然後又故意將測試環境的功能變數名稱配置寫成了錯誤的配置,測試環境也報了和生產環境類似的錯誤,於是將代碼發到生產,果然該生產頁面可以正確訪問了,但過了一會,又有新的問題過來說另外一個頁面也不對!查了下代碼,因為GetJsSdkSignatureUrl是基礎的公用方法,引用有好多個,不可能每個頁面都自己組織地址,於是調整了下方法代碼,當未傳入請求地址且配置了本地功能變數名稱時,用本地功能變數名稱替換請求地址的功能變數名稱
public static string GetJsSdkSignatureUrl(string url = null) { if (string.IsNullOrWhiteSpace(url)) { var host = ConfigurationManager.AppSettings["Host.Local"]; if (!string.IsNullOrWhiteSpace(host)) { url = $"{host}{HttpContext.Current.Request.Url.PathAndQuery}"; } else { url = HttpContext.Current.Request.Url.ToString(); } } var idx = url.IndexOf('#'); if (idx > 0) { return url.Substring(0, idx); } return url; }