淘宝签名失败主因是hmacsha1与urlencode顺序错误:须先字典序拼接参数、再urlencode(空格转%20,/._-不编码)、最后hmacsha1计算;同时需校验必填字段、ISO8601时间格式、表单提交方式及UTC时间戳。

签名串生成失败:hmacsha1 和 urlencode 顺序错了
淘宝开放平台要求签名必须用 HMAC-SHA1 算法,但很多人卡在“明明算法对了,签名还是无效”。根本原因是:签名原文(stringToSign)必须先按字典序拼接参数,再做 urlencode,最后才用 hmacsha1 计算——顺序颠倒或漏掉 urlencode 就会返回 isv.invalid-sign。
-
urlencode必须严格遵循淘宝规则:空格转%20(不是+),/、.、_、-不编码,其余特殊字符全编码 - 拼接前要剔除
sign、method(某些接口还要剔除format、v)等非业务参数 - C# 的
System.Web.HttpUtility.UrlEncode默认把空格转成+,得手动替换:.Replace("+", "%20").Replace("!", "%21")...,或者用Uri.EscapeDataString(更接近淘宝行为)
TaobaoRequest 类没填全必填字段导致 isv.missing-parameter
淘宝 API 对每个接口的必填字段检查极严,哪怕 fields 这种看似可选的字段,在获取商品详情等接口里其实是强制的。C# SDK 或手写请求时,常因字段名大小写、嵌套层级或命名不一致被拒。
- 字段名必须和官方文档完全一致,比如
q和keyword是不同接口的参数,不能混用 - 时间类参数如
start_modified必须是 ISO8601 格式("yyyy-MM-dd HH:mm:ss"),且带空格不带T,否则报isv.invalid-parameter - 数组类参数(如
fields)要拼成逗号分隔字符串:"num_iid,title,price",不能传List<string></string>直接序列化
HTTP 请求头和 Body 构造不对:Content-Type 和 POST 方式踩坑
淘宝开放平台只接受 application/x-www-form-urlencoded 的 POST 请求,不是 JSON,也不是 multipart。很多 C# 开发者用 HttpClient.PostAsJsonAsync 或直接写 JSON body,结果返回 isv.invalid-request。
- 必须用
FormUrlEncodedContent构造 body,所有参数(含sign、app_key、method)都作为表单字段提交 -
Content-Type头不能省略,也不能改成application/json;如果用了HttpClient.DefaultRequestHeaders预设了其他类型,要清空或覆盖 - 注意
sign是最后一步加进去的,必须在所有参数确定后、发送前计算并追加,不能提前硬编码
本地调试时时间戳偏差引发 isv.invalid-timestamp
淘宝校验 timestamp 参数是否在服务器当前时间 ±15 分钟内,而 C# 默认用 DateTime.Now 取的是本地时区时间。如果系统时区设错,或服务器时间不准,立刻报错。
- 一律用
DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"),然后在字符串末尾补上" +0000"(淘宝要求带时区标识) - 别信系统时间——用
NTP同步服务器时间,或调用淘宝的taobao.time.get接口取标准时间校准 - 签名原文里的
timestamp值,必须和实际 POST 过去的值完全一致,包括空格和时区格式
淘宝签名最麻烦的不是算法本身,而是参数归一化那几步:排序、编码、拼接、大小写、空格、时区——少一个字符就废。线上出问题,先抓包比对原始请求和签名原文,而不是重看算法。



















