简单的写个微信分享的功能
aspx页面
引用
<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<a href="javascript:wx_share()">分享</a>
js部分
$(function () {
$.ajax({
type: "get",
url: "后台路径",
data: { url: location.href },
dataType: "json",
success: function (data) {
wx.config({
debug: false,
appId: data.appId,
timestamp: data.timestamp,
nonceStr: data.nonceStr,
signature: data.signature,
jsApiList: [
"onMenuShareTimeline", //分享到朋友圈
"onMenuShareAppMessage", //分享给好友
"onMenuShareQQ", //分享到QQ
]
});
},
error: function (data) {
//alert("连接失败!");
}
});
});
function wx_share() {
var sharehtml = "";//给予一个蒙城使用户只能点击微信右上角按钮
$("body").append(sharehtml);
}
var title, desc, img;
title = "";
desc = "";
img = "";
var shareData = {
title: title,//分享内容的标题
desc: desc,//这里请特别注意是要去除html
link: window.location.href, //分享页的地址
imgUrl: img //分享中带有的图片
};
wx.ready(function () {
wx.onMenuShareAppMessage(shareData);//分享给好友
wx.onMenuShareTimeline(shareData);//分享到朋友圈
wx.onMenuShareQQ(shareData);//分享到QQ
});
C#后台接受部分
string url = Request.QueryString["url"];
var sign = GetSignPackage(url);//获取发送微信服务端的json数组字符串
var json = Common.NewJsonHelper.ObjectToJson<System.Collections.Hashtable>(sign);//就是将json字符串序列化一个json数组,每个公司用的不同,这个自己修改
Response.write(json);
获取json数组字符串
//得到数据包,返回使用页面
public static System.Collections.Hashtable GetSignPackage(string url)
{
string jsapiTicket = getJsApiTicket();
string timestamp = Convert.ToString(ConvertDateTimeInt(DateTime.Now));
string nonceStr = createNonceStr();
// 这里参数的顺序要按照 key 值 ASCII 码升序排序
string rawstring = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + nonceStr + "×tamp=" + timestamp + "&url=" + url + "";
//得到签名
string signature = SHA1_Hash(rawstring);
System.Collections.Hashtable signPackage = new System.Collections.Hashtable();
signPackage.Add("appId", "公众号appID");
signPackage.Add("nonceStr", nonceStr);
signPackage.Add("timestamp", timestamp);
signPackage.Add("url", url);
signPackage.Add("signature", signature);
signPackage.Add("rawString", rawstring);
return signPackage;
}
//创建随机字符串
private static string createNonceStr()
{
int length = 16;
string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
string str = "";
Random rad = new Random();
for (int i = 0; i < length; i++)
{
str += chars.Substring(rad.Next(0, chars.Length - 1), 1);
}
return str;
}
//得到ticket 如果文件里时间 超时则重新获取
static string getJsApiTicket()
{
//这里我从数据库读取
string jticket = "";
string accessToken = getAccessToken();//获取系统的全局token
string path = HttpContext.Current.Server.MapPath(@"/weixin/jsapi_ticket.json");//网上的都是写缓存,这个地方我是写一个全局json文件,最后会有说的
string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=" + accessToken;
StreamReader sr = new StreamReader(path);
string content = sr.ReadToEnd();
sr.Close();
JSTicket api = new JSTicket();
//未获取jsapi_ticket的情况
if (content.Length == 0)
{
Jsapi iden = JsonHelper.Deserialize<Jsapi>(RequestUrl(url, "get"));
jticket = iden.ticket;
if (jticket != "")
{
api.expire_time = ConvertDateTimeInt(DateTime.Now) + 7000;
api.jsapi_ticket = jticket;
string json = JsonHelper.GetJson<JSTicket>(api);
StreamWriterMetod(json, path);
}
}
else
{
var serializer = new DataContractJsonSerializer(typeof(JSTicket));
api = JsonHelper.Deserialize<JSTicket>(content);
//时间过期重新获取
if (api.expire_time < ConvertDateTimeInt(DateTime.Now))
{
Jsapi iden = JsonHelper.Deserialize<Jsapi>(RequestUrl(url, "get"));
jticket = iden.ticket;
if (jticket != "")
{
api.expire_time = ConvertDateTimeInt(DateTime.Now) + 7000;
api.jsapi_ticket = jticket;
string json = JsonHelper.GetJson<JSTicket>(api);
StreamWriterMetod(json, path);
}
}
else
{
jticket = api.jsapi_ticket;
}
}
return jticket;
}
////得到accesstoken 如果文件里时间 超时则重新获取
public static string getAccessToken()
{
// access_token 应该全局存储与更新,以下代码以写入到文件中做示例
string access_token = "";
string path = HttpContext.Current.Server.MapPath(@"/weixin/access_token.json");//我写的文件里面的,也可以自己写缓存
string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=123&secret=23";//appID自己修改,secret自己修改
StreamReader sr = new StreamReader(path);
string content = sr.ReadToEnd();
sr.Close();
AccToken readJSTicket = new AccToken();
if (content.Length == 0)
{
AccToken iden = JsonHelper.Deserialize<AccToken>(RequestUrl(url, "get"));
access_token = iden.access_token;
if (access_token != "")
{
iden.expires_in = ConvertDateTimeInt(DateTime.Now) + 7000;
iden.access_token = access_token;
string json = JsonHelper.GetJson<AccToken>(iden);
StreamWriterMetod(json, path);
}
}
else
{
var serializer = new DataContractJsonSerializer(typeof(AccToken));
readJSTicket = JsonHelper.Deserialize<AccToken>(content);
if (readJSTicket.expires_in < ConvertDateTimeInt(DateTime.Now))
{
AccToken iden = JsonHelper.Deserialize<AccToken>(RequestUrl(url,"get"));
access_token = iden.access_token;
if (access_token != "")
{
iden.expires_in = ConvertDateTimeInt(DateTime.Now) + 7000;
iden.access_token = access_token;
string json = JsonHelper.GetJson<AccToken>(iden);
StreamWriterMetod(json, path);
}
}
else
{
access_token = readJSTicket.access_token;
}
}
return access_token;
}
//发起一个http请球,返回值
private static string httpGet(string url)
{
try
{
WebClient MyWebClient = new WebClient();
MyWebClient.Credentials = CredentialCache.DefaultCredentials;//获取或设置用于向Internet资源的请求进行身份验证的网络凭据
Byte[] pageData = MyWebClient.DownloadData(url); //从指定网站下载数据
string pageHtml = System.Text.Encoding.Default.GetString(pageData); //如果获取网站页面采用的是GB2312,则使用这句
return pageHtml;
}
catch (WebException webEx)
{
Console.WriteLine(webEx.Message.ToString());
return null;
}
}
public static string RequestUrl(string url, string method)
{
// 设置参数
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");
//发送请求并获取相应回应数据
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
Stream responseStream = response.GetResponseStream();
StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
//返回结果网页(html)代码
string content = sr.ReadToEnd();
return content;
}
//SHA1哈希加密算法
public static string SHA1_Hash(string str_sha1_in)
{
//建立SHA1对象
SHA1 sha = new SHA1CryptoServiceProvider();
//将mystr转换成byte[]
ASCIIEncoding enc = new ASCIIEncoding();
byte[] dataToHash = enc.GetBytes(str_sha1_in);
//Hash运算
byte[] dataHashed = sha.ComputeHash(dataToHash);
//将运算结果转换成string
string hash = BitConverter.ToString(dataHashed).Replace("-", "").ToLower();
return hash;
}
/// <summary>
/// StreamWriter写入文件方法
/// </summary>
private static void StreamWriterMetod(string str, string patch)
{
try
{
StreamWriter swWriter = new StreamWriter(patch, false);
swWriter.WriteLine(str);
swWriter.Close();
}
catch (Exception e)
{
throw e;
}
}
/// <summary>
/// 将c# DateTime时间格式转换为Unix时间戳格式
/// </summary>
/// <param name="time">时间</param>
/// <returns>double</returns>
public static int ConvertDateTimeInt(System.DateTime time)
{
int intResult = 0;
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
intResult = Convert.ToInt32((time - startTime).TotalSeconds);
return intResult;
}
json类
//创建Json序列化 及反序列化类目
#region
//创建JSon类 保存文件 jsapi_ticket.json
public class JSTicket
{
public string jsapi_ticket { get; set; }
public double expire_time { get; set; }
}
//创建 JSon类 保存文件 access_token.json
public class AccToken
{
public string access_token { get; set; }
public double expires_in { get; set; }
}
//创建从微信返回结果的一个类 用于获取ticket
public class Jsapi
{
public int errcode { get; set; }
public string errmsg { get; set; }
public string ticket { get; set; }
public string expires_in { get; set; }
}
#endregion
前面会有说我定义的全局access_token和Ticket,网上大多写缓存,我这里写的全局文件
access_token.json
{"access_token":"","expires_in":0}
jsapi_ticket.json
{"expire_time":0,"jsapi_ticket":""}
差不多就这些了,记得点赞。