中国建设银行网上支付接口以及自动对账

一、关于支付:

 最近用java语言做了一个建行网上支付的系统,和建行做的接口。现在整理一下发布出来。

 开发之前,参考了同道中人苏飞同学的一篇文章,他写的非常好,非常完善和细致。用.net语言所写,见链接:

 http://www.cnblogs.com/sufei/archive/2010/07/22/1783168.html,我呢,用java来改善补充了一下。

      MD5算法,在.net中,有框架自带可以直接调用。在java中调用java.security.MessageDigest即可。

  当然也可以网上找,很多。

      把银行所需要的参数和值拼成sql串,加密后传送。链接上建行的网站。支付后会有成功或失败的返回结果。

  这个结果需要用来接收。商户下载证书后生成的密钥和银行处理完返回的sign签名需要一致,才更改订单。

二、关于自动对账:

        银行会在晚上处理当天的流水账,所以第二天可以进行已支付流水的查询和对账。我们可以以操作员的身份

  下载对账文件,也可以完全交给程序来自动完成。

        在银行提供的 “一点接入网上支付商户批量查询接口技术文档V1.2.doc”中,我选择了返回xml方式来获取。

        原理是,提供文档中所需要的参数和值传入指定URL,然后银行处理完毕会返回xml以网页形式,

   我们用 HttpClient 程序来读取其中的内容即可。该jar包见附件。

Java代码 收藏代码
HttpClient client = new HttpClient();
HttpMethod method = new PostMethod(url);

method.setRequestHeader(“User-Agent”,“Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)”);
method.setRequestHeader(“Content-Encoding”,“text/html”);
method.setRequestHeader(“Content-Type”,“text/xml; charset=UTF-8”);
method.setRequestHeader(“Accept-Language”, “zh-cn”);
method.setRequestHeader(“Connection”,“close”);

client.executeMethod(method);
byte[] bytes = method.getResponseBody();
String xmlString = new String(bytes);
System.out.println(xmlString.trim());
由于返回的xml开头空了4行,所以需要setRequestHeader来设置后才可以获取。

   解析此xml,我选择jdom方式,不过处理前还是需要处理下,如下:

Java代码 收藏代码
String tempString = “”;
InputStream is = new ByteArrayInputStream(xmlString.getBytes());
BufferedReader br = new BufferedReader(new InputStreamReader(is, “utf-8”));
for (String temp = br.readLine(); temp != null;
tempString += temp, temp = br.readLine()
);
logger.info(“银行返回的xml字符串:”+tempString);

InputStream stream = new ByteArrayInputStream(tempString.getBytes());
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(stream);
继续

Java代码 收藏代码
//看是否能返回正确的xml格式数据
NodeList nodeList = doc.getElementsByTagName(“DOCUMENT”);
for (int i = 0; i < nodeList.getLength(); i++) {
Element be = (Element) nodeList.item(i);
NodeList childNodes = be.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++) {
if(“RETURN_CODE”.equals(childNodes.item(j).getNodeName())){
if(“000000”.equals(childNodes.item(j).getTextContent())){ //000000表示返回的是正确的对账数据
logger.info(“返回正确的数据格式!”);
//读取 QUERYORDER 内容
readXML(doc);
}else{
logger.error(“返回数据格式错误!”);
}
}
}
//循环结束
stream.close();
}

Java代码 收藏代码
NodeList nlCurrent = doc.getElementsByTagName(“QUERYORDER”);
for (int j = 0; j < nlCurrent.getLength(); j++) {
Element elmtLesson = (Element) nlCurrent.item(j);
NodeList nlLesson = elmtLesson.getElementsByTagName(“ORDERID”);
System.out.println(nlLesson.item(0).getFirstChild().getNodeValue());

    NodeList code = elmtLesson.getElementsByTagName("STATUSCODE");  
    String ORDERID = nlLesson.item(0).getFirstChild().getNodeValue();  
    String STATUSCODE = code.item(0).getFirstChild().getNodeValue();  
}  
  ORDERID  即是订单号,接下来就是处理订单对象了,此处省略200字 。。。。

  还有,程序要每天执行一次,可以用java.util下的Timer来设定调用,方法不难,网上例子很多。

这里我用了spring的quartz来调用,代码如下:

Java代码 收藏代码





0 30 1 * * ?
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值