最近在对接抖音海外版的公共平台,在其官方文档上要求在进行身份验证后,后续的api请求都需要根据请求API动态生成当前Request的Sign,并带入path的参数中。
官方文档上给的是go语言的示例代码,今天在这里分享一下我用.NET(C#)写的版本。
直接看代码:
首先这是该方法的参数:
public static string getSign(string app_secret, string url, string body, string contentType)
方法参数说明:
app_secret:TikTok平台中的密钥
url:不包含域名的path,注意他是以' / '开头的。
body:body的json字符串,如果你的Request带body的话,没有传空字符串就好。
contentType:数据格式,如果不是“”,格式的话需要在签名内容的末尾加上body。
调用例子:
DateTimeOffset now = DateTimeOffset.UtcNow;//时间戳是UTC时间啊!!! long timeStamp = now.ToUnixTimeSeconds(); string url=$"/authorization/202309/shops?access_token=TTP_3Iuo*****D2WyPZGifA&app_key=6***qtj2o&sign=9579f1****a80×tamp={timeStamp}" var sign= HttpUntil.getSign("d78d4***a966", url, "", "application/json");
官方文档的流程图:
注意事项:
注意时间戳是10位UTC秒时间戳
完整的方法体:
public static string getSign(string app_secret, string url, string body, string contentType) { var Query = url.Split("?");//将参数和路径分割 var paramsList = Query[1].Split('&');//分离参数 //将参数按升序排序 for (int i = 0; i < paramsList.Length; i++) { for (int j = i + 1; j < paramsList.Length; j++) { string str1 = paramsList[i].Split("=")[0]; string str2 = paramsList[j].Split("=")[0]; if (str1.CompareTo(str2) > 0) { string tool = paramsList[i]; paramsList[i] = paramsList[j]; paramsList[j] = tool; } } } //签名内容 string input = string.Empty; //除了sign和access_token外,将排序好的参数按{key}{value}格式追加到input中 foreach (var param in paramsList) { string str = param.Split("=")[0]; if (str.Equals("sign") || str.Equals("access_token")) { continue; } input += param.Replace("=", ""); } //前缀追加路径(参数前的,域名后的部分) input = Query[0] + input; //如果请求头content_type不是 multipart/form-data,则追加到末尾body if (!contentType.Equals("multipart/form-data")) { input += body; } //用密钥包住签名内容 input = app_secret + input + app_secret; //使用 HMAC-SHA256 算法生成签名 string signature = string.Empty; byte[] keyBytes = Encoding.UTF8.GetBytes(app_secret); byte[] messageBytes = Encoding.UTF8.GetBytes(input); using (var hmac = new HMACSHA256(keyBytes)) { byte[] hashBytes = hmac.ComputeHash(messageBytes); // BitConverter.ToString(hashBytes)生成的事用“-”分割的字符,将它替换掉 signature = BitConverter.ToString(hashBytes).Replace("-", "").ToLower(); } //最终签名 return signature; }
一定要ToLower(),否则这个签名就是无效的。
希望对大家有帮助。下面给大家看一下运行中几个点的截图,有兴趣的可以瞄一眼,哈哈哈哈。
分割path和参数:
分割参数:
前缀追加path:
要将“-”去掉,不然的话就会得到这样的结果:
postman简单发个请求: