1. 程式人生 > >SpringMVC下微信、支付寶一直進行非同步通知

SpringMVC下微信、支付寶一直進行非同步通知

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轉換器轉換。同時介面方法程式碼上應類同於如下: