`
bosschen
  • 浏览: 196678 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

阅读更多

一、关于支付:

     最近用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包见附件。

    

	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方式,不过处理前还是需要处理下,如下:

 

 		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);

      继续

  

		//看是否能返回正确的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();
	    }

 

	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来调用,代码如下:

	<bean name="quartzQueryBean"
		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="CCBBankQueryService" />
		<!-- 调用CCBBankQueryService类的autoQuery方法 -->
		<property name="targetMethod" value="autoQuery" />
		<property name="concurrent" value="false" />
	</bean>

	<bean name="quartzAutoQuery" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail" ref="quartzQueryBean" />
		<property name="cronExpression">
			<!-- 每天晚上1点30分 执行一次 > -->
			<value>0 30 1 * * ?</value>
		</property>
	</bean>
	<!-- quartz触发管理器 -->
	<bean name="quartzScheduler"
		class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="quartzAutoQuery" />
			</list>
		</property>
	</bean>

   时间关系,说的不很详细,如果有疑问处或想深入交流的童鞋们,可以加我QQ:361570665.

分享到:
评论
4 楼 juzhishang 2012-04-01  
请问传递参数的URL格式是啥?能举个例子不?
3 楼 juzhishang 2012-03-22  
受教了,多谢
2 楼 bosschen 2011-10-27  
不用客气,共同进步嘛。
1 楼 relic6 2011-10-27  
楼主的一句: “由于返回的xml开头空了4行,所以需要setRequestHeader来设置后才可以获取”,拯救了我纠结了1天的问题,在此,非常感谢楼主此贴~

相关推荐

    调查银行网上业务与网站的支付方式体验.pdf

    中国建设银行提供了账户查询、网上缴费、网上支付、账户转账等支付方式体验。 三、比较银行网上业务 通过比较不同银行的网上业务,可以发现每家银行都有其特色。工商银行的特色是安全可靠、功能强大、方便快捷、...

    潍坊执业医师医学综合笔试网上缴费通知.doc

    4. **支付方式**:系统支持五家银行进行在线支付,分别是:中国银行、建设银行、工商银行、农业银行和中信银行。值得注意的是,中国银行和建设银行不接受信用卡支付。目前,该系统暂不支持微信、支付宝等其他常见的...

    用友培训课件:NC63全产品培训-银企直连.pptx

    用友NC63的银企直联模块广泛支持中国主要银行,如中国银行、兴业银行、招商银行、上海浦东发展银行、江苏银行等,并涵盖交通银行、建设银行、工商银行、农业银行、光大银行、中信银行、民生银行等多个银行的专线、...

    财务公司信息化建设的理论与实践.docx

    - **背景**: 中油财务与中国工商银行签订战略合作协议,实现资金集中管理和支付结算。 - **模式**: 成员企业在中油财务开立虚账户,在工商银行开立实账户,虚账户与实账户实时联动,确保资金信息准确无误。 - **成效...

    AMT咨询观点之:中国金融行业的信息化.doc

    银行以其吸收存款为主要资金来源,并通过发放贷款作为资金运用的核心,承担着信用中介、支付中介以及信用创造等基本职能。在中国,商业银行和中央银行被视为核心银行机构。而非银行金融机构则涵盖了开发银行、投资...

    金融行业信息化建设参照.pdf

    这期间,信息技术成为推动金融行业变革的关键,如CRM系统、网上银行、移动支付等新兴服务的出现。 2. 信息化建设的影响 金融信息化对于行业的影响深远,包括但不限于: - 提升服务质量:通过自动化处理,提高了...

Global site tag (gtag.js) - Google Analytics