支付宝错误代码ILLEGAL_SIGN的可能原因
目前接入支付宝一般使用开放平台的openapi接口,应该没有新系统接入mapi这种旧版本API了,但前段时间碰到一个旧系统改造的需求,必须接入mapi。在最后签名与验签的时候碰到ILLEGAL_SIGN的错误信息。经过排查,可能会存在如下原因:
1、构建表单并输出到页面时忘记加上meta标签指定编码,可能造成表单中中文值的乱码。
在拼接表单时,需要加入如下代码来指定页面编码。
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />
2、Java输出表单如果使用了response.getWriter().write()方法,必须在输出之前设置response的编码。如下:
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=UTF-8");
经过测试,在拼接表单阶段是不需要对表单的中文值进行URLEncode的,提示ILLEGAL_SIGN的原因并不在中文强制编码上,而是在各个环节可能造成的中文乱码。解决问题的根源就在于从头到尾需要统一编码。
如果怀疑表单乱码,可以不在表单内容上拼接自动提交表单的JS代码,从而有时间查看表单在页面上的真实渲染结果,从而确认表单是否有乱码。