php 建行支付 BTB BTC php_java_bridge

注意点:
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
要用到的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

如图:
在这里插入图片描述

End:如有丢失步骤请留言

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
分支预测是计算机中的一种技术,用于提高程序的执行效率。其中,BTB(Branch Target Buffer)和BHT(Branch History Table)是两种常见的分支预测方法。 BTB是一种缓冲区,用于存储分支指令的预测目标地址。在程序中,分支指令会根据特定的条件来选择跳转到不同的代码块。BTB通过记录过去的分支指令及其目标地址,以便在将来遇到相同的分支指令时可以快速预测其目标地址。这样,在预测正确的情况下,可以避免浪费时间等待分支判断的结果,并提前开始执行预测目标地址处的指令流。但是,当预测错误时,需要回退到正确的指令位置,这样会带来额外的开销。 BHT是一种记录分支历史的表格。它用来跟踪分支指令的历史模式,以便在将来遇到相同的分支时预测其行为。BHT可以记录分支指令的条件判断结果,比如“是否进入循环”,然后基于历史记录来预测下一次分支指令的结果。如果历史模式具有一定的规律性,那么BHT能够准确地预测分支的行为,提高程序的性能。但是,当历史模式改变时,预测就会出错,需要进行修正。 综上所述,BTB和BHT是分支预测的两种常见方法。BTB通过存储过去的分支目标地址来预测分支指令的执行位置,而BHT通过记录历史模式来预测分支指令的行为。这些预测技术能够显著提高程序的执行效率,但也有一定的错误率,并且需要额外的硬件支持来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值