中国工商银行网上银行系统——API 查询接口(V6.0)中国工商银行软件开发中心Copyright Reserved2005 年 8 月商户手册 网上银行商户手册 v3.0©Copyright ICBC SDC 2001.5 - 1 -前 言该文档说明了商户使用工行提供的 API 接口进行查询时的通信方式和需要上送的数据和工行返回信息的格式 网上银行商户手册 v3.0©Copyright ICBC SDC 2001.5 - 2 -目 录前 言 .................................................................................................................................................11.商户端的接口 .....................................................................................................................................31.1 参数名及其内容列表 ..................................................................................................................31.2 一个链接例子 ..............................................................................................................................32.银行反馈信息的接口 .........................................................................................................................4 网上银行商户手册 v3.0©Copyright ICBC SDC 2001.5 - 3 -1.商户端的接口商户实现双向的 ssl 与工行服务器建立连接。
建立 ssl 连接时使用商户的api 证书(文件名类似****.e.****的软证书) 之后商户必须将查询上送数据用工行规定的格式以 Form 提交方式中的 Post方法,将数据提交到中国工商银行指定的 API 查询 URL (https://*.*.*.*/servlet/ICBCINBSEBusinessServlet,严格区分大小写,请联系所在地分行确认投产环境和测试环境的 IP 地址)1.1 参数名及其内容列表1.1.1 B2B 订单交易状态查询的 API 接口1.1.1.1 请求数据格式:变量名称 变量命名 长度定义 说明接口名称 APIName MAX (30) 必输,签名,上送“EAPI”,区别大小写!接口版本号 APIVersion =15 必输,签名,上送”001.001.001.001”请求数据,xml包(格式见下)MerReqData请求数据中的xml包格式(注意:xml包中所有字段都是必输项):订单号 交易日期商家号码商城账号1.1.1.2 返回数据格式注意:返回数据是经过了 url 编码的查询b2b订单信息返回有两种格式,如果查询成功则返回是一个xml包,格式: 网上银行商户手册 v3.0©Copyright ICBC SDC 2001.5 - 4 -接口名称接口版本号订单号 交易日期商家号码商城账号指令序号订单处理状态指令错误信息订单总金额支付币种返回通知日期时间收款人账号收款人户名校验联名标志商城联名标志客户联名标志联名会员号商户签名证书id如果查询失败则返回只有五位错误码,含义可以见文档后面。
1.1.2 B2C 订单交易状态查询的 API 接口1.1.1.1 请求数据格式:变量名称 变量命名 长度定义 说明接口名称 APIName MAX (30) 必输,签名,上送“EAPI”,区别大小写!接口版本号 APIVersion =15 必输,签名,上送”001.001.002.001”请求数据,xml包(格式见下)MerReqData请求数据中的xml包格式(注意:xml包中所有字段都是必输项):订单号 交易日期 网上银行商户手册 v3.0©Copyright ICBC SDC 2001.5 - 5 -商家号码商城账号1.1.1.2 返回数据格式注意:返回数据是经过了 url 编码的查询b2c订单信息返回有两种格式,如果查询成功则返回是一个xml包,格式:接口名称接口版本号订单号 交易日期商家号码商城账号指令序号订单处理状态指令错误信息订单总金额支付币种返回通知日期时间商城账号商城户名校验联名标志商城联名标志客户联名标志联名会员号商户签名证书id如果查询失败则返回只有五位错误码,含义可以见文档后面。
1.1.3 C2C 订单交易状态查询的 API 接口1.1.1.1 请求数据格式:变量名称 变量命名 长度定义 说明接口名称 APIName MAX (30) 必输,签名,上送“EAPI”,区别大小写!接口版本号 APIVersion =15 必输,签名,上送”001.001.003.001” 网上银行商户手册 v3.0©Copyright ICBC SDC 2001.5 - 6 -请求数据,xml包(格式见下)MerReqData请求数据中的xml包格式(注意:xml包中所有字段都是必输项):订单号 交易日期商家号码商城账号1.1.1.2 返回数据格式注意:返回数据是经过了 url 编码的查询c2c订单信息返回有两种格式,如果查询成功则返回是一个xml包,格式:接口名称接口版本号订单号 交易日期商家号码商城账号指令序号订单处理状态指令错误信息订单总金额支付币种返回通知日期时间收款人账号收款人户名校验联名标志商城联名标志客户联名标志联名会员号卖家收款卡号卖家收款人户名 网上银行商户手册 v3.0©Copyright ICBC SDC 2001.5 - 7 -商户签名证书id如果查询失败则返回只有五位错误码,含义可以见文档后面。
1.2 一个链接例子以下给出商户提交查询请求的例子(注意避免使用中文的全角符号)(form 不能有 name 属性,另外注意协议是 https)19821981200508160200EC000003210200029109000018680 ">1. 3 注意事项1. 商城证书 id 对商城账号必须有查询权限2. 请求数据中不要有多余的空格3. 关于双向 SSL 的建立我们会提供 java 和.net 的两个例子,开发时可以参照4. 从商户 Post 过来的数据,参数名的名称必须与接口表中完全相同,名称中的字母大小写均要相同,不能进行随意更改(在 form 中的提交按钮中 submit 不能有 Name 属性);此外,如果其他 input 项的 Name 中使用了双引号,如:,则一定注意在引号内不要包含空格,不要写成“Merchant URL ”或者“ Mer chantURL”5. 要求商户使用字符集 GBK6. 注意请求地址以 https 开头7. 注意对于请求中的 MerReqData 这项的值最好经过 URL 编码后再上送,否则对于一些特殊字符可能会被 URL 解码造成错误(就目前的包格式来看不编码也不会有问题)。
网上银行商户手册 v3.0©Copyright ICBC SDC 2001.5 - 8 -1.4 错误代码含义40972API 查询的订单不存在40973API 查询过程中系统异常40976API 查询系统异常40977商户证书信息错40978解包商户请求数据报错40979查询的订单不存在40980API 查询过程中系统异常40981给商户打包返回数据错40982系统错误40983查询的订单不唯一40987请求数据中接口名错误40947商户代码或者商城账号有误40948商城状态非法40949商城类别非法40950商城应用类别非法40951商户证书 id 状态非法40952商户证书 id 未绑定40953商户 id 权限非法40954检查商户状态时数据库异常1. 5 指令状态含义:b2b3:指令处理完成,转账成功4:指令处理失败,转账未完成6:指令超过支付人的限额,正在等待主管会计批复7:指令超过支付人的限额,正在等待主管会计第二次批复8:指令超过支付人的限额,被主管会计否决9:银行正在处理(可疑)b2c0-支付成功,未清算1-支付成功,已清算2-支付失败3-支付可疑交易 网上银行商户手册 v3.0©Copyright ICBC SDC 2001.5 - 9 -c2c0-支付成功,未清算1-支付成功,已清算2-支付失败3-支付可疑交易1. 6 商户端开发的例子1.6.1 java 版try{.ssl.SSLSocketFactory factory = null;try{char passphrase[] = pswd.toCharArray();SSLContext ctx = SSLContext.getInstance("TLS");//证书类型可以根据实际情况填写KeyManagerFactory kmf = KeyManagerFactory.getInstance("IbmX509");//证书类型可以根据实际情况填写TrustManagerFactory tmf = TrustManagerFactory.getInstance("IbmX509");// ks_type 是证书库的类型KeyStore ks = KeyStore.getInstance(ks_type);if(!(new File(keystore)).isFile()){System.out.println("(ClientAuthA) Missing keyStore [" + keystore + "]");throw new IOException("Missing keystore = " + keystore);}ks.load(new FileInputStream(keystore), passphrase);kmf.init(ks, passphrase);tmf.init(ks);ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);factory = ctx.。