注意点:
1.在建行的平台上配置异步和同步回调地址
2.建行提供的BTB和BTC的验签包名字一样内容不一样 必须各用各的
3.验签的值和参数排列顺序必须按照下边写的顺序
4.建行异步回调的值都是post传值
5.php的验签示例中使用的是COM引用dll文件 (PHP 可以在 Win32 平台中访问 COM 和 DCOM 对象) 因为服务器是linux的 所以此项目中php使用了java的验签包。
一、BTC
调起支付
/* 设置连接需要的参数 */
$datac['MERCHANTID'] = '';//商户代码 建行提供
$datac['POSID'] = '';//商户柜台代码 建行提供
$datac['BRANCHID'] = '';//分行代码 建行提供
$datac['ORDERID'] = $order_sn;//订单号
$datac['PAYMENT'] = sprintf('%0.2f',$amount);//付款金额 单位元
$datac['CURCODE'] = '01'; //人民币支付代码01
$datac['TXCODE'] = 520100;//建行统一分配为520100
$datac['REMARK1'] = $remark;
$datac['REMARK2'] = 'marginpayment';
$datac['TYPE'] = 1;//接口类型 1 防钓鱼接口
$datac['PUB'] = mb_substr($pubkey,-30);//公钥后30位
$datac['GATEWAY'] = 'UnionPay';//网关类型 银联支付 文档写的仅供手机 实测PC也能成功
$datac['CLIENTIP'] = $ip;//IP地址
$datac['REGINFO'] = '';
$datac['PROINFO'] = '';
$datac['REFERER'] = '';
$mac = '';
foreach ($datac as $k=>$l){
$mac .= $k.'='.$l.'&';
}
$macr = rtrim($mac,'&');
$data['macr'] = $macr;
$datac['MAC'] = md5($macr);
/**生成链接地址**/
$mac = '';
unset($datac['PUB']);
foreach ($datac as $k=>$l){
$mac .= $k.'='.$l.'&';
}
$mac = rtrim($mac,'&');
$data['url'] = 'https://ibsbjstar.ccb.com.cn/CCBIS/ccbMain?'.$mac;
//$data['url'] 就是建行支付的地址 跳转到这个地址就可以BTC支付
异步回调
/*
* 建行异步通知 - BTC
* @return string
* $REMARK1 1保证金 2充值
*/
public function NotifyCustomer(Request $request)
{
\Log::info('建行异步通知_BTC 获取参数:'.json_encode($request->all()));
$datar = $request->all();
if(empty($datar['POSID'])){
\Log::info('建行异步通知 - BTC - 空POSID');
echo 'fail';
exit;
}
$data = array();
$strSrc = $this->getstrnotiyC($datar,$data);
$sign = $datar['SIGN'];
$pubKey='完整公钥';;
require("SignJava.php");
$signjava = new \SignJava();
$r = $signjava->main($sign,$strSrc,$pubKey);
if($r=='succ' && $data['SUCCESS']=='Y'){
//支付成功处理业务逻辑
echo 'success';
exit();
}else{
//支付失败
echo 'fail';
exit();
}
}
private function getstrnotiyC($datar,&$data){
$strSrc = '';
if(empty($datar)){
\Log::info('BTB-datar-null');
return $strSrc;
}
\Log::info('datar-'.json_encode($datar));
$data['POSID'] = $datar['POSID'];
$data['BRANCHID'] = $datar['BRANCHID'];
$data['ORDERID'] = $datar['ORDERID'];
$data['PAYMENT'] = $datar['PAYMENT'];
$data['CURCODE'] = $datar['CURCODE'];
$data['REMARK1'] = $datar['REMARK1'];
$data['REMARK2'] = $datar['REMARK2'];
if(!empty($datar['ACC_TYPE'])){
$data['ACC_TYPE'] = $datar['ACC_TYPE'];
}
$data['SUCCESS'] = $datar['SUCCESS'];
$data['TYPE'] = $datar['TYPE'];
$data['REFERER'] = $datar['REFERER'];
$data['CLIENTIP'] = $datar['CLIENTIP'];
if(!empty($datar['ACCDATE'])){
$data['ACCDATE'] = $datar['ACCDATE'];
}
if(!empty($datar['USRMSG'])){
$data['USRMSG'] = $datar['USRMSG'];
}
if(!empty($datar['INSTALLNUM'])){
$data['INSTALLNUM'] = $datar['INSTALLNUM'];
}
if(!empty($datar['ERRMSG'])){
$data['ERRMSG'] = $datar['ERRMSG'];
}
if(!empty($datar['USRINFO'])){
$data['USRINFO'] = $datar['USRINFO'];
}
if(!empty($datar['DISCOUNT'])){
$data['DISCOUNT'] = $datar['DISCOUNT'];
}
foreach ($data as $k=>$l){
$strSrc .= $k.'='.$l.'&';
}
$strSrc = rtrim($strSrc,'&');
\Log::info('BTC-strSrc-'.$strSrc);
return $strSrc;
}
二、BTB
调起支付
/* 设置连接需要的参数 */
$datac['MERCHANTID'] = '';//商户代码 建行提供
$datac['POSID'] = '';//商户柜台代码 建行提供
$datac['BRANCHID'] = '';//分行代码 建行提供
$datac['ORDERID'] = $order_sn;//订单号
$datac['PAYMENT'] = sprintf('%0.2f',$amount);//付款金额 单位元
$datac['CURCODE'] = '01'; //人民币支付代码01
$datac['TXCODE'] = 520100;//建行统一分配为520100
$datac['REMARK1'] = $remark;
$datac['REMARK2'] = 'marginpayment';
$mac = '';
foreach ($datac as $k=>$l){
$mac .= $k.'='.$l.'&';
}
$macr = rtrim($mac,'&');
$data['macr'] = $macr;
$datac['MAC'] = md5($macr);
/**生成链接地址**/
$mac = '';
unset($datac['PUB']);
foreach ($datac as $k=>$l){
$mac .= $k.'='.$l.'&';
}
$mac = rtrim($mac,'&');
$data['url'] = 'https://b2bpay.ccb.com/NCCB/NECV5B2BPayMainPlat?'.$mac;
//$data['url'] 就是建行支付的地址 跳转到这个地址就可以BTC支付
异步回调
/**
* 建行异步通知 - BTB
* @param Request $request
* @return string
*/
public function NotifyBusiness(Request $request)
{
\Log::info('建行异步通知_BTB 获取参数:'.json_encode($request->all()));
$datar = $request->all();
if(empty($datar['MPOSID'])){
\Log::info('建行异步通知 - BTB - 空MPOSID');
exit;
}
$data = array();
$strSrc = $this->getstrnotiyB($datar,$data);//调用生成BTB验签字符串
$sign = $datar['SIGNSTRING'];
$pubKey='完整公钥';
require("SignJavaBTB.php");
$signjava = new \SignJavaBTB();
$r = $signjava->main($sign,$strSrc,$pubKey);
\Log::info('-SignJavaresult:'.$r."/n");
if($r=='succ'){
//支付成功
if($data['STATUS']==2){
//调用业务逻辑
echo 'success';
exit();
}
}else{
//支付失败
echo 'fail';
exit();
}
}
/**
* BTB验签字符串
* @param $datar
* @param $data
* @return string
*/
private function getstrnotiyB($datar,&$data){
$strSrc = '';
if(empty($datar)){
\Log::info('BTB-datar-null');
return $strSrc;
}
$data['MPOSID'] = $datar['MPOSID'];
$data['ORDER_NUMBER'] = $datar['ORDER_NUMBER'];
$data['CUST_ID'] = $datar['CUST_ID'];
$data['ACC_NO'] = $datar['ACC_NO'];
$data['ACC_NAME'] = mb_convert_encoding($datar['ACC_NAME'], "UTF-8", "GBK");
$data['AMOUNT'] = $datar['AMOUNT'];
$data['STATUS'] = $datar['STATUS'];
$data['REMARK1'] = $datar['REMARK1'];
$data['REMARK2'] = $datar['REMARK2'];
$data['TRAN_FLAG'] = $datar['TRAN_FLAG'];
$data['TRAN_TIME'] = $datar['TRAN_TIME'];
$data['BRANCH_NAME'] = mb_convert_encoding($datar['BRANCH_NAME'], "UTF-8", "GBK");
foreach ($data as $k=>$l){
$strSrc .= $l;
}
\Log::info('BTB-strSrc-'.$strSrc);
return $strSrc;
}
三、关于引用的SignJava.php 和 SignJavaBTB.php 从头说起
php验签调用java的jar包
php使用了php_java_bridge来调用的jar包
本项目中使用的是php-java-bridge_7.2.1版本(下载时候的最新版)
https://sourceforge.net/projects/php-java-bridge/files/src/php-java-bridge_7.2.1/
1.安装JDK,开启Tomcat服务器
2.下载php-java-bridge的JavaBridge.war放到webapps下面,Tomcat执行解析,得到JavaBridge.jar。
或者直接下载二进制的 JavaBridge.jar包、java/Java.inc库文件,下载地址:http://php-java-bridge.sourceforge.net/pjb/download.php
3.项目要调用的jar包放到\jdk\lib\ext下 如图:
要用到的jar包需要java给打包一下 php传参,java返回true或false 。
java主要逻辑往下看 (四、关于java打包的checkSign.jar )
4.JavaBridge.jar 放到php/ext下
(
Windows双击 启动
linux位置: /www/server/php/73/include/php/ext
linux启动命令:
java -jar JavaBridge.jar SERVLET_LOCAL:8081
java -jar JavaBridge.jar SERVLET:8081 3 JavaBridge.log &
)
5.java/Java.inc放到项目里,方便调用的位置 如图:
SignJavaBTB 和 SignJava调用如下
define("JAVA_DEBUG", true); //调试设置
define("JAVA_HOSTS", "127.0.0.1:8081"); //设置
require_once("java/Java.inc");
Class SignJavaBTB{
/**
使用checkSign.jar举例
调用java封装好的方法 verfySign
$sign 建行返回的签名
$strSrc 拼接的验签字符串
$pubKey 完整公钥
**/
function main($sign,$strSrc,$pubKey){
//调用checkSign.jar下check文件夹下RSAtUtils.class
// 重点 注意所有jar的路径不可以重复
$RSAPrivKeyCrt = new Java("check.RSAtUtils");
$yy = $RSAPrivKeyCrt->verfySign($sign,$strSrc,$pubKey);
$yc = json_decode($yy);
if($yc==1){
return 'succ';
}else{
return 'fail';
}
}
}
四、关于java打包的checkSign.jar
如图: