C# 實現(xiàn)微信自定義分享的示例代碼
需求與調整
在微信中打開網(wǎng)頁應用后,可以選擇將地址發(fā)送給朋友進行分享,如下圖:


在實際的應用中,我們可能不是簡單的將該網(wǎng)頁的鏈接直接分享出去,而是生成符合實際需要的URL,微信稱其為自定義分享。意思即,在用戶點擊“轉發(fā)給朋友”按鈕之前,進行URL等內容的更新 ,經過調整后,再把鏈接發(fā)送給要分享的朋友。微信給出的關鍵方法是:updateAppMessageShareData。
需要注意的是:
最好不要再使用 wx.onMenuShareTimeline、wx.onMenuShareAppMessage、wx.onMenuShareQQ、wx.onMenuShareQZone 接口,請盡快遷移使用客戶端6.7.2及JSSDK 1.4.0以上版本而支持 wx.updateAppMessageShareData、wx.updateTimelineShareData接口。
代碼實現(xiàn)、
獲取令牌
獲取令牌是調用API的基礎,請?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ù)
正式調用前需要生成合法的票據(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ā)送請求并獲取響應數(shù)據(jù)
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
Stream responseStream = response.GetResponseStream();
StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
//獲取返回過來的結果
content = sr.ReadToEnd();
dynamic resultStr = JsonConvert.DeserializeObject(content, new { errcode = "", errmsg = "", ticket = "", expires_in = "" }.GetType());
//請求成功
if (resultStr.errcode == "0" && resultStr.errmsg == "ok")
{
content = resultStr.ticket;
}
else
{
content = "";
}
return content;
}
catch (Exception ex)
{
content = ex.Message;
return content;
}
}獲取有效簽名
通過獲取成功的票據(jù)信息,生成有效簽名后,就可以在客戶端進行調用及分享了,示例代碼如下:
public static string GetMD5(string encypStr, string charset)
{
string retStr;
MD5CryptoServiceProvider m5 = new MD5CryptoServiceProvider();
//創(chuàng)建md5對象
byte[] inputBye;
byte[] outputBye;
//使用GB2312編碼方式把字符串轉化為字節(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>
/// 隨機串
/// </summary>
public string getNoncestr()
{
Random random = new Random();
return GetMD5(random.Next(1000).ToString(), "GBK").ToLower().Replace("s", "S");
}
/// <summary>
/// 時間截,自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加密出錯:" + ex.Message);
}
}
/// <summary>
/// 獲取簽名
/// </summary>
/// <param name="jsapi_ticket">微信公眾號調用微信JS臨時票據(jù)</param>
/// <param name="nonceStr">隨機串</param>
/// <param name="timestamp">時間戳</param>
/// <param name="url">當前網(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);
}
客戶端準備
我們通過準備 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;
客戶端實現(xiàn)
首先需要引用騰訊JS包,如下:
<script src="https://res2.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
后續(xù)我們將進行初始化配置,如下代碼:
wx.config({
debug: false, // 開啟調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會通過log打出,僅在pc端時才會打印。
appId: '', // 必填,公眾號的唯一標識
timestamp:<%=ViewState["timestamp"]%> , // 必填,生成簽名的時間戳
nonceStr:'<%=ViewState["nonceStr"]%>', // 必填,生成簽名的隨機串
signature:'<%=ViewState["sign"]%>',// 必填,簽名
jsApiList:['updateAppMessageShareData','updateTimelineShareData','onMenuShareAppMessage', 'onMenuShareTimeline' ]
});最后定義自定義分享函數(shù) shareUrl ,如下代碼:
//自定義分享
//分享鏈接,該鏈接域名或路徑必須與當前頁面對應的公眾號JS安全域名一致
function shareUrl(title,link,desc,imgUrl){
var desc = document.getElementById('x_shareDesc').value;
var imgUrl ="";
wx.updateAppMessageShareData({
title: title, // 分享標題
desc: desc, // 分享描述
link: link, // 分享鏈接,該鏈接域名或路徑必須與當前頁面對應的公眾號JS安全域名一致
imgUrl: imgUrl , // 分享圖標
success: function () {
// alert("更新分享地址:"+link+" 信息成功");
},
fail: function () {
// alert("分享fail");
}
})
}
//關鍵方法調用
wx.ready(function(){
shareUrl();
});小結
使用微信JSSDK需要登錄微信公眾平臺進入“公眾號設置”的“功能設置”里填寫“JS接口安全域名”。
另外為保障穩(wěn)定性,引入的JS最好使用:http://res2.wx.qq.com/open/js/jweixin-1.6.0.js (支持https)。
目前Android微信客戶端不支持pushState的H5新特性,所以使用pushState來實現(xiàn)web app的頁面會導致簽名失敗,此問題會在Android6.2中修復。
信息驗證后會執(zhí)行ready方法,所有接口調用都必須在config接口獲得結果之后,config是一個客戶端的異步操作,所以如果需要在頁面加載時就調用相關接口,則須把相關接口放在ready函數(shù)中調用來確保正確執(zhí)行。
error接口可處理失敗驗證,如下所示:
wx.error(function(res){
// config信息驗證失敗會執(zhí)行error函數(shù),如簽名過期導致驗證失敗,具體錯誤信息可以打開config的debug模式查看,也可以在返回的res參數(shù)中查看,對于SPA可以在這里更新簽名。
});以上就是C# 實現(xiàn)微信自定義分享的示例代碼的詳細內容,更多關于C#微信自定義分享的資料請關注腳本之家其它相關文章!
相關文章
C#中將ListView中數(shù)據(jù)導出到Excel的實例方法
首先 你需要添加引用Microsoft Excel 11.0 Object Library2013-04-04
C#使用ScrapySharp快速從網(wǎng)頁采集數(shù)據(jù)
這篇文章介紹了使用ScrapySharp快速從網(wǎng)頁采集數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06

