问题
向供应商的接口提交数据时, 返回签名不一致. 检查接口提交数据, 没有异常.
排除了是0, 的数据后, 发现问题仍然存在, 然后发现有个字段的数据后面多个空格.
把空格去掉后, 就提交数据成功了.
原因
URLEncode函数使用的标准与供应商那边不一致, 空格, 需要转成"%20", 而非"+".
这是个历史原因, 程序有两套标准
解决办法
将转码后的"+"全部替换成"%20", 这时, 再通过转码后的数据生成签名, 就一致了.
参考
URLEncoder关于空格转成加号(+)的问题_urlencode 空格变加号_luffy5459的博客-CSDN博客
URL编码(urlencoding)中关于空格的问题_使用encodeuri将url进行编码,跳转的地址中空格还是没有被保留_子燕若水的博客-CSDN博客
造成这种混乱局面的原因在于:W3C标准规定,当Content-Type为application/x-www-form-urlencoded时,URL中查询参数名和参数值中空格要用加号+替代,所以几乎所有使用该规范的浏览器在表单提交后,URL查询参数中空格都会被编成加号+。而在另一份规范(RFC 2396,定义URI)里, URI里的保留字符都需转义成%HH格式(Section 3.4 Query Component),因此空格会被编码成%20,加号+本身也作为保留字而被编成%2B,对于某些遵循RFC 2396标准的应用来说,它可能不接受查询字符串中出现加号+,认为它是非法字符。所以一个安全的举措是URL中统一使用%20来编码空格字符。