以MVC爲例html
前臺js經過.post()方法傳給後臺特定Controller當前頁面的url,後臺獲取後,進行處理:算法
1.獲取access_token:https://mp.weixin.qq.com/wiki/15/54ce45d8d30b6bf6758f68d2e95bc627.htmljson
2.經過獲取的access_token進一步獲取jsapi_ticket:(來自微信JSSDK說明文檔,https://mp.weixin.qq.com/wiki/11/74ad127cc054f6b80759c40f77ec03db.html)api
返回的Json對象數組
{ "errcode":0, "errmsg":"ok", "ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA", "expires_in":7200 }
可經過反序列化JsonConvert.DeserializeObject(),將Json對象轉化爲一個C#對象,進行下一步處理。
3.生成時間戳 timestamp:緩存
時間戳是指格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至如今的總秒數。微信
DateTime timeNow1 = (DateTime.UtcNow.AddHours(8)); DateTime timeGMT = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); //計算時間戳 int timeTotal = Convert.ToInt32((timeNow1 - timeGMT).TotalSeconds); //將時間戳轉換爲字符串 string timestamp = timeTotal.ToString(CultureInfo.InvariantCulture);
4.生成隨機串 nonceStr:app
//規定隨機字符串的長度 const int Length = 16; //限制字符串取值來源 const string Chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; //定義一個空字符串用於接收字符 string nonceStr = string.Empty; //初始化一個隨機數 var rand = new Random(); //循環從Chars裏隨機取一個字符增長到str中,得到隨機字符串 for (int i = 0; i < Length; i++) { //用Substring()方法,字符串從隨機位置開始從Chars中取一個字符 nonceStr += Chars.Substring((rand.Next(0, Chars.Length - 1)), 1); }
5.生成簽名 signature:微信公衆平臺
須要四個字段 包括上面的timestamp,nonveStr和當前網頁的URL(即要分享的頁面url),以及有效的jsapi_ticket;dom
public string GetSignature(string url, string jsapi_ticket, string timestamp, string noncestr) { //採用url鍵值格式拼接字符串 string str = $"jsapi_ticket={jsapi_ticket}&noncestr={noncestr}×tamp={timestamp}&url={url}"; //對str進行SHA1加密,獲得signature。先初始化一個SHA1CryptoServiceProvider類的實例。 SHA1 sha1 = new SHA1CryptoServiceProvider(); //以某種編碼格式如UTF8,將str編碼,得到一個字節序列 byte[] buffer = Encoding.UTF8.GetBytes(str); //計算該字節數組的哈希值,並轉化爲字符串 string strHash = BitConverter.ToString(sha1.ComputeHash(buffer)); //此時strHash爲用「-」隔開的字符串,去掉後返回全小寫的字符串,即生成了signature return strHash.Replace("-", string.Empty).ToLower(); }
微信公衆平臺開發者文檔裏有簽名算法相關內容:https://mp.weixin.qq.com/wiki/11/74ad127cc054f6b80759c40f77ec03db.html
6.將AppId,時間戳timestamp,隨機串noneStr,JsApi簽名signature封裝爲json對象,返回給前臺。
7.前臺此時經過wx.config接口注入權限驗證配置
wx.config({ debug: true, // 開啓調試模式,調用的全部api的返回值會在客戶端alert出來,若要查看傳入的參數,能夠在pc端打開,參數信息會經過log打出,僅在pc端時纔會打印。 appId: '', // 必填,公衆號的惟一標識 timestamp: , // 必填,生成簽名的時間戳 nonceStr: '', // 必填,生成簽名的隨機串 signature: '',// 必填,簽名,見附錄1 jsApiList: [] // 必填,須要使用的JS接口列表,全部JS接口列表見附錄2 });
8.經過wx.ready(function(){})處理成功驗證。/經過wx.error(function(res){})處理失敗驗證
wx.ready(function(){ // config信息驗證後會執行ready方法,全部接口調用都必須在config接口得到結果以後,config是一個客戶端的異步操做,因此若是須要在頁面加載時就調用相關接口,則須把相關接口放在ready函數中調用來確保正確執行。對於用戶觸發時才調用的接口,則能夠直接調用,不須要放在ready函數中。 });
wx.error(function(res){ // config信息驗證失敗會執行error函數,如簽名過時致使驗證失敗,具體錯誤信息能夠打開config的debug模式查看,也能夠在返回的res參數中查看,對於SPA能夠在這裏更新簽名。 });
附:SPA(Single-page Application)在 Web 設計上使用單一頁面,利用 JavaScript 操做 Dom 的技術實現各類應用
對應爲MPA(Multi-page Application)多頁面應用,最傳統的 HTML 網頁設計
區別可進一步參考http://www.thinksaas.cn/topics/0/380/380109.html