支付宝PC端支付报INVALID_PARAMETER错误,一次解决过程

前言

我们项目前端部分分为PC端、手机端两个项目,然后共用一个web端,手机端已经上线,手机端中的充值支付模块也已经正常在使用;但这次PC端项目上线的时候,充值却出现了问题,支付接口返回INVALID_PARAMETER的错误;而充值这块之前是另一名开发负责,可是已经离职,只能自己去排查了。

解决过程

经过多次测试,发现是部分金额支付出现问题,然后根据官方文档,出现INVALID_PARAMETER的原因是:

INVALID_PARAMETER
请求参数无效,参考以下方法排查:
1.请检查参数biz_content是否是一个合法的JSON字符串;
2.请检查接口是否按照文档规范传入biz_content参数;主要检查参数格式是否符合要求,是否有非法值、越界等,如参数超过限制长度或者非空的参数未传等,具体请根据接口文档检查参数格式,文档见 蚂蚁金服开放平台-文档中心。

我就去观察比对正确和错误的请求参数有什么不同,然后发现biz_content部分中除了时间字段外,只有一个字段参数会变化,就是passback_params,而且是该字段最后字符含有“=”等于号的时候,就会出错

passback_params
String

512
公用回传参数,如果请求时传递了该参数,则返回给商户时会回传该参数。支付宝只会在异步通知时将该参数原样返回。本参数必须进行UrlEncode之后才可以发送给支付宝
merchantBizType%3d3C%26merchantBizNo%3d2016010101111

看了代码后,发现该字段确实可疑,因为代码中对参数进行了一次编码操作,原来代码如下:

//PassbackParams 参数内容的json串有 双引号(") 时  进行urlencode后的值传过去支付宝会报参数异常,所以换为base64.encode
model.setPassbackParams(new String(Base64.encodeBase64(passbackParams.toJSONString().getBytes())));

之前的开发采用Base64编码,我开始怀疑是这个编码jar包有问题,换了别的jar包也是这样,后面想了下,既然双引号报错,那我把双引号改成单引号json串,再用urlEncode就好了,然后试下了,果然没问题。

//PassbackParams 参数内容的json串有 双引号(") 时  进行urlencode后的值传过去支付宝会报参数异常,所以换为单引号
model.setPassbackParams(URLEncoder.encode(JSON.toJSONString(passbackParams, SerializerFeature.UseSingleQuotes), "UTF-8"));

总结

请求失败,就是因为Base64编码后出现的“=”等于号,然后,因为我PC端支付采用的是GET请求的方式,url中不能存在“=”,所以导致出现问题,这样的话其实还有另外一种解决方案,就是对Base64编码后的字符串再进行urlEncode,这样就比较麻烦。

至于,为啥PC版出现问题,手机端没问题,原因就是手机端采用的是POST请求的方式(原来PC端也采用的post方式,后来由于form表单请求被浏览器拦截,就试着改成get请求,没改回来),biz_content是放在表单里面请求,所以没有出现问题。

其实当时发现参数中包含“=”等于号就应该发现是因为get请求中包含了等于号而出现的错误,就可以省去了验证Base64是否正确的验证步骤,从而知道如何结局

你可能感兴趣的:(日常遇到的问题)