微信分享功能開發

        --微信分享首先要從後臺傳簽名算法,後臺方法
        
        /// <summary>
        /// 簽名算法
        /// </summary>
        /// <param name="jsapi_ticket">jsapi_ticket</param>
        /// <param name="noncestr">隨機字符串(必須與wx.config中的nonceStr相同)</param>
        /// <param name="timestamp">時間戳(必須與wx.config中的timestamp相同)</param>
        /// <param name="url">當前網頁的URL,不包含#及其後面部分(必須是調用JS接口頁面的完整URL)</param>
        /// <returns></returns>
        public string GetSignature(string noncestr, long timetamp, string url, string accessToken, out string string1)
        {
            string jsapi_ticket = GetTickect(accessToken);

            var string1Builder = new StringBuilder();
            string1Builder.Append("jsapi_ticket=").Append(jsapi_ticket).Append("&")
                          .Append("noncestr=").Append(noncestr).Append("&")
                          .Append("timestamp=").Append(timetamp).Append("&")
                          .Append("url=").Append(url.IndexOf("#") >= 0 ? url.Substring(0, url.IndexOf("#")) : url);
            string1 = string1Builder.ToString();
            
            return Sha1(string1);
        }
        
        private static string[] strs = new string[]
                                 {
                                  "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
                                  "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"
                                 };
        /// <summary>
        /// 建立隨機字符串
        /// </summary>
        /// <returns></returns>
        private string CreatenNonce_str()
        {
            Random r = new Random();
            var sb = new StringBuilder();
            var length = strs.Length;
            for (int i = 0; i < 15; i++)
            {
                sb.Append(strs[r.Next(length - 1)]);
            }
            
            return sb.ToString();
        }
        /// <summary>
        /// 建立時間戳
        /// </summary>
        /// <returns></returns>
        private long CreatenTimestamp()
        {
            
            return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
        }
        /// <summary>
        /// Sha1
        /// </summary>
        /// <param name="orgStr"></param>
        /// <param name="encode"></param>
        /// <returns></returns>
        public static string Sha1(string orgStr, string encode = "UTF-8")
        {

            var sha1 = new SHA1Managed();
            var sha1bytes = System.Text.Encoding.GetEncoding(encode).GetBytes(orgStr);
            byte[] resultHash = sha1.ComputeHash(sha1bytes);
            string sha1String = BitConverter.ToString(resultHash).ToLower();
            sha1String = sha1String.Replace("-", "");
            return sha1String;
        }
        
        /// <summary>  
        /// 獲取AccessToken  
        /// </summary>  
        /// <returns></returns>  
        public string GetAccessToken()
        {
            string cacheKey = string.Format(ModelCacheEventConsumer.TOKENNAME_PATTERN_KEY);
            var cacheModel = _cacheManager.Get(cacheKey, () =>
            {
                string grant_type = "client_credential";
                string appid = "wx76a637f31faef786";
                string secret = "02ff8a2030305730c9f75b2335b7ce17"; ;
                string tokenUrl = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type={0}&appid={1}&secret={2}", grant_type, appid, secret);
                string strReturn = Get(tokenUrl);

                strReturn = GetTokenStr(strReturn);

                return strReturn;
            });

            return cacheModel;


        }

        public static string GetTokenStr(string tokenJsonStr)
        {
            //if(string.IsNullOrEmpty(tokenJsonStr)

            var strArray = tokenJsonStr.Split(',');

            var tokenArray = strArray[0].Split(':');

            var tokenStr = tokenArray[1];
            tokenStr = tokenStr.Replace("\"", string.Empty);

            return tokenStr;

        }
        public string GetJSAPIStr(string jsapiJsonStr)
        {
            //if(string.IsNullOrEmpty(tokenJsonStr)

            var strArray1 = jsapiJsonStr.Split(',');
            var strArray2 = strArray1[2].Split(':');

            var tokenStr = strArray2[1];
            tokenStr = tokenStr.Replace("\"", string.Empty);

            return tokenStr;

        }


        public string GetTickect(string accessToken)
        {

            string cacheKey = string.Format(ModelCacheEventConsumer.JSAPINAME_PATTERN_KEY);
            var cacheModel = _cacheManager.Get(cacheKey, () =>
            {
                string type = "jsapi";
                string tokenUrl = string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type={1}", accessToken, type);
                string jsapi = Get(tokenUrl);
                jsapi = GetJSAPIStr(jsapi);
                return jsapi;
            });
            //記錄操做日誌
            //_logger.InsertLog(LogLevel.Debug, cacheModel);
            return cacheModel;

        }


        public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            //直接確認,不然打不開    
            return true;
        }
        public static string Get(string url)
        {
            System.GC.Collect();
            string result = "";

            HttpWebRequest request = null;
            HttpWebResponse response = null;

            //請求url以獲取數據
            try
            {
                //設置最大鏈接數
                ServicePointManager.DefaultConnectionLimit = 200;
                //設置https驗證方式
                if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
                {
                    ServicePointManager.ServerCertificateValidationCallback =
                            new RemoteCertificateValidationCallback(CheckValidationResult);
                }

                /***************************************************************
                * 下面設置HttpWebRequest的相關屬性
                * ************************************************************/
                request = (HttpWebRequest)WebRequest.Create(url);

                request.Method = "GET";

                //獲取服務器返回
                response = (HttpWebResponse)request.GetResponse();

                //獲取HTTP返回數據
                StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
                result = sr.ReadToEnd().Trim();
                sr.Close();
            }

            catch (Exception e)
            {

                throw new Exception(e.ToString());
            }
            finally
            {
                //關閉鏈接和流
                if (response != null)
                {
                    response.Close();
                }
                if (request != null)
                {
                    request.Abort();
                }
            }
            return result;
        }

        
        ---微信分享的前臺js代碼
        
        <script>
    function getBasePath() {
        var curWwwPath = window.document.location.href;
        var pathName = window.document.location.pathname;
        var pos = curWwwPath.indexOf(pathName);
        var localhostPaht = curWwwPath.substring(0, pos);
        var projectName = pathName.substring(0, pathName.substr(1).indexOf('/') + 1);
        return (localhostPaht + projectName);
    }
    //此處是使用了百度分享的插件
    window._bd_share_config = {
        common: {
            bdText: "@Model.Name",//標題
            bdUrl: '@Model.ProductSharlFPlusUrl?pro=@Model.PromoterInfo',//連接
            bdMini: '2',
            bdMiniList: ['weixin', 'sqq'],
            bdPic: '@(Model.PictureModels.Any()?Model.PictureModels[0].ImageUrl:"")',//圖片
            data_track_clickback: true,
            onAfterClick: function (cmd) {
                if (cmd == 'sqq') {
                    sucesscallback(3);//點擊了qq分享後的回執方法
                }

            }
        },
        share: {
            "tag": 'share_1',
            "bdSize": 24
        }
    }; //插件的JS加載部分,這是使用百度分享插件必須引用的js
    with (document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src ='@Url.Content("~/Content/BaiduShare/api/js/share.js?cdnversion=")' + ~(-new Date() / 36e5)];


        if (isWeiXin()) {

            $('#shareesc').addClass('isdisplay');
            $('#fenxiang').addClass('isdisplay');
            wx.config({
                debug: false,
                appId: 'wx76a637f31faef786',
                timestamp: '@ViewBag.timestamp',//這些值就是從後臺獲取的時間戳、數字簽名、隨機串
                nonceStr: '@ViewBag.nonceStr',
                signature: '@ViewBag.signature',
                jsApiList: [
                    'onMenuShareTimeline',//分享到朋友圈
                    'onMenuShareAppMessage'//分享到好友
                ]
            });

            var imgUrl = "@(Model.PictureModels.Any()?Model.PictureModels[0].ImageUrl:"")";  //圖片LOGO注意必須是絕對路徑
            
            var lineLink = "@Model.ProductSharlFPlusUrl?pro=@Model.PromoterInfo";   //網站網址,必須是絕對路徑
            var descContent = '@Model.SubTitle'; //分享給朋友或朋友圈時的文字簡介
            var shareTitle = '@Model.Name'; //分享title
            var appid = 'wx76a637f31faef786'; //apiID,可留空,這個是註冊了微信公衆平臺以後平臺給的appid和secret
            //分享給好友
            function shareFriend() {
                WeixinJSBridge.invoke('sendAppMessage', {
                    "appid": appid,
                    "img_url": imgUrl,
                    "img_width": "200",
                    "img_height": "200",
                    "link": lineLink,
                    "desc": descContent,
                    "title": shareTitle,
                }, function (res) {
                    if (res.err_msg == 'send_app_msg:ok') {
                        sucesscallback(1);
                    }
                });
            }

            //分享到朋友圈
            function shareTimeline() {
                WeixinJSBridge.invoke('shareTimeline', {
                    "img_url": imgUrl,
                    "img_width": "200",
                    "img_height": "200",
                    "link": lineLink,
                    "desc": descContent,
                    "title": shareTitle
                }, function (res) {
                    if (res.err_msg == 'share_timeline:ok') {
                        sucesscallback(2);
                    }
                });
            }

            // 當微信內置瀏覽器完成內部初始化後會觸發WeixinJSBridgeReady事件。
            document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
                // 發送給好友
                WeixinJSBridge.on('menu:share:appmessage', function (argv) {
                    shareFriend();
                });
                // 分享到朋友圈
                WeixinJSBridge.on('menu:share:timeline', function (argv) {
                    shareTimeline();
                });

            }, false);

            wx.ready(function () {
                // 1 判斷當前版本是否支持指定 JS 接口,支持批量判斷
                document.querySelector('#checkJsApi').onclick = function () {
                    wx.checkJsApi({
                        jsApiList: [
                            'onMenuShareTimeline',
                            'onMenuShareAppMessage'
                        ],
                        success: function (res) {
                            alert(JSON.stringify(res));
                        }
                    });
                };
            });
            wx.error(function (res) {
                alert(res.errMsg);
            });
        }
    //};
    //判斷是不是微信瀏覽器,由於qq 分享的時候點擊微信都是在微信瀏覽器中打開當前頁面,而後在微信瀏覽器中進行分享
    function isWeiXin() {
        var ua = window.navigator.userAgent.toLowerCase();
        if (ua.match(/MicroMessenger/i) == 'micromessenger') {
            return true;
        } else {
            return false;
        }
    }
    //這是分享成功以後的回調函數,能夠用來保存分享歷史記錄之類的
    function sucesscallback(stype) {
        @if (WorkContext.CurrentCustomer.IsRegistered())
        {
            <text>
            $.ajax({
                cache: false,
                type: "GET",
                dataType: "json",
                contentType: "application/json;charset=utf-8",
                url: "@(Url.Action("BuildShareHistory", "Product"))",
                data: { productid: "@Model.Id", sharetype: stype, customerId: "@WorkContext.CurrentCustomer.Id" },
                complete: function (data) {
                    //返回根據文件名查詢的值;
                    var result = data.responseText.toString();
                    if (result == "1") { //分享成功;
                        return false;
                    }
                }
            });
            </text>
        }
        else
        {
            <text>
        ;
        </text>
        }
    };

</script>
<script src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>//這個是調用微信分享官方接口必須的引用js
相關文章
相關標籤/搜索