using system;
using system.collections.generic;
using system.linq;
using system.web;
using system.io;
using newtonsoft.json;
using system.net;
using system.runtime.serialization.formatters.binary;
using system.text;
using system.security.cryptography;
/// <summary>
/// wxjssdk 的摘要说明
/// </summary>
public class wxjssdk
{
private string appid;
private string appsecret;
private datatable dt;
public wxjssdk(string appid, string appsecret)
{
this.appid = appid;
this.appsecret = appsecret;
}
//得到数据包,返回使用页面
public system.collections.hashtable getsignpackage()
{
string jsapiticket = getjsapiticket();
string url = httpcontext.current.request.url.tostring();
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 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 如果文件里时间 超时则重新获取
//注:jsapi_ticket使用规则(有过期时间)类似access_token, oauth的access_token与基础access_token不同
private string getjsapiticket()
{
//这里我从数据库读取
dt = dbsession.default.fromsql("select jsapi_ticket,ticket_expires from table where id=1").todatatable();
int expire_time = (int)dt.rows[0]["ticket_expires"];
string ticket = dt.rows[0]["jsapi_ticket"].tostring();
string accesstoken =getaccesstoken();//获取系统的全局token
if (expire_time < convertdatetimeint(datetime.now))
{
string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=" + accesstoken + "";
jsapi api =jsonconvert.deserializeobject<jsapi>(httpget(url));
ticket = api.ticket;
if (ticket != "")
{
expire_time = convertdatetimeint(datetime.now) + 7000;
//存入数据库操作
}
}
return ticket;
}
////得到accesstoken 如果文件里时间 超时则重新获取
//private string getaccesstoken()
//{
// // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
// string access_token = "";
// string path = httpcontext.current.server.mappath(@"/weixin/access_token.json");
// filestream file = new filestream(path, filemode.open);
// var serializer = new datacontractjsonserializer(typeof(acctoken));
// acctoken readjsticket = (acctoken)serializer.readobject(file);
// file.close();
// if (readjsticket.expires_in < convertdatetimeint(datetime.now))
// {
// string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + appsecret + "";
// acctoken iden = desrialize<acctoken>(new acctoken(), httpget(url));
// access_token = iden.access_token;
// if (access_token != "")
// {
// iden.expires_in = convertdatetimeint(datetime.now) + 7000;
// iden.access_token = access_token;
// string json = serialize<acctoken>(iden);
// streamwritermetod(json, path);
// }
// }
// else
// {
// access_token = readjsticket.access_token;
// }
// return access_token;
//}
//发起一个http请球,返回值
private 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;
}
}
//sha1哈希加密算法
public string sha1_hash(string str_sha1_in)
{
sha1 sha1 = new sha1cryptoserviceprovider();
byte[] bytes_sha1_in = system.text.utf8encoding.default.getbytes(str_sha1_in);
byte[] bytes_sha1_out = sha1.computehash(bytes_sha1_in);
string str_sha1_out = bitconverter.tostring(bytes_sha1_out);
str_sha1_out = str_sha1_out.replace("-", "").tolower();
return str_sha1_out;
}
/// <summary>
/// streamwriter写入文件方法
/// </summary>
private void streamwritermetod(string str, string patch)
{
try
{
filestream fsfile = new filestream(patch, filemode.openorcreate);
streamwriter swwriter = new streamwriter(fsfile);
swwriter.writeline(str);
swwriter.close();
}
catch (exception e)
{
throw e;
}
}
/// <summary>
/// 将c# datetime时间格式转换为unix时间戳格式
/// </summary>
/// <param name="time">时间</param>
/// <returns>double</returns>
public 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序列化 及反序列化类目
#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
上面是写好的类,接下来直接调用后对应输出给js
wxjssdk jssdk = new wxjssdk(appid,appsecret);
hashtable hs = jssdk.getsignpackage();
string signature = hs["signature"].tostring();
string signature = hs["signature"].tostring();
string timestamp = hs["timestamp"].tostring();
string nonce = hs["noncestr"].tostring();
接着js调用:
<script type="text/javascript">
var dataforweixin = {
appid: "<%=appid%>",
msgimg: "<%=wechatimg%>",
tlimg: "<%=wechatimg%>",
url: "<%=url%>",
title: "<%=title%>",
desc: "<%=desc%>",
timestamp: '<%=timestamp%>',
noncestr: '<%=nonce%>',
signature: '<%=signature%>',
jsapilist: ['onmenusharetimeline', 'onmenushareappmessage', 'onmenushareqq', 'onmenushareweibo'],
fakeid: "",
callback: function () { }
};
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appid: dataforweixin.appid, // 必填,公众号的唯一标识
timestamp: dataforweixin.timestamp, // 必填,生成签名的时间戳
noncestr: dataforweixin.noncestr, // 必填,生成签名的随机串
signature: dataforweixin.signature,// 必填,签名,见附录1
jsapilist: dataforweixin.jsapilist // 必填,需要使用的js接口列表,所有js接口列表见附录2
});
wx.ready(function () {
//在此输入各种api
//分享到朋友圈
wx.onmenusharetimeline({
title: dataforweixin.title, // 分享标题
link: dataforweixin.url, // 分享链接
imgurl: dataforweixin.msgimg, // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});
//分享给朋友
wx.onmenushareappmessage({
title: dataforweixin.title, // 分享标题
desc: dataforweixin.desc, // 分享描述
link: dataforweixin.url, // 分享链接
imgurl: dataforweixin.tlimg, // 分享图标
type: '', // 分享类型,music、video或link,不填默认为link
dataurl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});
//qq
wx.onmenushareqq({
title: dataforweixin.title, // 分享标题
desc: dataforweixin.desc, // 分享描述
link: dataforweixin.url, // 分享链接
imgurl: dataforweixin.msgimg,// 分享图标
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});
//qq微博
wx.onmenushareweibo({
title: dataforweixin.title, // 分享标题
desc: dataforweixin.desc, // 分享描述
link: dataforweixin.url, // 分享链接
imgurl: dataforweixin.tlimg, // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,
//所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});
wx.error(function (res) {
//alert(res);
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于spa可以在这里更新签名。
});
</script>
更多微信开发-jssdk调用分享实例 。