3,143
社区成员
发帖
与我相关
我的任务
分享
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
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))
})
我就是复制到,我把后台的那些数据都放在页面上的,然后直接复制给QQ的,那个0和O可能是在QQ和浏览器上显示的不同的问题吧,但的确是复制的 看了下你上面的图片,JSAPITICKET,很明显签名工具上的签名是kgt8ON, 但是你另外一张是 80N,一个是字母O,一个是数字0,最好的方式就是,你把签名工具上的TICKET复制到文本中,然后再复制QQ上的TICKET去查找刚刚复制的文本,你就知道你这两串东西是不是一致了
看了下你上面的图片,JSAPITICKET,很明显签名工具上的签名是kgt8ON, 但是你另外一张是 80N,一个是字母O,一个是数字0,最好的方式就是,你把签名工具上的TICKET复制到文本中,然后再复制QQ上的TICKET去查找刚刚复制的文本,你就知道你这两串东西是不是一致了
已经改成一样的大小写,依然invalid signature 大小写不同就是不同啊。
微信文档也没说要转成大写或者小写啊,是都要统一大写吗? [quote=引用 1 楼 a250758092 的回复:]
大小写不同就是不同啊。
大小写不同就是不同啊。
微信文档也没说要转成大写或者小写啊,是都要统一大写吗? 大小写不同就是不同啊。
大小写不同就是不同啊。
解决了,原来是在JS接口安全域名里面写深了,只能用一级域名