package weixin.popular.client; import java.io.IOException; import java.util.Map; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.ResponseHandler; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import weixin.popular.bean.DynamicField; import weixin.popular.bean.paymch.MchBase; import weixin.popular.util.SignatureUtil; import weixin.popular.util.XMLConverUtil; public class XmlResponseHandler{ private static Logger logger = LoggerFactory.getLogger(XmlResponseHandler.class); public static <T> ResponseHandler<T> createResponseHandler(Class<T> clazz){ return new XmlResponseHandlerImpl<T>(null, clazz,null,null); } public static <T> ResponseHandler<T> createResponseHandler(Class<T> clazz,String sign_type,String key){ return new XmlResponseHandlerImpl<T>(null, clazz,sign_type,key); } public static class XmlResponseHandlerImpl<T> extends LocalResponseHandler implements ResponseHandler<T> { private Class<T> clazz; private String sign_type; //签名校验key private String key; public XmlResponseHandlerImpl(String uriId, Class<T> clazz,String sign_type,String key) { this.uriId = uriId; this.clazz = clazz; this.sign_type = sign_type; this.key = key; } @Override public T handleResponse(HttpResponse response) throws ClientProtocolException, IOException { int status = response.getStatusLine().getStatusCode(); if (status >= 200 && status < 300) { HttpEntity entity = response.getEntity(); String str = EntityUtils.toString(entity); Header contentType = response.getEntity().getContentType(); if(contentType!=null&&!contentType.toString().matches(".*[uU][tT][fF]-8$")){ str = new String(str.getBytes("iso-8859-1"),"utf-8"); } logger.info("URI[{}] elapsed time:{} ms RESPONSE DATA:{}",super.uriId,System.currentTimeMillis()-super.startTime,str); T t = XMLConverUtil.convertToObject(clazz,str); if(t instanceof DynamicField ||(t instanceof MchBase && key != null)){ Map<String,String> map = XMLConverUtil.convertToMap(str); //转换动态属性 @since 2.8.5 if(t instanceof DynamicField){ DynamicField dynamicField = (DynamicField)t; dynamicField.buildDynamicField(map); } //返回数据验证签名 @since 2.8.5 if((t instanceof MchBase && key != null)){ MchBase mchBase = (MchBase)t; mchBase.setSign_status(SignatureUtil.validateSign(map,sign_type,key)); } } return t; } else { throw new ClientProtocolException("Unexpected response status: " + status); } } } }