签名验证异常
1. 背景
前两天edi的开发和商家联调时,根据双方协定的签名规则生成签名后,访问商家,商家侧返回验证失败;
2. 解决路径
- 我获取了edi侧的签名源数据和签名结果,发送给商家开发人员,让其对比差异;
- 商家开发人员对比出商家侧的body体中多了转义字符“\”(
此步商家侧判断错误,导致第三步走了弯路
); - 我查看了双方的文档和代码后确认我方发送给商家的body体转义无误;然后重新让商家侧对比差异;
- 商家侧重新对比后发现是我方body体中有个“+”,在商家侧被解析成了空格;
- 由此判断是由于UrlEncode问题,url编码会把空格编码为“+”;
3. 原因
- 京东侧请求商家的Http请求类似:
1 | POST 商家url |
其中的context的值包含了需要urlEncode的字符“+”,但由于我们edi流程结点的配置方式,使得edi框架暂时无法对所有的键值进行UrlEncode操作,需要开发手动增加;而此处开发忘记加UrlEncode导致数据无法正常发送给商家侧;
- 商家侧接收到数据后,先进行UrlDecode,把context的“+”解析为空格。导致双方签名的源数据不一致,而验签失败。
4. 解决方案
京东侧对参数增加UrlEncode后验签通过。