基本的配置在微信公众平台里面已经有详细的描述了,我在这里只是针对我自己在开发过程中碰到的问题进行叙述。谢谢!
1.首先得到当前页面的url信息不包含#及后面部分 var url = location.href.split('#')[0];(这个加密的url我在开发的时候一直在用后台生成的导致老是签名失败!苦恼)
2.将url传递到后台就行加密
后台c#代码
Dictionary<string, string> parameters = new Dictionary<string, string>();parameters.Add("url", url);
//得到jsapi_ticket
string ticket = WeiXinInter.WeiXinTicket.jsapi_ticket;
parameters.Add("jsapi_ticket", ticket);
//生成时间戳
string ts = GenerateTimeStamp();
//获得nonceStr: '', 生成签名的随机串
string noncestr = GenerateNonceStr();
parameters.Add("timestamp", ts);
parameters.Add("noncestr", noncestr);
//ASCII码从小到大排序并且进行sha1加密
string signature = CreateSignString(parameters);
/// <summary>
/// 生成时间戳,标准北京时间,时区为东八区,自1970年1月1日 0点0分0秒以来的秒数
/// </summary>
/// <returns></returns>
private static string GenerateTimeStamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
/// <summary>
/// 获得nonceStr: '', 生成签名的随机串
/// </summary>
/// <returns></returns>
private static string GenerateNonceStr()
{
return Guid.NewGuid().ToString().Replace("-", "");
}
//将集合 M 内非空参数值的参数按照参数名ASCII码从小到大排序(字典序)
static string CreateSignString(Dictionary<string, string> parameters)
{
foreach (var key in parameters.Keys.Where(key => string.IsNullOrEmpty(parameters[key])))
{
parameters.Remove(key);
}
//第一步,设所有収送戒者接收到的数据为集合 M,将集合 M 内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),
//使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串 stringA。
//特别注意以下重要规则:
//1.参数名 ASCII 码从小到大排序(字典序) ;
//2.如果参数的值为空不参与签名;
//3.参数名区分大小写;
//4.验证调用返回戒微信主劢通知签名时,传送的 sign 参数不参与签名,将生成的签名与该 sign 值作校验。
var keyArray = parameters.Keys.ToArray();
Array.Sort(keyArray);
var keyString = keyArray.Aggregate("", (current, t) => current + (t + "=" + parameters[t] + "&"));
//第二步,在 stringA 最后拼接上 key=商户支付密钥得到 stringSignTemp 字符串,
//并对 stringSignTemp 进行 MD5 运算,再将得到的字符串所有字符转换为大写,得到 sign的值 signValue
keyString = keyString.Substring(0, keyString.Length - 1);
//
return SHA1(keyString).ToLower();
}
//sha1加密
private static string SHA1(string text)
{
byte[] cleanBytes = Encoding.Default.GetBytes(text);
byte[] hashedBytes = System.Security.Cryptography.SHA1.Create().ComputeHash(cleanBytes);
return BitConverter.ToString(hashedBytes).Replace("-", "");
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
web前端代码,微信公众平台文档有详细说明
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId:res.dataPacket.appId, // 必填,公众号的唯一标识
timestamp: res.dataPacket.timestamp, // 必填,生成签名的时间戳
nonceStr: res.dataPacket.nonceStr, // 必填,生成签名的随机串
signature: res.dataPacket.signature,// 必填,签名,见附录1
jsApiList: [
'checkJsApi',
'onMenuShareTimeline',
'onMenuShareAppMessage'
] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
wx.ready(function(){
console.log("----");
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
//分享到朋友圈
//console.log("进入ready");
wx.onMenuShareTimeline({
title: Sharetitle, // 分享标题(这个分享的url可以自己定义,与加密的url不同,加密的url必须是当前页面的url不包含#及后面的部分)
link: ShareLink, // 分享链接
imgUrl: imgurl, // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});
//分享给朋友
wx.onMenuShareAppMessage({
title: Sharetitle, // 分享标题
desc: Sharecontent, // 分享描述
link: ShareLink, // 分享链接
imgUrl: imgurl, // 分享图标
type: 'link', // 分享类型,music、video或link,不填默认为link
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function () {
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
}
});
});
wx.error(function (res) {
console.log(res);
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});