SpringMVC下微信、支付寶一直進行非同步通知
阿新 • • 發佈:2019-01-09
ResponseBody和Json轉換器對微信、支付寶非同步通知的影響
一、現象
寫好非同步通知程式碼後,測試時發現支付寶以及微信在進行非同步通知時都在一直髮送訊息,說明我們返回的“成功”它們沒有收到,儘管輸出了相應的 success 或者 success的xml。
二、原因
由於非同步通知介面方法使用了@ResponseBody註解,而配合瞭如下配置檔案:
<!-- Jackson轉換器 -->
<bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 啟動Spring MVC的註解功能,完成請求和返回的POJO-json/xml自動轉換 -->
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<!-- json轉換器 -->
<ref bean="mappingJacksonHttpMessageConverter" />
</list>
</property>
</bean>
這會導致所有請求均返回json資料,而對於支付寶,將返回“success”,注意是帶有雙引號的success。而微信將返回
“<xml>
<return_code>
<![CDATA[FAIL]]>
</return_code>
<return_msg>
<![CDATA[通知簽名驗證失敗]]>
</return_msg>
</xml>”
也帶有雙引號,因此支付寶和微信不能正確識別。
三、解決方案
因此需要另外配置一個string轉換器,將結果以string方式轉換,這樣就不會出現雙引號。
配置如下:
<!-- String轉換器(為配合APP支付非同步通知) -->
<bean id="stringHttpMessageConverter"
class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8" index="0"></constructor-arg><!--避免出現亂碼 -->
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
<value>text/xml;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 啟動Spring MVC的註解功能,完成請求和返回的POJO-json/xml自動轉換 -->
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<!-- json轉換器 -->
<ref bean="mappingJacksonHttpMessageConverter" />
<ref bean="stringHttpMessageConverter" />
</list>
</property>
</bean>
以上的text/plain 和text/xml表示response的ContentType如果為這兩種格式,則交由string轉換器轉換。同時介面方法程式碼上應類同於如下: