最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# 實(shí)現(xiàn)微信自定義分享的示例代碼

 更新時(shí)間:2024年02月10日 09:53:11   作者:初九之潛龍勿用  
這篇文章主要介紹了C# 實(shí)現(xiàn)微信自定義分享的示例代碼,文中通過代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,感興趣的同學(xué)可以自己動(dòng)手嘗試一下

需求與調(diào)整

在微信中打開網(wǎng)頁應(yīng)用后,可以選擇將地址發(fā)送給朋友進(jìn)行分享,如下圖:

在實(shí)際的應(yīng)用中,我們可能不是簡(jiǎn)單的將該網(wǎng)頁的鏈接直接分享出去,而是生成符合實(shí)際需要的URL,微信稱其為自定義分享。意思即,在用戶點(diǎn)擊“轉(zhuǎn)發(fā)給朋友”按鈕之前,進(jìn)行URL等內(nèi)容的更新 ,經(jīng)過調(diào)整后,再把鏈接發(fā)送給要分享的朋友。微信給出的關(guān)鍵方法是:updateAppMessageShareData。

需要注意的是:

最好不要再使用 wx.onMenuShareTimeline、wx.onMenuShareAppMessage、wx.onMenuShareQQ、wx.onMenuShareQZone 接口,請(qǐng)盡快遷移使用客戶端6.7.2及JSSDK 1.4.0以上版本而支持 wx.updateAppMessageShareData、wx.updateTimelineShareData接口。

代碼實(shí)現(xiàn)、

獲取令牌

獲取令牌是調(diào)用API的基礎(chǔ),請(qǐng)?zhí)峁┖戏ǖ腁PPID和APPSECRET,示例代碼如下:

        public string GetAccessToken()
        {
            string accessToken = "";
            //獲取配置信息Datatable
            string respText = "";
            //獲取appid和appsercret
            string wechat_appid = "";
            string wechat_appsecret = "";
            //獲取josn數(shù)據(jù)
            string getAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";
            string url = string.Format(getAccessTokenUrl, wechat_appid, wechat_appsecret);
 
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
 
            using (Stream resStream = response.GetResponseStream())
            {
                StreamReader reader = new StreamReader(resStream, Encoding.Default);
                respText = reader.ReadToEnd();
                resStream.Close();
            }
            JavaScriptSerializer Jss = new JavaScriptSerializer();
            Dictionary<string, object> respDic = (Dictionary<string, object>)Jss.DeserializeObject(respText);
            //通過鍵access_token獲取值
            try
            {
                accessToken = respDic["access_token"].ToString();
            }
            catch (Exception e)
            {
                accessToken =e.Message;
            }
 
            return accessToken;
        }

生成合法票據(jù)

正式調(diào)用前需要生成合法的票據(jù),C#示例代碼如下:

        public string getJsapi_ticket(string accessToken)
        {
            string content = "";
            try
            {
 
                string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessToken + "&type=jsapi";
                string method = "GET";
                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
                CookieContainer cookieContainer = new CookieContainer();
                request.CookieContainer = cookieContainer;
                request.AllowAutoRedirect = true;
                request.Method = method;
                request.ContentType = "text/html";
                request.Headers.Add("charset", "utf-8");
                //發(fā)送請(qǐng)求并獲取響應(yīng)數(shù)據(jù)
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                Stream responseStream = response.GetResponseStream();
                StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
                //獲取返回過來的結(jié)果
                content = sr.ReadToEnd();
                dynamic resultStr = JsonConvert.DeserializeObject(content, new { errcode = "", errmsg = "", ticket = "", expires_in = "" }.GetType());
 
                //請(qǐng)求成功
                if (resultStr.errcode == "0" && resultStr.errmsg == "ok")
                {
                    content = resultStr.ticket;
                }
                else
                {
                    content = "";
                }
 
                return content;
            }
            catch (Exception ex)
            {
                content = ex.Message;
                return content;
            }
        }

獲取有效簽名

通過獲取成功的票據(jù)信息,生成有效簽名后,就可以在客戶端進(jìn)行調(diào)用及分享了,示例代碼如下:

            public static string GetMD5(string encypStr, string charset)
            {
                string retStr;
                MD5CryptoServiceProvider m5 = new MD5CryptoServiceProvider();
 
                //創(chuàng)建md5對(duì)象
                byte[] inputBye;
                byte[] outputBye;
 
                //使用GB2312編碼方式把字符串轉(zhuǎn)化為字節(jié)數(shù)組.
                try
                {
                    inputBye = Encoding.GetEncoding(charset).GetBytes(encypStr);
                }
                catch (Exception ex)
                {
                    inputBye = Encoding.GetEncoding("GB2312").GetBytes(encypStr);
                }
                outputBye = m5.ComputeHash(inputBye);
 
                retStr = System.BitConverter.ToString(outputBye);
                retStr = retStr.Replace("-", "").ToUpper();
                return retStr;
            }
                /// <summary>
                /// 隨機(jī)串
                /// </summary>
                public string getNoncestr()
                {
                    Random random = new Random();
                    return GetMD5(random.Next(1000).ToString(), "GBK").ToLower().Replace("s", "S");
                }
 
                /// <summary>
                /// 時(shí)間截,自1970年以來的秒數(shù)
                /// </summary>
                public  string getTimestamp()
                {
                    TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
                    return Convert.ToInt64(ts.TotalSeconds).ToString();
                }
 
        /// <summary>
        /// 簽名加密,使用SHA加密所得
        /// </summary>
        /// <param name="content">簽名加密參數(shù)</param>
        /// <param name="encode">編碼UTF-8</param>
        /// <returns></returns>
        public string Sha1(string content, Encoding encode)
        {
            try
            {
                SHA1 sha1 = new SHA1CryptoServiceProvider();
                byte[] bytesIn = encode.GetBytes(content);
                byte[] bytesOut = sha1.ComputeHash(bytesIn);
                sha1.Dispose();
                string result = BitConverter.ToString(bytesOut);
                result = result.Replace("-", "");
                return result;
            }
            catch (Exception ex)
            {
                throw new Exception("SHA1加密出錯(cuò):" + ex.Message);
            }
        }
 
        /// <summary>
        /// 獲取簽名
        /// </summary>
        /// <param name="jsapi_ticket">微信公眾號(hào)調(diào)用微信JS臨時(shí)票據(jù)</param>
        /// <param name="nonceStr">隨機(jī)串</param>
        /// <param name="timestamp">時(shí)間戳</param>
        /// <param name="url">當(dāng)前網(wǎng)頁URL</param>
        /// <returns></returns>
        public string GetSignature(string jsapi_ticket, string nonceStr, long timestamp, string url)
        {
 
            var string1Builder = new StringBuilder();
            //注意這里參數(shù)名必須全部小寫,且必須有序
            string1Builder.Append("jsapi_ticket=").Append(jsapi_ticket).Append("&")
                          .Append("noncestr=").Append(nonceStr).Append("&")
                          .Append("timestamp=").Append(timestamp).Append("&")
                          .Append("url=").Append(url.IndexOf("#") >= 0 ? url.Substring(0, url.IndexOf("#")) : url);
 
            return Sha1(string1Builder.ToString(), Encoding.UTF8);
        }
 

客戶端準(zhǔn)備 

我們通過準(zhǔn)備 ViewState 傳遞到客戶端,示例代碼如下:

string at=GetAccessToken();
string ticket = getJsapi_ticket(at);
string nonceStr = getNoncestr();
string timestamp = getTimestamp();
string currentWebUrl = Request.Url.ToString() ;
string sign = GetSignature(ticket, nonceStr, Int64.Parse(timestamp), currentWebUrl);
 
ViewState["ticket"] = ticket;
ViewState["nonceStr"] = nonceStr;
ViewState["timestamp"] = timestamp;
ViewState["url"] = currentWebUrl;
ViewState["sign"] = sign;

客戶端實(shí)現(xiàn)

首先需要引用騰訊JS包,如下:

<script src="https://res2.wx.qq.com/open/js/jweixin-1.6.0.js"></script>

后續(xù)我們將進(jìn)行初始化配置,如下代碼:

wx.config({
   debug: false, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會(huì)通過log打出,僅在pc端時(shí)才會(huì)打印。
   appId: '', // 必填,公眾號(hào)的唯一標(biāo)識(shí)
   timestamp:<%=ViewState["timestamp"]%> , // 必填,生成簽名的時(shí)間戳
   nonceStr:'<%=ViewState["nonceStr"]%>', // 必填,生成簽名的隨機(jī)串
   signature:'<%=ViewState["sign"]%>',// 必填,簽名
   jsApiList:['updateAppMessageShareData','updateTimelineShareData','onMenuShareAppMessage', 'onMenuShareTimeline' ] 
});

最后定義自定義分享函數(shù) shareUrl ,如下代碼:

//自定義分享
//分享鏈接,該鏈接域名或路徑必須與當(dāng)前頁面對(duì)應(yīng)的公眾號(hào)JS安全域名一致
 
function shareUrl(title,link,desc,imgUrl){
    var desc = document.getElementById('x_shareDesc').value;
    var imgUrl ="";
 
    wx.updateAppMessageShareData({ 
        title: title, // 分享標(biāo)題
        desc: desc, // 分享描述
        link: link, // 分享鏈接,該鏈接域名或路徑必須與當(dāng)前頁面對(duì)應(yīng)的公眾號(hào)JS安全域名一致
        imgUrl: imgUrl , // 分享圖標(biāo)
        success: function () {
//          alert("更新分享地址:"+link+" 信息成功");
        },
        fail: function () {
//          alert("分享fail");
        }
 
    })
}
 
//關(guān)鍵方法調(diào)用
wx.ready(function(){
    shareUrl();        
});

小結(jié)

使用微信JSSDK需要登錄微信公眾平臺(tái)進(jìn)入“公眾號(hào)設(shè)置”的“功能設(shè)置”里填寫“JS接口安全域名”。

另外為保障穩(wěn)定性,引入的JS最好使用:http://res2.wx.qq.com/open/js/jweixin-1.6.0.js (支持https)。

目前Android微信客戶端不支持pushState的H5新特性,所以使用pushState來實(shí)現(xiàn)web app的頁面會(huì)導(dǎo)致簽名失敗,此問題會(huì)在Android6.2中修復(fù)。

信息驗(yàn)證后會(huì)執(zhí)行ready方法,所有接口調(diào)用都必須在config接口獲得結(jié)果之后,config是一個(gè)客戶端的異步操作,所以如果需要在頁面加載時(shí)就調(diào)用相關(guān)接口,則須把相關(guān)接口放在ready函數(shù)中調(diào)用來確保正確執(zhí)行。

error接口可處理失敗驗(yàn)證,如下所示:

wx.error(function(res){
  // config信息驗(yàn)證失敗會(huì)執(zhí)行error函數(shù),如簽名過期導(dǎo)致驗(yàn)證失敗,具體錯(cuò)誤信息可以打開config的debug模式查看,也可以在返回的res參數(shù)中查看,對(duì)于SPA可以在這里更新簽名。
});

以上就是C# 實(shí)現(xiàn)微信自定義分享的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C#微信自定義分享的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • WPF實(shí)現(xiàn)數(shù)據(jù)綁定的幾種方法

    WPF實(shí)現(xiàn)數(shù)據(jù)綁定的幾種方法

    Windows Presentation Foundation (WPF) 是微軟開發(fā)的一套用于構(gòu)建用戶界面的框架,在 WPF 中,數(shù)據(jù)綁定是一個(gè)非常重要的概念,它使得 UI 和數(shù)據(jù)源之間的同步變得簡(jiǎn)單和高效,本文將詳細(xì)分析 WPF 中實(shí)現(xiàn)數(shù)據(jù)綁定的幾種方法,需要的朋友可以參考下
    2024-12-12
  • c# 剔除sql語句''尾巴''的五種方法

    c# 剔除sql語句''尾巴''的五種方法

    這篇文章主要介紹了c# 剔除sql語句'尾巴'的五種方法,
    2020-11-11
  • 解析使用enumerator模式簡(jiǎn)化異步操作的詳解

    解析使用enumerator模式簡(jiǎn)化異步操作的詳解

    本篇文章是對(duì)使用enumerator模式簡(jiǎn)化異步操作進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C#心跳機(jī)制服務(wù)器的示例代碼

    C#心跳機(jī)制服務(wù)器的示例代碼

    心跳機(jī)制出現(xiàn)在tcp長(zhǎng)連接中,客戶端和服務(wù)器之見定時(shí)發(fā)送一種特殊的數(shù)據(jù)包,本文主要介紹了C#心跳機(jī)制服務(wù)器的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • C#實(shí)現(xiàn)貪吃蛇小游戲

    C#實(shí)現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C#獲取所有進(jìn)程的方法

    C#獲取所有進(jìn)程的方法

    在本篇文章里小編給大家分享了關(guān)于C#獲取所有進(jìn)程的方法和步驟,有需要的朋友們跟著學(xué)習(xí)參考下。
    2018-12-12
  • C#使用foreach語句遍歷二維數(shù)組的方法

    C#使用foreach語句遍歷二維數(shù)組的方法

    這篇文章主要介紹了C#使用foreach語句遍歷二維數(shù)組的方法,實(shí)例分析了C#遍歷數(shù)組的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • C# 泛型接口的抗變和協(xié)變

    C# 泛型接口的抗變和協(xié)變

    本篇文章主要介紹了C#中泛型接口的抗變和協(xié)變的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-03-03
  • c#源碼的執(zhí)行過程詳解

    c#源碼的執(zhí)行過程詳解

    在本篇文章中給大家詳細(xì)講述了c#源碼的執(zhí)行過程,對(duì)此有需要的朋友們可以學(xué)習(xí)下。
    2018-07-07
  • C# 裝箱和拆箱的知識(shí)回顧

    C# 裝箱和拆箱的知識(shí)回顧

    本篇文章主要介紹了C#的裝箱和拆箱的知識(shí)點(diǎn)回顧,對(duì)大家的學(xué)習(xí)和復(fù)習(xí)具有很好的參考價(jià)值,需要的朋友一起來看下吧
    2016-12-12

最新評(píng)論

长武县| 分宜县| 宁河县| 卢湾区| 嵊泗县| 凤翔县| 长沙市| 三河市| 蒲江县| 徐州市| 东兴市| 五家渠市| 黔东| 资溪县| 宾川县| 时尚| 庆元县| 崇州市| 米泉市| 穆棱市| 焦作市| 县级市| 佛学| 浪卡子县| 昌平区| 阿尔山市| 临泉县| 玛沁县| 泸西县| 喀什市| 银川市| 渭南市| 繁昌县| 疏勒县| 余干县| 扬州市| 友谊县| 柏乡县| 和田市| 泗阳县| 安多县|