有关QQ微博sig值的计算问题

wh_liang 2012-09-27 05:21:49

这个是QQ微博sig的计算方式

下面是我的代码

protected void Page_Load(object sender, EventArgs e)
{
string url = "/user/info";
Dictionary<string, string> Params = new Dictionary<string, string>();
Params.Add("appid", "801130847");
Params.Add("openid", "1DC79A6D95B2194B9F2969A35325696B");
Params.Add("openkey", "FF6571C24E75B949157FD0D0B7DA9268");
Params.Add("reqtime", "1348737913");
Params.Add("wbversion", "1");
string method = "get";
string secret = "b41d726150ced13fc3e7a3734e7d9d46";
string ret = GenerateSign(url, Params, method, secret);
Response.Write(ret);
}

/// <summary>
/// 生成签名
/// </summary>
/// <param name="url"></param>
/// <param name="parameters"></param>
/// <param name="method"></param>
/// <param name="secret"></param>
/// <returns></returns>
public static string GenerateSign(string url, Dictionary<string, string> dirList, string method, string secret)
{
List<string> parameters = new List<string>();
foreach (string item in dirList.Keys)
{
parameters.Add(item + "=" + dirList[item]);
}
string[] sortParameters = BubbleSortASC(parameters.ToArray());
string tempParameters = string.Empty;
for (int i = 0; i < sortParameters.Length; i++)
{
if (tempParameters == string.Empty)
{
tempParameters = sortParameters[i];
}
else
{
tempParameters += "&" + sortParameters[i];
}
}
string source = method + "&" + UrlEncode(url) + "&" + UrlEncode(tempParameters);
//return hmacSha1(source, secret);
return HMACSHA1(source, secret);
}
public static string UrlEncode(string value)
{
value = HttpUtility.UrlEncode(value);
return System.Text.RegularExpressions.Regex.Replace(value, "(%[0-9a-f]{2})", c => c.Value.ToUpper());
}
/// <summary>
/// HMACSHA1加密
/// </summary>
/// <param name="content"></param>
/// <param name="key"></param>
/// <returns></returns>
private static string HMACSHA1(string content, string key)
{
HMACSHA1 hmac = new HMACSHA1(System.Text.ASCIIEncoding.ASCII.GetBytes(key));
CryptoStream cs = new CryptoStream(Stream.Null, hmac, CryptoStreamMode.Write);
byte[] dataBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(content);
cs.Write(dataBytes, 0, dataBytes.Length);
cs.Close();
return Convert.ToBase64String(hmac.Hash, Base64FormattingOptions.None);
}
public static string hmacSha1(string encryptText, string encryptKey)
{
HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.Default.GetBytes(encryptKey));
byte[] RstRes = myHMACSHA1.ComputeHash(Encoding.Default.GetBytes(encryptText));
return Convert.ToBase64String(RstRes);
}
/// <summary>
/// 排序算法
/// </summary>
/// <param name="r"></param>
/// <returns></returns>
private static string[] BubbleSortASC(string[] r)
{
for (int i = 0; i < r.Length; i++)
{
bool flag = false;
for (int j = r.Length - 2; j >= i; j--)
{
if (string.CompareOrdinal(r[j + 1], r[j]) < 0)
{
string str = r[j + 1];
r[j + 1] = r[j];
r[j] = str;
flag = true;
}
}
if (!flag)
{
return r;
}
}
return r;
}

用上面的方法是完全按照腾讯的要求写的,可是我算出来的值是这个 xr9A4H0AhtC7NhX6WCS8xR3+Sg4=
按照腾讯的测试网站生成的值是这个 WZBguHgFR52I3iQBZidekjkd6KI=
这是腾讯的测试网址http://dev.t.qq.com/auth_tool/main.html#20
授权方式是OpenId&OpenKey 时间用它的自动生成的,其他都是代码中的数据
研究了一下午加一天却得到一个查不出哪里出错的错误,请求各路大神帮我看看,我到底错在哪里了
先谢谢大家了
...全文
719 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
yeahcn3 2014-11-04
  • 打赏
  • 举报
回复
某些系统方法,如.NET系统方法Http.UrlEncode会将'='编码成'%3d',而不是'%3D',导致加密签名通不过验证
wh_liang 2012-11-02
  • 打赏
  • 举报
回复
结贴了,问了下腾讯负责认证的姜维,也是对不出药方,目前为止貌似C#没法做腾讯站内应用,完毕
wh_liang 2012-10-31
  • 打赏
  • 举报
回复
每天顶一下,希望有懂的大哥能帮下
wh_liang 2012-10-31
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]

结果是 C# code
e3mhpyrx8bR+Y4g05WHrJC1EnzM=

沙箱数据不唯一,的出来的 加密数据不可能一样了。何况 sign 只是个签名, 腾讯 WebService 能认证通过就可以了啊。

自己去 看 open.qq.com
[/Quote]
答案是sig错误,webservice不通过
wh_liang 2012-10-31
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]

C# code



SortedDictionary<string, string> sortedDic = new SortedDictionary<string, string>();
sortedDic.Add("appid", "801130847");
sortedDic.Add("openid", "1DC7……
[/Quote]
算出来的值不是CGfZh9T+qSzyGqkRAph9Ei+IMhQ= 谢谢
我写的方法算出来的值也是这个问题,格式一样,就是不对
至于参数一直在变是腾讯那边的问题,openkey每7小时变一次,reqtime是当前时间戳,也是在不断变化的,但是当前对应参数计算出来的对应sig值是不变的,也就是说参数不变,计算出来的值是不变的,也就是说我给你的这组参数计算出来的sig值就应该是CGfZh9T+qSzyGqkRAph9Ei+IMhQ=,总结就是你算出来的值不对,至于为啥不对,我的问题跟你一样,流程都是对的,就是值不对,腾讯那边就能给出一个最终值也没什么可以给你对比的,你让我调试找错,就跟我让你对你现在写的代码调试找错一个道理
XBodhi. 2012-10-31
  • 打赏
  • 举报
回复
结果是
e3mhpyrx8bR+Y4g05WHrJC1EnzM=

沙箱数据不唯一,的出来的 加密数据不可能一样了。何况 sign 只是个签名, 腾讯 WebService 能认证通过就可以了啊。

自己去 看 open.qq.com
XBodhi. 2012-10-31
  • 打赏
  • 举报
回复



SortedDictionary<string, string> sortedDic = new SortedDictionary<string, string>();
sortedDic.Add("appid", "801130847");
sortedDic.Add("openid", "1DC79A6D95B2194B9F2969A35325696B");
sortedDic.Add("openkey", "545221403EEA4385563647F3E4053D15");
sortedDic.Add("reqtime", "1351664179");
//sortedDic.Add("clienttip", "61.170.252.250");
sortedDic.Add("wbversion", "1");


string param = string.Empty;

foreach (KeyValuePair<string, string> keyValuePair in sortedDic)
{
param = param + keyValuePair.Key + "=" + keyValuePair.Value + "&";
}

string newParams = string.Format("{0}&{1}&{2}",
"GET"
, System.Web.HttpUtility.UrlEncode("/user/info")
, System.Web.HttpUtility.UrlEncode(param.TrimEnd('&')));

System.Security.Cryptography.HMACSHA1 hMACSHA1 = new System.Security.Cryptography.HMACSHA1();
hMACSHA1.Key = Encoding.UTF8.GetBytes("b41d726150ced13fc3e7a3734e7d9d46");

byte[] data = new byte[1024];

using (System.Security.Cryptography.CryptoStream cs = new System.Security.Cryptography.CryptoStream(System.IO.Stream.Null, hMACSHA1, System.Security.Cryptography.CryptoStreamMode.Write))
{
cs.Write(data, 0, data.Length);
}

byte[] reslut = hMACSHA1.Hash;

string base64 = Convert.ToBase64String(reslut);


这种 方式 就可以, 只是你的 上面的参数就一直在变, 你自己的 代码变了3次了都


wh_liang 2012-10-31
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

引用 16 楼 的回复:
你用他给的SDK不就完了

C#的sdk没有openid&openkey鉴权,只有oauth1.0,所以方法只能自己封装,要是有的话我就不用跑这来问了
[/Quote]
oauth1.0的鉴权只能用于网页应用,现在腾讯不支持网页应用,以前做的网页应用都不能用了,现在只能做腾讯站内应用,就是说只能用openid&openkey认证,而对于C#语言没有相应的技术文档
wh_liang 2012-10-31
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]
你用他给的SDK不就完了
[/Quote]
C#的sdk没有openid&openkey鉴权,只有oauth1.0,所以方法只能自己封装,要是有的话我就不用跑这来问了
ycproc 2012-10-31
  • 打赏
  • 举报
回复


你用他给的SDK不就完了
wh_liang 2012-10-31
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

对你无语了, 这样吧,我 帮你写了 得了 ,给点原始数据。
[/Quote]
下面是计算需要的原始数据:
appid : 801130847
openid:1DC79A6D95B2194B9F2969A35325696B
openkey:583F6C440A86E23A19576CA6DDF568B2
clienttip:61.170.252.250
reqtime:1351664179
sig:CGfZh9T+qSzyGqkRAph9Ei+IMhQ=
wbversion:1
其中sig值就是要计算出来的值,正确的值就是CGfZh9T+qSzyGqkRAph9Ei+IMhQ=
app secret是这个:b41d726150ced13fc3e7a3734e7d9d46
你要能计算对sig值,我立帖喊你声爷爷
wh_liang 2012-10-31
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

对你无语了,自己不知道 动脑子。 序列不对出来的结果不一样


SortedDictionary<string, string> sortedDic = new SortedDictionary<string, string>();
sortedDic.Add("appid", "801130847");
sortedDic.Add……
[/Quote]
你好,你看下代码行么?我没排序么?

//2•将除"sig"外的所有参数按key进行字典升序排列;
//2-1添加参数
Dictionary<string, string> Params = new Dictionary<string, string>();
Params.Add("appid", "801130847");
Params.Add("openid", "1DC79A6D95B2194B9F2969A35325696B");
Params.Add("openkey", "545221403EEA4385563647F3E4053D15");
Params.Add("clientip", GetClientIP());
Params.Add("reqtime", "1351574443");//a.ToString());
Params.Add("wbversion", "1");
Params.Add("format", "json");
//2-2排序
List<string> parameters = new List<string>();
foreach (string item in Params.Keys)
{
parameters.Add(item + "=" + Params[item]);
}
string[] sortParameters = BubbleSortASC(parameters.ToArray());

最后那个BubbleSortASC()方法不是排序么?

//排序
private static string[] BubbleSortASC(string[] r)
{
for (int i = 0; i < r.Length; i++)
{
bool flag = false;
for (int j = r.Length - 2; j >= i; j--)
{
if (string.CompareOrdinal(r[j + 1], r[j]) < 0)
{
string str = r[j + 1];
r[j + 1] = r[j];
r[j] = str;
flag = true;
}
}
if (!flag)
{
return r;
}
}
return r;
}

我真心不知道你哪里看到我没排序了?你仔细看代码没?
XBodhi. 2012-10-31
  • 打赏
  • 举报
回复
对你无语了,自己不知道 动脑子。 序列不对出来的结果不一样


SortedDictionary<string, string> sortedDic = new SortedDictionary<string, string>();
sortedDic.Add("appid", "801130847");
sortedDic.Add("openid", "1DC79A6D95B2194B9F2969A35325696B");
sortedDic.Add("openkey", "FF6571C24E75B949157FD0D0B7DA9268");
sortedDic.Add("reqtime", "1348737913");
sortedDic.Add("wbversion", "1");


要 排序啊,
XBodhi. 2012-10-31
  • 打赏
  • 举报
回复
对你无语了, 这样吧,我 帮你写了 得了 ,给点原始数据。
wh_liang 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

人家接口给你 那么详细 ,你自己 就一步一步就写呗,这里没有人给你写的,因为 很少有人 给别人写代码 尤其那么长, 因为,写了等于坑了你。 自己 F11 吧, 如果没有耐心 这个程序员你还是不错的好。
[/Quote]
我觉得你没好好看我写的代码也没资格来评头论足的,就此打住吧
XBodhi. 2012-10-30
  • 打赏
  • 举报
回复
人家接口给你 那么详细 ,你自己 就一步一步就写呗,这里没有人给你写的,因为 很少有人 给别人写代码 尤其那么长, 因为,写了等于坑了你。 自己 F11 吧, 如果没有耐心 这个程序员你还是不错的好。
wh_liang 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 6 楼 的回复:

引用 5 楼 的回复:

不要复制 别人的 ,要自己 一步步 写, 要不谁不知道你哪里有问题。

请别说复制别人的,这全都是我一句句写下来的,谢谢



你自己 写的 为什么不 F11 好好的 比对下。到底是哪一步出先错了


1.是在编码的时候
2.还是在排序 URL 的时候
3.还是在格式化 URL 的时候用没用 encodeU……
[/Quote]
那先得有东西给我对比才行,腾讯那边只有一个测试网址,测试网址上只有一个最终的结果给我对比,而且腾讯那边没有C#的源码,所以我才被迫按照这个步骤一个个写下来
XBodhi. 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:

不要复制 别人的 ,要自己 一步步 写, 要不谁不知道你哪里有问题。

请别说复制别人的,这全都是我一句句写下来的,谢谢
[/Quote]


你自己 写的 为什么不 F11 好好的 比对下。到底是哪一步出先错了


1.是在编码的时候
2.还是在排序 URL 的时候
3.还是在格式化 URL 的时候用没用 encodeUrl
4.最后加密上是不是吧 sign 也给算上了,

等等, 如果你不调试,就是给你代码 你也不知道哪里有问题(再出问题的话)


她的 方式和 TOP 很像。


1步步调试吧。


wh_liang 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

不要复制 别人的 ,要自己 一步步 写, 要不谁不知道你哪里有问题。
[/Quote]
请别说复制别人的,这全都是我一句句写下来的,谢谢
XBodhi. 2012-10-30
  • 打赏
  • 举报
回复
不要复制 别人的 ,要自己 一步步 写, 要不谁不知道你哪里有问题。
加载更多回复(4)

62,073

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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