搞了很久,终于,在今天下班之后,工行技术工程师联系电话过来。好消息,有新进展了,自愿被迫加班1个小时,终于搞定了ICBC1.0.0.3接口的成功DEMO。
下面做分享和开发说明:
1.安装环境,接口开发要用到两个动态库文件,安装好,方法见:Php 使用 动态链接库的方法
2.把ICBC提供的两个公钥文件,一个私钥文件,放到固定一个目录(建议安全起见,在web目录以外)。记着是共3个文件,原来ICBC只给我一个公钥,一个私钥,可以支付,但是返回数据总是验证出错(囧)。
3.此demo包括两个文件:SendToBank.php,这是发送数据到银行网关的页面和ReceiveFromBank.php接受返回数据并做检查的页面
3.SendToBank.php代码:
<?php
date_default_timezone_set(‘Asia/Shanghai’);//时区设置对的话这句可以不要,因为ICBC银行服务器端要对交易时间要求,超过当前时间一小时的予以交易的
?>
<html>
<head>
<title>sendtobank</title>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>
</head>
<body>
点击按钮测试
<p>
<?php
//接口名称
$interfaceName=”ICBC_PERBANK_B2C”;
//接口版本号
$interfaceVersion=”1.0.0.3″;
//订单号
$orderid=’111222333′.rand(111,999);
//订单金额
$amount=’1′;
//支付币种
$curType=”001″;
//商户代码
$merID=”2103*****88888″;
//商城账号
$merAcct=”210320611******88888″;
//检验联名标志
$verifyJoinFlag=”0″;
//通知类型
$notifyType=”HS”;
//接收通知地址,就是验证返回数据的页面
$merURL=”http://www.youdomain.com/ReceiveFromBank.php”;
//结果发送类型
$resultType=”0″;
//交易日期时间
$orderDate = date(‘YmdHis’);
//加密字符串明文形式
$src = ‘<?xml version=”1.0″ encoding=”GBK” standalone=”no”?>’;
$src .= ‘<B2CReq>’;
$src .= “<interfaceName>{$interfaceName}</interfaceName>”;
$src .= “<interfaceVersion>{$interfaceVersion}</interfaceVersion>”;
$src .= “<orderInfo>”;
$src .= “<orderDate>{$orderDate}</orderDate>”;
$src .= “<orderid>{$orderid}</orderid>”;
$src .= “<amount>{$amount}</amount>”;
$src .= “<curType>{$curType}</curType>”;
$src .= “<merID>{$merID}</merID>”;
$src .= “<merAcct>{$merAcct}</merAcct>”;
$src .= “</orderInfo>”;
$src .= “<custom>”;
$src .= “<verifyJoinFlag>{$verifyJoinFlag}</verifyJoinFlag>”;
$src .= “<Language></Language>”;
$src .= “</custom>”;
$src .= “<message>”;
$src .= “<goodsID></goodsID>”;
$src .= “<goodsName></goodsName>”;
$src .= “<goodsNum></goodsNum>”;
$src .= “<carriageAmt></carriageAmt>”;
$src .= “<merHint></merHint>”;
$src .= “<remark1></remark1>”;
$src .= “<remark2></remark2>”;
$src .= “<merURL>{$merURL}</merURL>”;
$src .= “<merVAR></merVAR>”;
$src .= “</message>”;
$src .= “</B2CReq>”;
echo($src);
//创建对象
$bb = new COM(“ICBCEBANKUTIL.B2CUtil”);
//进行初始化,第一个参数是ICBC的公钥,第二个参数是你自己的公钥,第三个参数是你的私钥,第四个参数是密码
$bb->init(“D:\icbc\admin.crt”,”D:\icbc\my.crt”,”D:\icbc\my.key”,”88888″);
//交易数据,要进行base64编码
$trandata = base64_encode($src);
//订单签名数据merSignMsg的值
$ssrc = $bb->signC($src,strlen($src));
//获取商城证书公钥merCert的值
$cert=$bb->getCert(1);
?>
</p>
<form name=”sendOrder” method=”post” action=”https://mybank.icbc.com.cn/servlet/ICBCINBSEBusinessServlet”>
<input type=”hidden” name=”interfaceName” value=”<?php echo($interfaceName);?>”>
<input type=”hidden” name=”interfaceVersion” value=”<?php echo($interfaceVersion);?>”>
<input type=”hidden” name=”tranData” value=”<?php echo($trandata);?>” >
<input type=”hidden” name=”merSignMsg” value=”<?php echo($ssrc);?>” >
<input type=”hidden” name=”merCert” value=”<?php echo($cert);?>” >
<input type=”submit” value=”sumbit”>
</form>
</body>
</html>
4.ReceiveFromBank.php,代码:
<?php
$bb = new COM(“ICBCEBANKUTIL.B2CUtil”);
//进行初始化,第一个参数是ICBC的公钥,第二个参数是你自己的公钥,第三个参数是你的私钥,第四个参数是密码
$bb->init(“D:\icbc\admin.crt”,”D:\icbc\my.crt”,”D:\icbc\my.key”,”88888″);
if(count($_POST)>0){
//base64解码
$trandata = base64_decode($_POST['notifyData']);
$signMsg = $_POST["signMsg"];
$rc=$bb->verifySignC($trandata,strlen($trandata),$signMsg,strlen($signMsg));
if($rc==0){
echo ‘支付成功了!’;
//为了安全,这里还应该对返回的支付金额和本地数据进行比对,这里使用php的xml对象进行解析
$xmlparser = xml_parser_create();
//把返回的xml字串存入$myxml数组中
xml_parse_into_struct($xmlparser,$trandata,$myxml);
$amount = $myxml[6]["value"];//订单金额,可以通过打印数组查看其他的参数下标
//以下是数据比对,不赘述…
}else{
echo(“支付失败,错误代码:{$rc}”);
}
}
?>
5.整理此文档,也是对自己这段时间在ICBC挣扎的一个总结,开始以为做支付接口开发,和提供商沟通好,看清文档就行。包括以前开发过的环讯支付和正在进行的支付宝,不得不说,IPS和Alipay的大家风范,文档和DOMO都准备得很完善。只有这个ICBC,包括他们自己技术工程师都说,他们这样提供face to face 的技术支持是别的行没有的,包括ICBC的其他行,也是丢一个文档给你自己做,demo?那是某的。所以我想,这还是有一些必要的,何况现在网上可以search得到的,很多是1.0.0.0的不可以跳转回商户网站的版本。
6.最后还是要感谢ICBC的一系列技术工程师,特别是YL。很多时候在早晨不到9点在我挤公车上班的时候,在中午1点午餐刚结束要休息的时候,在下午6点过了下班时间准备闪人的时候,还有周末在家的时候。都能接到ICBC询问开发进度的电话,我不得不对对银行工作有了更新更敬佩的认识。