一、关于支付:
最近用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.
分享到:
相关推荐
网上银行对账签约,企业客户办理网上银行对账业务须与我行签订一式两份《中国农业银行对账服务协议》并填写《中国农业银行银企对账要素表》将对账方式指定为网上银行。 三、网上银行对账签约 网上银行对账签约是指...
33 2.3.2 签名与验签 33 3 附件 36 3.1 批量文件接口示例文件 36 3.2 错误码说明 36 1 前言 1.1 文档说明 本文描述了中国银行网上支付相关服务通讯协议、报文格式、安全机制。作为商户端系统技术人员开发的参考文档...
【建设银行善付通支付结算接入文档】是指导企业如何接入和使用善付通服务的详细技术指南。善付通是建设银行在善融商务平台上为供应链企业提供的一种高效、便捷的支付结算解决方案,旨在帮助企业优化订单管理、协同...
微信支付支付、退款及对账demo-c#、java、php
这个案例主要关注如何实现支付宝的自动对账功能,通过编程方式处理和校验交易数据。以下是对该案例的详细解释: 首先,"支付宝--对账案例"涉及到的主要知识点包括: 1. **支付宝API接口**:对账过程通常需要调用...
为了提高效率,减少人为错误,"银行与学校网上对账程序"应运而生。这个程序的核心功能是自动完成银行账户与学校财务系统的数据同步与核对,确保资金流动的准确无误。 对账是财务管理中的关键环节,它涉及到查找并...
网上银行接口在线支付接口是电子商务领域中的核心技术之一,主要用于实现商家与消费者之间的安全交易。这种接口通常被B2C(Business-to-Consumer)类型的电商平台所采用,为顾客提供便捷的在线支付方式。以下是对该...
聚合支付对账Axure原型设计,原型已完成99%的交互动作和详细逻辑描述。 原型包含: 1、通道对账单模版配置 2、通道对账单下载任务 3、通道对账单导入 4、对账批次管理 5、存疑订单管理 6、差错订单管理 7、差错订单...
招商银行的聚合支付接口可能支持这些常见的支付方式,并提供统一的交易管理和对账服务。 2. **招商银行接口**:招商银行提供了开放的API接口,允许第三方开发者通过调用这些接口实现与银行系统的交互,完成支付请求...
自动对账是指支付渠道提供线上对账单的方式,支付系统自动获取对账单并进行解析和转换成标准格式。手动对账是指支付渠道不提供线上对账单,需要财务人员手动获取对账单并上传到系统。 自动对账的逻辑流程如下: ...
可以说,对账是支付系统最头疼的事情。每一笔交易,都要做到各参与者的记录能够吻合,没有偏差。对账系统的工作,是发现有差异的记录,即轧帐;然后通过人工或者自动的方式,解决这些差异,即平帐。对电商系统来说,...
【银行网上支付接口(易宝)】是一种在线支付解决方案,主要针对电商、零售等行业的商家,使得用户在购物过程中能够方便地通过各大银行的网上银行系统进行支付。易宝支付作为第三方支付平台,起到了连接商家与银行之间...
《银行余额调节表自动编制与逸凡对账能手V2.3的深入解析》 在财务管理中,银行余额调节表是一项重要的工作,用于核对企业银行存款日记账与银行对账单之间的差异,确保账面余额与银行存款余额的一致性。手动编制此表...
本文档适用于需要与微信支付接口进行深度集成的开发者,旨在帮助他们理解并实施退款流程以及确保财务数据准确无误。 文档首先介绍了文档的概述,包括其目的、目标读者以及业务术语。这有助于开发者明确文档的目标和...
本文将深入探讨微信支付退款的流程、对账方法以及相关的API接口,帮助开发者理解和实现这一过程。 一、微信支付退款流程 微信支付退款是商家在完成交易后,由于商品问题、订单错误等原因需要退还消费者资金的操作...
本资源主要讨论银行网上业务和支付方式体验,涵盖了银行网上个人业务、支付方式体验、各种银行的网上业务比较等方面。 一、银行网上个人业务 银行网上个人业务提供了丰富的账户查询和管理功能,包括账户信息查询、...
2.1 支付对账流程 2.1.1 需求概述 2.1.2 功能思维导图 2.1.3 业务流程图 2.1.4 对账流程 2.1.5 差错流程 2.1.1 字段列举 10 2.2 对账管理 2.2.1 对账单模板配置 2.2.2 对账单下载任务 2.2.3 对账单导入 2.2.4 对账...
- **PHP**:PHP开发者可以使用微信支付的PHP SDK,同样有对应的退款和对账接口。示例代码会演示如何配置微信支付的凭据,然后调用`refund`和`downloadBill`方法。 - **C#**:对于C#开发者,微信支付提供了.NET SDK...