今天在對接支付寶支付時,支付寶回調報錯,顯示
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<String, String> getParameterMap(HttpServletRequest request) {
Enumeration<String> 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,這個正好對應支付回調的請求頭
我們可以模拟一下
發現問題,記錄一下