签名验证异常

1. 背景

前两天edi的开发和商家联调时,根据双方协定的签名规则生成签名后,访问商家,商家侧返回验证失败;

2. 解决路径

  1. 我获取了edi侧的签名源数据和签名结果,发送给商家开发人员,让其对比差异;
  2. 商家开发人员对比出商家侧的body体中多了转义字符“\”(此步商家侧判断错误,导致第三步走了弯路);
  3. 我查看了双方的文档和代码后确认我方发送给商家的body体转义无误;然后重新让商家侧对比差异;
  4. 商家侧重新对比后发现是我方body体中有个“+”,在商家侧被解析成了空格;
  5. 由此判断是由于UrlEncode问题,url编码会把空格编码为“+”;

3. 原因

  1. 京东侧请求商家的Http请求类似:
1
2
3
4
5
6
POST 商家url
HTTP/1.1
Host: test-gateway.jdwl.com
Content-Type: application/x-www-form-urlencoded

context=abcdef+abcdef

其中的context的值包含了需要urlEncode的字符“+”,但由于我们edi流程结点的配置方式,使得edi框架暂时无法对所有的键值进行UrlEncode操作,需要开发手动增加;而此处开发忘记加UrlEncode导致数据无法正常发送给商家侧;

  1. 商家侧接收到数据后,先进行UrlDecode,把context的“+”解析为空格。导致双方签名的源数据不一致,而验签失败。

4. 解决方案

京东侧对参数增加UrlEncode后验签通过。

评论