微信升级后需要通过接入微信公众号才行,记录下。
一、登录微信公众号设置-功能设置-JS接口安全域名,设置网站的域名,可以多个
二、前端配置:测试阶段将wx.config中的debug设置为true,页面会弹出提示,
var url = window.location.href;//取当前路径
var title = $(".newsTitle").val();//分享标题
var desc = $(".newsKeyword").val();//分享摘要
var imgUrl = $(".newsImgUrl ").val();//缩略图地址,最好300x300以上;
$.ajax({
type: 'post',
data: { 'url': url },
url: '/ajax/WeChatShare.ashx',
success: function (data) {
var obj = JSON.parse(data);
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来。
appId: obj.appId, // 必填,公众号的唯一标识
timestamp: obj.timestamp, // 必填,生成签名的时间戳
nonceStr: obj.nonceStr, // 必填,生成签名的随机串
signature: obj.signature,// 必填,签名
jsApiList: [
"checkJsApi",
"onMenuShareTimeline", //分享给好友
"onMenuShareAppMessage", //分享到朋友圈
"onMenuShareQQ", //分享到QQ
"onMenuShareWeibo" //分享到微博
] // 必填,需要使用的JS接口列表
});
}
})
wx.ready(function () {
var shareData = {
title: title,
desc: desc,
link: url,
imgUrl: imgUrl
};
wx.onMenuShareAppMessage(shareData);
wx.onMenuShareTimeline(shareData);
wx.onMenuShareQQ(shareData);
wx.onMenuShareWeibo(shareData);
});
三、后端配置:1.获取tichet。2.生成随机数。3.获取时间戳。4.sha1加密,可以参考,未做token过期处理和请求失败处理
/// <summary>
/// 签名
/// </summary>
/// <returns></returns>
private string GetSign( )
{
string tichet = GetJsApiTicket();
string nonceStr = GetRandomString(20);
string timestamp = GetTimeStamp();
string str= "jsapi_ticket="+ tichet + "&noncestr="+ nonceStr + "×tamp="+ timestamp + "&url="+url;
WxShare model = new WxShare();
model.appId = IDCCIPKeys.Hyw_AppId;
model.nonceStr = nonceStr;
model.timestamp = timestamp;
model.signature = Sha1(str);
return model.ToJson();
}
/// <summary>
/// 获取tichet,注意这种
/// </summary>
/// <param name="access_token"></param>
/// <returns></returns>
private string GetJsApiTicket()
{
string ticket = Utils.GetCookie("ticketShare");
if (Utils.StrIsNullOrEmpty(ticket))
{
string access_token = GetAccessToken();
string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + access_token + "&type=jsapi";
string result = Utils.HttpGet(url);
var jo = (JObject)JsonConvert.DeserializeObject(result);
ticket = Utils.ObjectToStr(jo["ticket"]);
Utils.WriteCookie("ticketShare", ticket, 7200);
}
return ticket;
}
/// <summary>
/// 生成len位随机数
/// </summary>
/// <param name="length"></param>
/// <returns></returns>
static public string GetRandomString(int len)
{
string s = "0123456789abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ";
string reValue = string.Empty;
Random rnd = new Random(getNewSeed());
while (reValue.Length < len)
{
string s1 = s[rnd.Next(0, s.Length)].ToString();
if (reValue.IndexOf(s1) == -1) reValue += s1;
}
return reValue;
}
/// <summary>
/// 生成随机数的种子
/// </summary>
/// <returns></returns>
private static int getNewSeed()
{
byte[] rndBytes = new byte[4];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(rndBytes);
return BitConverter.ToInt32(rndBytes, 0);
}
/// <summary>
/// 获取时间戳
/// </summary>
/// <returns></returns>
public static string GetTimeStamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
/// <summary>
/// 基于Sha1的自定义加密字符串,注意是小写。
/// </summary>
/// <param name="str">要加密的字符串</param>
/// <returns>加密后的十六进制的哈希散列(字符串)</returns>
public static string Sha1(string str)
{
var buffer = Encoding.UTF8.GetBytes(str);
var data = SHA1.Create().ComputeHash(buffer);
var sb = new StringBuilder();
foreach (var t in data)
{
sb.Append(t.ToString("x2"));
}
return sb.ToString();
}
自己调试可以在:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign上测试签名,注意签名是小写。