自己写的百度云推送小功能,按照api上一步一步写的,但是就是不对,有没有了解百度推送的大神帮我看一下啊

lulupiaoxu 2016-02-16 05:56:48
以前百度推送2.0版本的时候我写了一个是可以用的,现在它更新成3.0了,我在以前的基础上改了下,但是就是不对了,折腾2天了,就这么几段代码,查看了无数遍了,实在是没辙了,求大神帮我看一下啊
http://push.baidu.com/doc/restapi/sdk_developer这是百度的文档
现在就是报错
{"request_id":1107529284,"error_code":30603,"error_msg":"Authentication Failed"}
说是什么权限验证失败。。。。

 
class Program
{
static void Main(string[] args)
{
string token = "836349605809985011";
BaiduPush.Send(token, "test", "1");
}
}


public class BaiduPush
{
private const string url = "http://api.tuisong.baidu.com/rest/3.0/push/single_device";
private const string apikey = "FebUmftyzqxOgoR4aoOoBdBk";
private const string secret_key = "TZwIgfXZQ8hF81f1UinCTq7GG5hIW6p6";

public static void Send(string token, string msg, string type)
{
WebClient webClient = new WebClient();
webClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
webClient.Headers.Add("User-Agent", "BCCS_SDK/3.0 (Darwin; Darwin Kernel Version 14.0.0: Fri Sep 19 00:26:44 PDT 2014; root:xnu-2782.1.97~2/RELEASE_X86_64; x86_64) PHP/5.6.3 (Baidu Push Server SDK V3.0.0 and so on..) cli/Unknown ZEND/2.6.0");
try
{
byte[] response = webClient.UploadData(url, "POST", StructData(token, msg, type));
}
catch (WebException ex)
{
Stream stream = ex.Response.GetResponseStream();
byte[] bs = new byte[1024];
int index = 0;
int b;
while ((b = stream.ReadByte()) > 0)
{
bs[index++] = (byte)b;
}
stream.Close();
var ss = Encoding.UTF8.GetString(bs, 0, index);
}
}
/// <summary>
/// 参数
/// </summary>
/// <param name="token"></param>
/// <param name="msg"></param>
/// <param name="type"></param>
/// <returns></returns>
private static byte[] StructData(string token, string msg, string type)
{
DateTime utcNow = DateTime.UtcNow;
DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0);
uint timestamp = (uint)(utcNow - epoch).TotalSeconds;
uint expires = (uint)(utcNow.AddDays(1) - epoch).TotalSeconds; //一天后过期

Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("apikey", apikey);
dic.Add("timestamp", timestamp.ToString());
dic.Add("expires", expires.ToString());
dic.Add("device_type", "3"); //3:android 4:iOS

dic.Add("channel_id", token);
dic.Add("msg_type", "1"); //取值如下:0:消息;1:通知。默认为0
dic.Add("msg", "{\"title\":\"hello\",\"description\":\"" + msg + "\",\"custom_content\":{\"ClassName\":\"igs.android.healthsleep.MainActivity\",\"PushMessageType\":" + type + "}}");

dic.Add("sign", StructSign("POST", url, dic, secret_key));

StringBuilder sb = new StringBuilder();
foreach (var d in dic)
{
sb.Append(d.Key + "=" + d.Value + "&");
}
sb.Remove(sb.Length - 1, 1);
return Encoding.UTF8.GetBytes(sb.ToString());
}
/// <summary>
/// 构建Sign
/// </summary>
/// <param name="httpMethod"></param>
/// <param name="url"></param>
/// <param name="dic"></param>
/// <param name="secret_key"></param>
/// <returns></returns>
private static string StructSign(string httpMethod, string url, Dictionary<string, string> dic, string secret_key)
{
//按key正序
dic = dic.OrderBy(p => p.Key).ToDictionary(p => p.Key, p => p.Value);
StringBuilder sb = new StringBuilder();
//构建键值对
foreach (var d in dic)
{
sb.Append(d.Key + "=" + d.Value);
}
string sign = httpMethod + url + sb + secret_key;
//url编码
sign = sign.UrlEncode();
//将编码后替换的字符大写,这地方是个坑。。。
char[] cs = new char[sign.Length];
for (int i = 0; i < sign.Length; i++)
{
cs[i] = sign[i];
if (sign[i] == '%')
{
cs[++i] = Convert.ToChar(sign[i].ToString().ToUpper());
cs[++i] = Convert.ToChar(sign[i].ToString().ToUpper());
}
}
//MD5加密
return new string(cs).MD5();
}
}


/// <summary>
/// 扩展方法
/// </summary>
public static class ExtendMethod
{
/// <summary>
/// MD5加密
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string MD5(this string str)
{
byte[] bs = new MD5CryptoServiceProvider().ComputeHash(Encoding.UTF8.GetBytes(str));
return BitConverter.ToString(bs).Replace("-", "");
}
/// <summary>
/// url编码
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string UrlEncode(this string str)
{
str = System.Web.HttpUtility.UrlEncode(str, Encoding.UTF8);
/*
* 不知道为什么微软要把空格编码为+,浏览器不认识啊
* 只能在这里手动替换下了
* */
return str.Replace("+", "%20");
}
}
...全文
448 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
u012903992 2017-03-08
  • 打赏
  • 举报
回复
你好 同样碰见这样的问题 究竟是要大写还是小写呢
xdashewan 2016-02-17
  • 打赏
  • 举报
回复
可能是用户认证错误,你的token是否不正确或者过期都有可能导致
lulupiaoxu 2016-02-17
  • 打赏
  • 举报
回复
引用 1 楼 xdashewan 的回复:
可能是用户认证错误,你的token是否不正确或者过期都有可能导致
晕,找见原因了,原来是sign签名字符串MD5值要小写。。。。百度的文档里根本提都没提,一个大公司的api竟然这么马虎。。真心是无语了

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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