使用c#后台调取微信JS-SDK一直出现invaild signature错误

RowlingJoe 2017-08-09 04:38:02
也在微信的微信 JS 接口签名校验工具上测试了生成的签名与我的只是大小写不同
这是后台代码

protected void Page_Load(object sender, EventArgs e) {
int nonceStrLength = 16;
timestamp = GetTimeStamp();
nonceStr = GetRnd(nonceStrLength, true, true, true, false, "" );
url = Request.Url.AbsoluteUri.ToString() + "?params=value";
jsapi_ticket = GetJsapi_ticket();
//拼接字符串
string string1 = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonceStr + "×tamp=" + timestamp + "&url=" + url;
//进行SHA1加密
signature = GetPwd(string1);
}

#region 通过accessToken获取jsapi_ticket
public static string GetJsapi_ticket()
{
string accesstoken ;
string jsapi_ticket = string.Empty;
accesstoken = FC.GetAccessToken();
string getUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi";
getUrl = string.Format(getUrl, accesstoken);
Uri uri = new Uri(getUrl);
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(uri);
webReq.Method = "GET";
//获取返回信息
HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
StreamReader streamReader = new StreamReader(response.GetResponseStream(), Encoding.Default);
string returnJason = streamReader.ReadToEnd();
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> json = (Dictionary<string, object>)serializer.DeserializeObject(returnJason);
object value;
if (json.TryGetValue("ticket", out value))
{
jsapi_ticket = value.ToString();
}
MC.WriteLog(jsapi_ticket);
return jsapi_ticket;
}
#endregion

#region 获取时间戳
public static string GetTimeStamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
#endregion

#region 生成随机字符串nonceStr
///<summary>
///生成随机字符串
///</summary>
///<param name="length">目标字符串的长度</param>
///<param name="useNum">是否包含数字,1=包含,默认为包含</param>
///<param name="useLow">是否包含小写字母,1=包含,默认为包含</param>
///<param name="useUpp">是否包含大写字母,1=包含,默认为包含</param>
///<param name="useSpe">是否包含特殊字符,1=包含,默认为不包含</param>
///<param name="custom">要包含的自定义字符,直接输入要包含的字符列表</param>
///<returns>指定长度的随机字符串</returns>
public string GetRnd(int length, bool useNum, bool useLow, bool useUpp, bool useSpe, string custom)
{
byte[] b = new byte[4];
new System.Security.Cryptography.RNGCryptoServiceProvider().GetBytes(b);
Random r = new Random(BitConverter.ToInt32(b, 0));
string s = null, str = custom;
if (useNum == true) { str += "0123456789"; }
if (useLow == true) { str += "abcdefghijklmnopqrstuvwxyz"; }
if (useUpp == true) { str += "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; }
if (useSpe == true) { str += "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"; }
for (int i = 0; i < length; i++)
{
s += str.Substring(r.Next(0, str.Length - 1), 1);
}
return s;
}
#endregion

#region SHA1加密
public static string GetPwd( string str)
{
byte[] cleanBytes = Encoding.Default.GetBytes(str);
byte[] hashedBytes = System.Security.Cryptography.SHA1.Create().ComputeHash(cleanBytes);
return BitConverter.ToString(hashedBytes).Replace("-", "");
}
#endregion


这是前端JS代码


wx.config({
debug: true,
appId: '<%= appId%>',
timestamp: '<%= timestamp%>',
nonceStr: '<%= nonceStr%>',
signature: '<%= signature%>',
jsApiList: ['chooseImage']
})
wx.ready(function() {
wx.chooseImage({
count: 1, // 默认9
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: function(res) {
var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
}
});
})
wx.error(function(res) {
alert(JSON.stringify(res))
})
...全文
368 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
RowlingJoe 2017-08-10
  • 打赏
  • 举报
回复
引用 10 楼 a250758092 的回复:
引用 9 楼 RowlingJoe 的回复:
[quote=引用 8 楼 a250758092 的回复:] 看了下你上面的图片,JSAPITICKET,很明显签名工具上的签名是kgt8ON, 但是你另外一张是 80N,一个是字母O,一个是数字0,最好的方式就是,你把签名工具上的TICKET复制到文本中,然后再复制QQ上的TICKET去查找刚刚复制的文本,你就知道你这两串东西是不是一致了
我就是复制到,我把后台的那些数据都放在页面上的,然后直接复制给QQ的,那个0和O可能是在QQ和浏览器上显示的不同的问题吧,但的确是复制的
那就没办法了,既然你都说一致了。[/quote]是不是别的方面的问题呢?除了这个影响还有什么别的影响吗?
letMeAlone_ 2017-08-10
  • 打赏
  • 举报
回复
引用 9 楼 RowlingJoe 的回复:
引用 8 楼 a250758092 的回复:
看了下你上面的图片,JSAPITICKET,很明显签名工具上的签名是kgt8ON, 但是你另外一张是 80N,一个是字母O,一个是数字0,最好的方式就是,你把签名工具上的TICKET复制到文本中,然后再复制QQ上的TICKET去查找刚刚复制的文本,你就知道你这两串东西是不是一致了
我就是复制到,我把后台的那些数据都放在页面上的,然后直接复制给QQ的,那个0和O可能是在QQ和浏览器上显示的不同的问题吧,但的确是复制的
那就没办法了,既然你都说一致了。
RowlingJoe 2017-08-10
  • 打赏
  • 举报
回复
引用 8 楼 a250758092 的回复:
看了下你上面的图片,JSAPITICKET,很明显签名工具上的签名是kgt8ON, 但是你另外一张是 80N,一个是字母O,一个是数字0,最好的方式就是,你把签名工具上的TICKET复制到文本中,然后再复制QQ上的TICKET去查找刚刚复制的文本,你就知道你这两串东西是不是一致了
我就是复制到,我把后台的那些数据都放在页面上的,然后直接复制给QQ的,那个0和O可能是在QQ和浏览器上显示的不同的问题吧,但的确是复制的
letMeAlone_ 2017-08-10
  • 打赏
  • 举报
回复
看了下你上面的图片,JSAPITICKET,很明显签名工具上的签名是kgt8ON, 但是你另外一张是 80N,一个是字母O,一个是数字0,最好的方式就是,你把签名工具上的TICKET复制到文本中,然后再复制QQ上的TICKET去查找刚刚复制的文本,你就知道你这两串东西是不是一致了
letMeAlone_ 2017-08-10
  • 打赏
  • 举报
回复
引用 4 楼 RowlingJoe 的回复:
引用 1 楼 a250758092 的回复:
大小写不同就是不同啊。
已经改成一样的大小写,依然invalid signature
其实我想看看你 用签名工具生成的signature 和你自己生成的结果,你必须每次代码生成的结果都用签名工具检测一下,要注意生成签名的几个点: 1:你需要保证你生成签名时使用的时间戳跟你 生成的时间戳是同一个,因为很有可能 你生成了两次 2:保证你的TOKEN是有效的,所以这就是为什么每次都要使用签名工具重新生成的原因。 贴出你签名工具生成的 结果和 你代码生成的各个参数及最后的签名,所谓的“各个参数”必须保证是你最后使用的数据,比如有些人会把随机数写成一个函数,先调用一次,然后生成签名的时候又调用一次,结果用签名工具的时候一直使用第一次生成的随机数来生成
RowlingJoe 2017-08-10
  • 打赏
  • 举报
回复
RowlingJoe 2017-08-10
  • 打赏
  • 举报
回复
引用 3 楼 a250758092 的回复:
引用 2 楼 RowlingJoe 的回复:
[quote=引用 1 楼 a250758092 的回复:]
大小写不同就是不同啊。
微信文档也没说要转成大写或者小写啊,是都要统一大写吗?


签名工具生成的是什么,你代码生成的签名就必须跟它保持一致,如果不一致说明你代码中生成签名的过程出了问题[/quote]一模一样。
RowlingJoe 2017-08-10
  • 打赏
  • 举报
回复
引用 1 楼 a250758092 的回复:
大小写不同就是不同啊。
已经改成一样的大小写,依然invalid signature
letMeAlone_ 2017-08-10
  • 打赏
  • 举报
回复
引用 2 楼 RowlingJoe 的回复:
引用 1 楼 a250758092 的回复:
大小写不同就是不同啊。
微信文档也没说要转成大写或者小写啊,是都要统一大写吗?
签名工具生成的是什么,你代码生成的签名就必须跟它保持一致,如果不一致说明你代码中生成签名的过程出了问题
RowlingJoe 2017-08-10
  • 打赏
  • 举报
回复
引用 1 楼 a250758092 的回复:
大小写不同就是不同啊。
微信文档也没说要转成大写或者小写啊,是都要统一大写吗?
letMeAlone_ 2017-08-10
  • 打赏
  • 举报
回复
引用 12 楼 RowlingJoe 的回复:
解决了,原来是在JS接口安全域名里面写深了,只能用一级域名
...这个写错了,你是怎么保存的,他不是要确保 有个txt文件在对应的路径下面才能保存的吗
RowlingJoe 2017-08-10
  • 打赏
  • 举报
回复
解决了,原来是在JS接口安全域名里面写深了,只能用一级域名
letMeAlone_ 2017-08-09
  • 打赏
  • 举报
回复
大小写不同就是不同啊。

3,143

社区成员

发帖
与我相关
我的任务
社区描述
微信开发即微信公众平台开发,将企业信息、服务、活动等内容通过微信网页的方式进行表现,通过二次开发可以将公众账号由一个媒体型营销工具转化成提供服务的产品。
社区管理员
  • 微信开发
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧