今天在对接支付宝支付时,支付宝回调报错,显示
org.springframework.web.HttpMediaTypeNotSupportedException:
Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported
一、分析:
这个问题的意思其实是,支付宝请求头和我们系统接口定义的请求头不一致导致的
支付宝的请求头是
application/x-www-form-urlencoded;charset=UTF-8
而我们接口定义的地方是这样的,使用了@RequestBody
而RequestBody对应的请求头是application/json,所以这样就出现问题。
二、解决方法:
因为我们不能去改支付宝的请求,所以我们只能修改我们的代码
使用
HttpServletRequest req
然后用Http工具获取request里面的参数
public static Map getParameterMap(HttpServletRequest request) {Enumeration parameters = request.getParameterNames();HashMap params = new HashMap();while(parameters.hasMoreElements()) {String parameter = (String)parameters.nextElement();String value = request.getParameter(parameter);if (StringUtils.isNotBlank(value)) {params.put(parameter, value);}}return params;}
三、扩展
其实这种问题我们可以用postman来重现
1、如果使用@RequestBody,我们就得把参数放在Body里面,这样是没问题的,如图:
Body里必须是raw,下拉选择JSON格式。
2、在raw前面还有一个x-www-form-urlencoded选项tab,这个正好对应支付回调的请求头
我们可以模拟一下
发现问题,记录一下