对接不同银行存管系统报文适应性问题解决方案

对接不同银行存管系统报文适应性问题解决方案

关键词: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
		/***************************************鄂托克报文转为汇付报文格式****************************************/
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值