APPID、Secret ID 和 Secret Key 使用的就是在API密钥管理获取到的,数据万象也注册了
在提交时一直提示返回
{
"code": 9,
"message": "sign expired"
}
不知道是哪里的问题
实例代码:
/// <summary>
/// request提交
/// </summary>
/// <param name="body"></param>
/// <returns></returns>
protected async Task<string> ImageRequestAsync(string host,string[] imgurl_list)
{
if (imgurl_list != null && imgurl_list.Length > 0)
{
var appid = "appid";
var secretid = "secretid";
var secretkey = "secretKey";
var url = new Uri(host);
var body = new
{
appid,
url_list = imgurl_list
};
var cookieContainer = new CookieContainer();
// 将提交的字符串数据转换成字节数组
byte[] postData = System.Text.Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(body));
// 设置提交的相关参数
var myEncoding = System.Text.Encoding.GetEncoding("utf-8");
var request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "POST";
request.KeepAlive = false;
request.AllowAutoRedirect = true;
request.Host = "recognition.image.myqcloud.com";
request.ContentType = "application/json";
request.Headers.Add("Authorization", AppSign(appid, secretid, secretkey));
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";
request.CookieContainer = cookieContainer;
request.ContentLength = postData.Length;
// 提交请求数据
var outputStream = request.GetRequestStream();
outputStream.Write(postData, 0, postData.Length);
outputStream.Close();
var response = request.GetResponse() as HttpWebResponse;
var responseStream = response.GetResponseStream();
var reader = new StreamReader(responseStream, System.Text.Encoding.UTF8);
var responseData = reader.ReadToEnd();
reader.Close();
return responseData;// 解码
}
return "";
}
private static string AppSign(string appId, string secretId, string secretKey)
{
var ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
var currentTime = Convert.ToInt64(ts.TotalSeconds);//当前时间戳,是一个符合 UNIX Epoch 时间戳规范的数值,单位为秒,多次签名时,e 应大于 t
var expiredTime = Convert.ToInt64((DateTime.UtcNow.AddMinutes(180) - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds);//签名的有效期,是一个符合 UNIX Epoch 时间戳规范的数值,单位为秒;单次签名时,e 必须设置为 0
string plainText = $"a={appId}&b=&k={secretId}&e={currentTime}&t={expiredTime}&r={GetRandom()}&f=";
return Hmacsha1Encrypt(plainText, secretKey);
}
/// <summary>
/// HMACSHA1算法加密
/// </summary>
private static string Hmacsha1Encrypt(string encryptText, string encryptKey)
{
using (HMACSHA1 mac = new HMACSHA1(Encoding.UTF8.GetBytes(encryptKey)))
{
var hash = mac.ComputeHash(Encoding.UTF8.GetBytes(encryptText));
var pText = Encoding.UTF8.GetBytes(encryptText);
var all = new byte[hash.Length + pText.Length];
Array.Copy(hash, 0, all, 0, hash.Length);
Array.Copy(pText, 0, all, hash.Length, pText.Length);
return Convert.ToBase64String(all);
}
}
/// <summary>
/// 获取随机数
/// </summary>
private static int GetRandom()
{
var random = new Random();
var rand = random.Next(10000, 999999999);
return rand;
}
大兄弟感谢你提供的参考,问题解决了吧
解决了,是
string plainText = $"a={appId}&b=&k={secretId}&e={currentTime}&t={expiredTime}&r={GetRandom()}&f=";
这一段,appid和secretid写反了,你使用的时候核对以下对应关系