package jframe.pay.wx.http;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import jframe.pay.wx.domain.WxConfig;
import jframe.pay.wx.http.util.MD5Util;
/**
* 应答处理类 应答处理类继承此类,重写isTenpaySign方法即可。
*
* @author miklchen
*
*/
public class ResponseHandler {
/** 密钥 */
private String key;
/** 应答的参数 */
private SortedMap<String, String> parameters;
/** debug信息 */
private String debugInfo;
private String uriEncoding;
/**
* 构造函数
*
* @param request
* @param response
*/
// public ResponseHandler(Map<String, List<String>> paraMap) {
// this.key = "";
// this.parameters = new TreeMap<>();
// this.debugInfo = "";
//
// this.uriEncoding = "";
//
// Map<String, List<String>> m = paraMap;
// Iterator<String> it = m.keySet().iterator();
// while (it.hasNext()) {
// String k = it.next();
// String v = m.get(k).get(0);
// setParameter(k, v);
// }
//
// }
public ResponseHandler(Map<String, String> paraMap) {
this.key = "";
this.parameters = new TreeMap<>();
this.debugInfo = "";
this.uriEncoding = "";
Iterator<String> it = paraMap.keySet().iterator();
while (it.hasNext()) {
String k = it.next();
String v = paraMap.get(k);
setParameter(k, v);
}
}
/**
* 获取密钥
*/
public String getKey() {
return key;
}
/**
* 设置密钥
*/
public void setKey(String key) {
this.key = key;
}
/**
* 获取参数值
*
* @param parameter
* 参数名称
* @return String
*/
public String getParameter(String parameter) {
String s = (String) this.parameters.get(parameter);
return (null == s) ? "" : s;
}
/**
* 设置参数值
*
* @param parameter
* 参数名称
* @param parameterValue
* 参数值
*/
public void setParameter(String parameter, String parameterValue) {
String v = "";
if (null != parameterValue) {
v = parameterValue.trim();
}
this.parameters.put(parameter, v);
}
/**
* 返回所有的参数
*
* @return SortedMap
*/
@SuppressWarnings("rawtypes")
public SortedMap getAllParameters() {
return this.parameters;
}
/**
* 是否财付通签名,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
*
* @return boolean
*/
@SuppressWarnings("rawtypes")
public boolean isTenpaySign() {
StringBuffer sb = new StringBuffer();
Set es = this.parameters.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
String v = (String) entry.getValue();
if (!"sign".equals(k) && null != v && !"".equals(v)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + this.getKey());
// 算出摘要
// String enc = TenpayUtil.getCharacterEncoding(this.request,
// this.response);
String enc = WxConfig.getConf(WxConfig.KEY_CHARSET);
String sign = MD5Util.MD5Encode(sb.toString(), enc).toLowerCase();
String tenpaySign = this.getParameter("sign").toLowerCase();
// debug信息
this.setDebugInfo(sb.toString() + " => sign:" + sign + " tenpaySign:"
+ tenpaySign);
return tenpaySign.equals(sign);
}
/**
* 返回处理结果给财付通服务器。
*
* @param msg
* : Success or fail。
* @throws IOException
*/
// public void sendToCFT(String msg) throws IOException {
// String strHtml = msg;
// PrintWriter out = this.getHttpServletResponse().getWriter();
// out.println(strHtml);
// out.flush();
// out.close();
//
// }
/**
* 获取uri编码
*
* @return String
*/
public String getUriEncoding() {
return uriEncoding;
}
/**
* 设置uri编码
*
* @param uriEncoding
* @throws UnsupportedEncodingException
*/
@SuppressWarnings("rawtypes")
public void setUriEncoding(String uriEncoding)
throws UnsupportedEncodingException {
if (!"".equals(uriEncoding.trim())) {
this.uriEncoding = uriEncoding;
// 编码转换
// String enc = TenpayUtil.getCharacterEncoding(request, response);
String enc = WxConfig.getConf(WxConfig.KEY_CHARSET);
Iterator it = parameters.keySet().iterator();
while (it.hasNext()) {
String k = (String) it.next();
String v = getParameter(k);
v = new String(v.getBytes(uriEncoding.trim()), enc);
this.setParameter(k, v);
}
}
}
/**
* 获取debug信息
*/
public String getDebugInfo() {
return debugInfo;
}
/**
* 设置debug信息
*/
protected void setDebugInfo(String debugInfo) {
this.debugInfo = debugInfo;
}
}