对接不同银行存管系统报文适应性问题解决方案
关键词:request加强addParameter()方法
#业务场景:
原本汇付天下异步返回的报文
{
'参数1':'值1',
'参数2':'值2',
'参数3':'值3',
'参数4':'值4',
'ChkValue':'对所有的参数进行密钥加密的数据'
}
现鄂托克前旗农商银行的异步返回报文
{
'ChkValue':'对所有的参数进行公钥加密的数据'
}
汇付天下解签,是将所有参数1…n进行加密后的ChkValue进行解签,然后对比所有的参数进行校验。
鄂托克前旗农商银行,试讲ChkValue直接解签,然后就可以取参数用了。
其二者后者比较安全,前者安全性降低了。
#面临的问题
二期工程中祖宗代码还在,要给鄂托克的request进行转换为汇付的request。
#解决方案
对request进行增强,增强request方案,增加addParameter方法,然后重新给request。
#代码
pom.xml添加依赖
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-servlet_2.4_spec</artifactId>
<version>1.1.1</version>
<scope>provided</scope>
</dependency>
ParameterRequestWrapper.java增强类,继承HttpServletRequestWrapper,增加addParameter方法。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class ParameterRequestWrapper extends HttpServletRequestWrapper {
private Map<String, String[]> params = new HashMap<String, String[]>();
@SuppressWarnings("unchecked")
public ParameterRequestWrapper(HttpServletRequest request) {
super(request);
// TODO Auto-generated constructor stub
}
// 重载一个构造方法
public ParameterRequestWrapper(HttpServletRequest request,
Map<String, Object> extendParams) {
this(request);
addAllParameters(extendParams);// 这里将扩展参数写入参数表
}
@Override
public String getParameter(String name) {
// 重写getParameter,代表参数从当前类中的map获取
String[] values = params.get(name);
if (values == null || values.length == 0) {
return null;
}
return values[0];
}
public String[] getParameterValues(String name) {// 同上
return params.get(name);
}
public void addAllParameters(Map<String, Object> otherParams) {
// 增加多个参数
for (Map.Entry<String, Object> entry : otherParams.entrySet()) {
addParameter(entry.getKey(), entry.getValue());
}
}
public void addParameter(String name, Object value) {// 增加参数
if (value != null) {
if (value instanceof ArrayList) {
String value1 = String.valueOf(value).substring(1,
String.valueOf(value).length());
value = value1.substring(0, value1.length() - 1);
params.put(name, new String[] { (String) value });
} else if (value instanceof String[]) {
params.put(name, (String[]) value);
} else if (value instanceof String) {
params.put(name, new String[] { (String) value });
} else {
params.put(name, new String[] { String.valueOf(value) });
}
}
}
}
CallBackServlet.java转换request
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
/***************************************鄂托克报文转为汇付报文格式****************************************/
boolean verifyFlag = false;//验签标志位
ParameterRequestWrapper requestWrapper = new ParameterRequestWrapper(request);
String chkValue = null;
try {
chkValue = SignUtils.cfcaSDncrypt(request.getParameter("ChkValue"));//解签鄂托克返回的报文
verifyFlag = true;//解签成功,改变验签标志位
} catch (Exception e) {
verifyFlag = false;//解签失败,改变验签标志位
MonitorLog.log(CallBackServlet.class.getName(), MonitorLog.WARNING, 0, "验签发生错误!");
}
Map map = JSON.parseObject(chkValue);//将解签的 json string 数据进行转换为map类型
for (Object obj : map.keySet()){ //遍历map,将其所有参数,add到加强的ParameterRequestWrapper对象
requestWrapper.addParameter(obj.toString(), map.get(obj));
}
request = requestWrapper;//重新将加强的ParameterRequestWrapper对象赋值给传进来的request
/***************************************鄂托克报文转为汇付报文格式****************************************/
}