Warning: date(): Invalid date.timezone value 'HKT', we selected the timezone 'UTC' for now. in /home/mrgcom/public_html/catalog/controller/common/footer.php on line 48 招商银行网银接口对接

The One 专一

招商银行网银接口对接

招商银行给我分印象非常好,相比于国内的银行,招行从客服服务到用户体验都是国内高水平的.

其中不得不说招行在网络上下的功夫,信用卡和网银上的技术也是很到位.

刚好有一次和招行合作的机会,记录下一些技术问题,并给出相应的解决方案.这里的合作方式有web端,手机端,电话端.

我这里会记录web端,还有手机端的基本使用.

网站的布局是响应式,所以手机端支付仅通过修改商户号来实现,如果银行接受参数一直的话.

1 招行网银的收费,一般来讲是根据你网站平台的消耗能力,招行的收费 0.6%-1.0%,对于支付宝的0.7%-1.2%,有点差别.

2 招行的微信推广和网站推广可以协助你的网站做一些宣传.其中微信推广效果还是不错的.

3 签约合同一般就是一些营业执照等资料,还有网站的备案信息,如果是平台的话,还需要提供通信管理局的网上营业执照,类似这样实体店的营业执照.

OK,接口对接很简单一些基本参数传递到银行服务器就行了.带上返回地址.

这里防用户篡改信息,可以加上招行提供的私钥对传送的数据进行加密.具体过程如下:

web结账页面->顾客支付->支付命令(加密密钥)传送给银行服务器->银行通过AJAX通知商户->商户返回结果页面到银行->银行返回结果页给顾客

银行返回结果到商户,这里的签名使用的是 SHA1withRSA 加密,商户可以通过公钥对签名进行认证再处理.招行给的是PHP+JAVA的验证签名.需要给PHP安装扩展JavaBridge.还有JDK.不过网上有PHP验证的解决方案,可以使用.

另外招行返回结果页给顾客是被动页面,新资料可以增加一个url,实现自动跳转.

写了半天好像都是废话.

传递参数给招行比较简单,主要难的地方在验证招行通知过来的签名.因为招行给的资料内PHP验证的资料时使用PHP + AJAX 

主要PHP不容易验证的问题出在openssl_verify($data,$sign,$key),这个函数本身是一个非常古老的函数,PHP内的资料介绍非常有限,而这里的$sign必须是要二进制字符串,我可是研究了3天外文才搞明白,不过最后不是我最近搞清楚,而是招行的技术人员帮助我,给我正确的 $data,$sign,$key 还有二进制字符串$sign.而我刚开始的代码根本就是从头错到尾,基本参数$data,$key是错的.不管怎样,能解决问题就是好结果,非常开心.

验证招行数字签名PHP代码的实例:

<?php


$signature = '31|173|176|121|152|120|230|215|207|112|222|208|9|87|209|104|204|113|89|239|108|89|62|5|9|84|92|255|237|158|203|231|169|60|217|72|250|73|215|197|159|186|152|27|136|240|115|58|155|115|133|70|92|1|49|57|97|171|31|239|151|188|206|200|';

$data = 'Succeed=Y&CoNo=000054&BillNo=9999000156&Amount=12.01&Date=20150708172939&MerchantPara=para1&BillExInfo=41625803******20890000000000000000000000000000000000000000000000&Msg=075500005420150708507080000014';


$publickey = '-----BEGIN PUBLIC KEY-----

MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALuUIwMGhvbpCwYzKCMzvSMQiLAAj5y7

4cN09N1TXVONPWhvLWkuzEPSd1ogPJLWiVyEG7gEIBT3zTlCV+NMou0CAwEAAQ==

-----END PUBLIC KEY-----';


$pem = openssl_pkey_get_public(file_get_contents('cmb.pem'));


function sig_bytes($str){

//分成数组

$ss = explode('|',$str);

$r = '';

foreach($ss as $one){

if($one != ''){

// 把函数装进二进制字符串

$r = $r . pack('C',$one);

}

}

return $r;

}


$sign = sig_bytes($signature);


echo '签名修改成二进制字符串结果:' . $sign . '<br/>';


$ok = openssl_verify($data, $sign, $pem);


$ok1 = openssl_verify($data, $sign, $pem ,"sha1WithRSAEncryption");


$ok2 = openssl_verify($data, $signature, $pem);


$ok3 = openssl_verify($data, $signature, $pem ,"sha1WithRSAEncryption");


$ok4 = openssl_verify($data, $signature, $publickey);


$ok5 = openssl_verify($data, $signature, $publickey ,"sha1WithRSAEncryption");


echo "1表示成功验证,0表示失败:<br/>" . $ok . $ok1 . $ok2 . $ok3 . $ok . $ok;

?>



Powered By 爱你若晴天
身体健康 © 2017 粤ICP备14081548号-1

Article

Shopping

Search

Me