微信自定義分享功能實現Tips

以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

  1. 用第一步拿到的access_token 採用http GET方式請求得到jsapi_ticket(有效期7200秒,開發者必須在本身的服務全局緩存jsapi_ticket):https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi

 返回的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}&timestamp={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

相關文章
相關標籤/搜索