最近做了Java版本的工行支付接口版本。根据工行提供的Java的Demo程序,略经修改,可以用了。
支付流程大致如下:
1 在我们的页面,客户生成订单,发起支付请求(支付页面),支付页面包含银行回调页面(merchant_url)。
2 客户进入银行支付页面,完成支付
3 银行在支付成功后,服务器向我们的支付服务器发起页面请求
4 我们的页面接到银行post过来的数据,进行签名验证,成功后处理相关业务,最终返回一个只有一个供客户浏览(我们通知客户支付成功)的页面地址(URL)给工行
5 工行接到我们的返回URL后,将此URL返回给浏览器
6 客户看到我们的支付成功的通知。
在开发过程中,出现了一个问题,纠结了很久。原来是Base64编码的中文支持问题,
从明文生成字节数组时,原来没有指定编码,导致银行解码错误,从而不能支付。
后加入了参数"GBK",终于成功。
byte[] byteSrc = TranData.getBytes("gbk");
下面是代码的其中一部分
<%
SimpleDateFormat sdf = new SimpleDateFormat("HHmmss");
Calendar c = Calendar.getInstance();
c.setTime(new Date());
String curTime = "20111101" + sdf.format(c.getTime());
String merReference = "pay.xxx.com";
String TranData = "<?xml version="1.0" encoding="GBK" standalone="no"?>"
+"<B2CReq>"
+"<interfaceName>ICBC_PERBANK_B2C</interfaceName>"
+"<interfaceVersion>1.0.0.11</interfaceVersion>"
+"<orderInfo>"
+"<orderDate>" + curTime + "</orderDate>"
+"<curType>001</curType>"
+"<merID>" +"0200EC23750709" + "</merID>"
+"<subOrderInfoList>"
+"<subOrderInfo>"
+"<orderid>" + curTime +"1416290" +"</orderid>"
+"<amount>" + amount + "</amount>"
+"<installmentTimes>1</installmentTimes>"
+"<merAcct>" + "0200004519000100173" +"</merAcct>"
+"<goodsID>001</goodsID>"
+"<goodsName>商品</goodsName>"
+"<goodsNum>2</goodsNum>"
+"<carriageAmt>20</carriageAmt>"
+"</subOrderInfo>"
+"</subOrderInfoList>"
+"</orderInfo>"
+"<custom>"
+"<verifyJoinFlag>0</verifyJoinFlag>"
+"<Language>ZH_CN</Language>"
+"</custom>"
+"<message>"
+"<creditType>2</creditType>"
+"<notifyType>" +"HS" + "</notifyType>"
+"<resultType>1</resultType>"
+"<merReference>" + merReference+"</merReference>"
+"<merCustomIp>" + request.getRemoteAddr().toString() + "</merCustomIp>"
+"<goodsType>1</goodsType>"
+"<merCustomID>80004000</merCustomID>"
+"<merCustomPhone>85865623</merCustomPhone>"
+"<goodsAddress>朝阳</goodsAddress>"
+"<merOrderRemark>loongtao</merOrderRemark>"
+"<merHint></merHint>"
+"<remark1></remark1>"
+"<remark2></remark2>"
+"<merURL>http://"+ merReference+"/pay/IcbcPayback.jsp</merURL>"
+"<merVAR>" + "varTest" + "</merVAR>"
+"</message>"
+"</B2CReq>";
out.println("<font face='Arial' size='4' color='Green'>明文:</font>"+TranData+"<br>");
String password = "12345678";
String TranDataBase64 = "";
String SignMsgBase64 = "";
String CertBase64 = "";
try{
byte[] byteSrc = TranData.getBytes("gbk");
char[] keyPass = password.toCharArray();
byte [] byteSrcBase64= ReturnValue.base64enc(byteSrc);
TranDataBase64 = new String(byteSrcBase64).toString();
String linuxdir = "/home/xxx/icbc/";
String windir = "d:\\icbc\";
String selDir = windir;
String osName = System.getProperty("os.name");
if (!osName.contains("Windows"))
selDir = linuxdir;
out.println("KeyDir = " + selDir);
File f = new File(selDir + "tranData.log");
FileWriter fw = null;
fw = new FileWriter(f,true);
fw.write("time\t" + curTime+"\n");
fw.write("TranData\t" + TranData + "\n\n");
//fw.write("TranDataBase64\t" + TranDataBase64 + "\n\n");
fw.flush();
fw.close();
FileInputStream in1 = new FileInputStream(selDir+ "user.crt");
byte[] bcert = new byte[in1.available()];
in1.read(bcert);
in1.close();
FileInputStream in2 = new FileInputStream(selDir + "user.key");
byte[] bkey = new byte[in2.available()];
in2.read(bkey);
in2.close();
byte[] sign =ReturnValue.sign(byteSrc,byteSrc.length,bkey,keyPass);
if (sign==null) {
out.println("<font face='Arial' size='4' color='Red'>签名失败,签名返回为空。<br>请检查证书私钥和私钥保护口令是否正确。</font><br>");
}else{
//out.println("<font face='Arial' size='4' color='Green'>签名成功</font><br>");
%>
<form name="form1" method="post" action="https://mybank.dccnet.com.cn/servlet/ICBCINBSEBusinessServlet">
<table width="100%" height="35" border="0" cellpadding="0" cellspacing="0">
<tr>
<td height="80" align="center"><input type="submit" value="确认支付">
<INPUT NAME="interfaceName" TYPE="hidden" value="ICBC_PERBANK_B2C" >
<INPUT NAME="interfaceVersion" TYPE="hidden" value="1.0.0.11">
<INPUT NAME="tranData" TYPE="hidden" value="<%=TranDataBase64%>">
<INPUT NAME="merSignMsg" TYPE="hidden" value="<%=SignMsgBase64%>">
<INPUT NAME="merCert" TYPE="hidden" value="<%=CertBase64%>">
</td>
</tr>
</table>
</form>
分享到:
相关推荐
《工行网银支付接口开发详解》 工行网银支付接口开发是电子商务与金融领域的重要环节,它为商家提供了一种安全、便捷的在线收款方式。本文将深入探讨工行网上银行支付接口的规范、API接口的使用,以及不同编程语言...
在本压缩包“工行支付Java代码示例.zip”中,包含了使用Java语言与中国工商银行网上银行新B2C在线支付接口进行集成的示例代码。这个API SDK版本为icbc-api-sdk-cop_v2_20181211,意味着它是2018年12月11日更新的版本...
工行支付Java Demo是一个用于演示如何在Java环境中集成工商银行支付接口的应用示例。这个Demo通常包含必要的API调用、请求处理、响应解析以及错误处理等核心功能,帮助开发者快速理解和实现工行支付的业务流程。 1....
Java版本的代码可能包含工商银行支付接口的SDK,包括了支付请求类、响应解析类、签名验证等相关功能。开发者可以利用这些代码在Java环境中实现与工行系统的对接,确保支付过程的稳定和安全。 再者,.NET平台的示例...
文件“java_aix+linux”可能包含了在AIX(IBM的一种Unix变种)和Linux系统下开发和部署工行B2C接口的指南,包括安装JDK、配置环境变量、解决跨平台问题以及性能优化等内容。而“java_win”则针对Windows系统的具体...
工商银行支付Demo是一个基于Java开发的示例项目,用于展示如何集成工商银行的支付接口,以便在电商、服务类应用中实现安全、便捷的在线支付功能。这个Demo涵盖了从发起支付请求到处理支付结果的整个流程,对于理解和...
"ECshop工行支付接口插件"就是为ECShop设计的一个专用模块,允许商家在他们的ECShop商城中集成工商银行的B2C(Business to Consumer)在线支付功能,以方便顾客进行安全、便捷的交易。 首先,我们需要理解B2C在线...
2. 商户按照工行B2C支付1.0.0.11接口形成提交数据,并使用工行提供API和商户证书对订单数据签名,形成form表单返回客户浏览器,表单action地址指向工行接收商户订单信息的servlet; 3. 客户确认使用工行支付后,提交...
本文将详细解析“ICBC工商银行在线支付各种SDK(仅供参考).rar”压缩包中的内容,主要涉及ICBC(中国工商银行)的在线支付接口及其SDK(Software Development Kit)的应用。工行作为中国最大的商业银行之一,其在线...
ASP.NET工商银行在线支付接口是将工商银行的支付系统与企业自身的应用程序进行集成的一种技术实现,它使得用户可以在企业的网站上直接进行安全便捷的支付操作,无需跳转到工商银行的页面。这个接口通常涉及到银行的...
总的来说,中国工商银行的C2C在线支付接口为电商平台提供了便利的支付解决方案,但其背后涉及到的技术细节和业务流程复杂,需要开发者具备扎实的编程基础和金融支付领域的知识。通过深入理解和应用这份接口说明,...
工行B2C在线支付插件是ECShop为了实现与工商银行的电子商务交易接口对接而开发的一个扩展功能,它使得用户在ECShop购物时可以方便、安全地通过工商银行进行支付。 这个插件的工作原理主要包括以下几个关键知识点: ...
通过以上说明,我们可以看出中国工商银行的B2C在线支付接口是一个高度规范化和安全化的系统,旨在为商家提供便捷、可靠的支付解决方案,同时也保护了消费者的权益。在实际应用中,商家需要对这些接口有深入的理解,...
《工行支付接口文档》是工商银行为开发者提供的一份详细指南,用于解释如何与工商银行的支付系统进行交互。这份文档涵盖了关键的接口操作,包括签名、验签、加密和解密等安全操作,确保交易过程的安全性和完整性。 ...
中国工商银行的网上银行B2C在线支付接口是一个用于商家(Business-to-Consumer)与消费者间安全交易的技术规范,主要用于电子商务场景。此接口旨在提供一种高效、安全的方式,使得消费者能够直接通过工行网银系统...
在IT行业中,工商银行提供的Java SDK(Software Development Kit)是一种重要的开发工具,主要针对开发者们进行与工商银行接口交互的编程需求。SDK通常包含了类库、文档、示例代码以及必要的工具,帮助开发者快速...
工商银行聚合支付
【icbc工行B2C在线支付完整sdk】是一个针对工商银行B2C(Business to Consumer)在线支付场景的SDK(Software Development Kit)。这个SDK包含了多种编程语言的支持,尽管版本较低,但对于基本的支付功能实现来说...