php版本交通银行网银支付接口开发示例

概述:网银支付接口 和支付宝接口大体上差不多,主要的区别是 交通银行提供的 接口核心的比如,加密等是通过java实现的。所以,要想办法使php和java能正常的通信,为此。官方也提供了两套实现方法,一个是通过 socket 进行通信,另一个方法是通过 java 桥接。下面演示的是 socket方法:

1. 配置运行环境
1.1  安装java,自行到oracle官网下载 java,然后安装,并配置正确的 环境变量。
1.2  把 测试的证书导入到java 虚拟机;
 keytool " -import -keystore "java虚拟机放置证书的地址" -storepass changeit -alias test_bocommca -file "证书路径" 完成导入。
 例子:keytool" -import -keystore "C:\Program Files\Java\jre1.5\lib\security\cacerts" -storepass changeit -alias test_bocommca -file "C:\socket\cert\test_root.cer"

 1.3  修改配置文件(in/B2CMerchantSocket.xml):
  采用官方提供的测试 商号进行测试时,无需配置,否则要配置。具体看xml文件说明。

1.4  启动 socket 服务
        window:启动  start.bat 及可;
        linux: 启动  ohup  sh.start,sh&     //使当前脚本脱离终端,并在后台运行。

2. 将网银集成到现有的系统:(以mvc的结构进行说明):

2.1  将不变的参数 配置 写入配置文件:

 代码如下 复制代码

 $config['interfaceVersion']  = "1.0.0.0";   #接口版本
  $config['tranType']    =0; #交易类别  0:B:C
  $config['curType']        = 'CNY';           # 交易币种
  $config['notifyType']   =1;         #0=不通知 1=通知 2=抓取
  $config['merURL']   = "http://www.111cn.net /pay/notify";   # 主动通知url
  $config['goodsURL'        = 'http://www.111cn.net /goods/1.html';           #取货url
  $config['jumpSeconds']   =3;        #跳转时间
  $config['payBatchNo']   = '';     #商户批次号
  $config['proxyMerName']   = '';                 #代理商家名字
  $config['proxyMerType']   = '';                 #代理商类型
  $config['proxyMerCredentials']= '';                #代理商家批次号
  $config['netType']     = 0;                 #渠道编号

  //以下是 新接口需要的参数
  $config['socketUrl']         ="tcp://127.0.0.1:8891";  #socket url
  $config['merID']     ='301310063009501';    #商户id 3013100630095012
2.2 Model

/**
 * 交通银行支付类
 */
class Bocom extends CI_Model {
 private $arrReturn=array();
 private $socket;
 public function __construct() {
  parent::__construct ();
  //加载交通银行配置文件
  $this->config->load('bocom');
  $this->socket=$this->config->item('socketUrl');
 }
 /**
  * 支付方法
  *
  * @param unknown $arr_data=array(
  *  'bill_no'=>
  * )
  */
 public  function pay($arr_data){
  //获得表单传过来的数据
  $this->arrReturn['interfaceVersion'] = $this->config->item('interfaceVersion');
  $this->arrReturn['merID']       = $this->config->item('merID'); //商户号为固定
  $this->arrReturn['orderid']  = $arr_data['bill_no'];
  $this->arrReturn['orderDate']  = $arr_data['bill_date'];
  $this->arrReturn['orderTime']  = $arr_data['bill_time'];
  $this->arrReturn['tranType']  = $this->config->item('tranType');
  $this->arrReturn['amount']    = $arr_data['bill_fee'];
  $this->arrReturn['curType']  = $this->config->item('curType');
  $this->arrReturn['orderContent']  = isset($arr_data['bill_title'])?iconv('utf-8','gb2312',$arr_data["bill_title"]): '';   #订单内容
  $this->arrReturn['orderMono']     = isset($arr_data['bill_mono'])? iconv('utf-8','gb2312',$arr_data['bill_mono']):'';     #商家备注
  $this->arrReturn['phdFlag']       = isset($arr_data['phpFlag'])?$arr_data['phpFlag']:'';
  $this->arrReturn['notifyType']    = $this->config->item('notifyType');
  $this->arrReturn['merURL']        = $this->config->item('merURL');
  $this->arrReturn['goodsURL']      = $this->config->item('goodsURL');
  $this->arrReturn['jumpSeconds']   = $this->config->item('jumpSeconds');
  $this->arrReturn['payBatchNo']    = $this->config->item('payBatchNo');
  $this->arrReturn['proxyMerName']  = $this->config->item('proxyMerName');
  $this->arrReturn['proxyMerType']  = $this->config->item('proxyMerType');
  $this->arrReturn['proxyMerCredentials']= $this->config->item('proxyMerCredentials');
  $this->arrReturn['netType']        = $this->config->item('netType');
  //以下参数 不参与签名
  $this->arrReturn['issBankNo']      =isset($arr_data['code_id'])? trim($arr_data['code_id']):'';
  $tranCode = "cb2200_sign";
  $source='';
  $len = count($this->arrReturn)-1;$j=1;
  foreach($this->arrReturn as $v){
   if($j<=$len){
    $source.=$v."|";
   }
   $j++;
  }
  $source= substr($source, 0,strlen($source)-1);
     $fp= stream_socket_client($this->socket,$errno, $errstr, 30);   
     $retMsg="";
     if (!$fp) {
      log_message("info","socket连接失败");
      return false;
     } else
     {
     $in  = "<?xml version='1.0' encoding='gbk2312'?>";
  $in .= "<Message>";
  $in .= "<TranCode>".$tranCode."</TranCode>";
  $in .= "<MsgContent>".$source."</MsgContent>";
  $in .= "</Message>";
  fwrite($fp, $in);
       while (!feof($fp)) {
        $retMsg =$retMsg.fgets($fp, 1024);
       }
       fclose($fp);
     }
    if(false!==$xml_arr=$this->xmlParse($retMsg)){
       if(is_array($xml_arr)){
        foreach($xml_arr as $k=>$v){
         $this->arrReturn[$k]=$v;
        }
       }else{
        return false;
       }
    }else{
      return false;
    }
    return $this->arrReturn;
 }
 
 /**
  * 解析XML
  */
 public function xmlParse($retMsg){
  $arr=array();
  //解析返回xml
  $dom = new DOMDocument;
  $dom->loadXML($retMsg);
  $retCode = $dom->getElementsByTagName('retCode');
  $retCode_value = $retCode->item(0)->nodeValue;
  $errMsg = $dom->getElementsByTagName('errMsg');
  $errMsg_value = $errMsg->item(0)->nodeValue;
  $signMsg = $dom->getElementsByTagName('signMsg');
  $signMsg_value = $signMsg->item(0)->nodeValue;
  $orderUrl = $dom->getElementsByTagName('orderUrl');
  $orderUrl_value = $orderUrl->item(0)->nodeValue;
  $MerchID = $dom->getElementsByTagName('MerchID');
  $merID = $MerchID->item(0)->nodeValue;
  if($retCode_value != "0"){
   log_message("info","交易返回码:".$retCode_value);
   log_message("info","交易错误信息:".$errMsg_value);
            return false;
        }
   $arr['merSignMsg'] = $signMsg_value;
   $arr['merID']      = $merID;
    $arr['orderUrl']   = $orderUrl_value;     
   return $arr;
 }
 /**
  * 交通银行 支付通知
  * @return boolean|unknown
  */
 public function notify(){
  $tranCode = "cb2200_verify";
  if(!isset($_REQUEST['notifyMsg'])){
   log_message("error","网银支付通知·非法请求");
   return false;
  }
     $notifyMsg = $_REQUEST["notifyMsg"];
  log_message("error",$notifyMsg."回调....");
  
  $lastIndex = strripos($notifyMsg,"|");
  $signMsg = substr($notifyMsg,$lastIndex+1); //签名信息
  $srcMsg = substr($notifyMsg,0,$lastIndex+1);//原文
  $merID = $this->config->item('merID');
  $fp = stream_socket_client($this->socket, $errno, $errstr, 30);
  $retMsg="";
  //
  if (!$fp) {
   echo "$errstr ($errno)<br />\n";
   log_message("error","$errstr ($errno)<br />\n");
  } else{  
   $in  = "<?xml version='1.0' encoding='gb2312'?>";
   $in .= "<Message>";
   $in .= "<TranCode>".$tranCode."</TranCode>";
   $in .= "<merchantID>".$merID."</merchantID>";
   $in .= "<MsgContent>".$notifyMsg."</MsgContent>";
   $in .= "</Message>";
  fwrite($fp, $in);
    while (!feof($fp)) {
     $retMsg =$retMsg.fgets($fp, 1024); 
    }
    fclose($fp);
  }
  //解析返回xml
  $dom = new DOMDocument;
  $dom->loadXML($retMsg); 
  $retCode = $dom->getElementsByTagName('retCode');
  $retCode_value = $retCode->item(0)->nodeValue;
  $errMsg = $dom->getElementsByTagName('errMsg');
  $errMsg_value = $errMsg->item(0)->nodeValue;
  if($retCode_value != '0')
  {
   log_message("error","交易错误信息:" .$errMsg_value."<br>");
   return false;
  }else{
   $arr = preg_split("/\|{1,}/",$srcMsg);
   if($arr[9]=="1"){
    return $this->updateBill($arr[1]);
   }
   log_message("error","交易失败:".$arr[13]."<br/>");
   return false;
  } 
 }
 private function updateBill($billNo){
  // 更新 订单状态
 }
 //end class
}
2.3 控制器
$this->load->model("Bocom");
 支付方法:
 $this->arrData =$this->Bocom->pay($this->data);
 通知:
   $this->arrData =$this->Bocom->notify();

时间: 2024-09-02 13:41:57

php版本交通银行网银支付接口开发示例的相关文章

php版交通银行网银支付接口开发入门教程_php技巧

本文实例讲述了php版交通银行网银支付接口实现方法.分享给大家供大家参考,具体如下: 概述:网银支付接口 和支付宝接口大体上差不多,主要的区别是 交通银行提供的 接口核心的比如,加密等是通过java实现的,所以,要想办法使php和java能正常的通信,为此,官方也提供了两套实现方法,一个是通过 socket 进行通信,另一个方法是通过 java 桥接,下面演示的是 socket方法. 1. 配置运行环境 1.1  安装java,自行到oracle官网下载 java,然后安装,并配置正确的 环境变

php微信支付接口开发程序_php技巧

php微信支付接口开发程序讲解: 必要条件: appid //公众号后台开发者中心获得(和邮件内的一样)   mchid//邮件内获得  key//商户后台自己设置  appsecret //公众号开发者中心获得 两个证书文件,邮件内获得 apiclient_cert.pem   apiclient_key.pem注意事项:公众号后台微信支付->开发配置->新增测试目录和测试个人微信号. 开发者中心->网页授权获取用户基本信息->修改成你的测试域名.否则会出现redirect_ur

php版银联支付接口开发简明教程_php技巧

本文实例讲述了php版银联支付接口开发的方法.分享给大家供大家参考,具体如下: 支付接口现在有第三方的支付接口也有银行的支付接口.这里就来介绍php版本银联支付接口开发的方法. 银联支付,首先要注意二重要的部分: PHP运行环境是5.4.18以上 开了扩展openssl 开发手册上面的列子只做参考,因为基本都是错的.你可以试着去官网下一个demo...注意现在银联开发,没有测试密钥提供,只能在正式环境开发 下面是我用ThinkPHP编写的一个支付类 /** * 银联支付 v0.1 * @auth

asp.net 网银支付接口异步返回值

问题描述 asp.net 网银支付接口异步返回值 自己做网银支付,完全按照他们提供的demo来做,发现提交.支付都没有问题.就是在异步接收返回值的时候,通过日志发现 querystring里面的参数是空.跟网银那边要来了日志,自己用他们提交过来的数据模拟提交, 都是能接收到数据的.不知道怎么回事? 是不是如下原因: 1.在网银申请的时候填的域名与异步返回的url必须一致吗? 2.还是其他未发现的原因? 解决方案 这个问题看网银支付的API,应该有详细解释

网银支付接口

问题描述 求大神网银支付接口,怎么申请,测试用的,网站商场用,一直找不到网银支付接口. 解决方案 解决方案二:快钱啊,或者易宝这些第三方支付平台申请就可以了解决方案三:引用楼主qq_35446592的回复: 求大神网银支付接口,怎么申请,测试用的,网站商场用,一直找不到网银支付接口. 我在的公司就在做支付==你要是想申请可以找我

C#微信公众号与订阅号接口开发示例代码_C#教程

本文实例讲述了C#微信公众号与订阅号接口开发示例代码.分享给大家供大家参考,具体如下: using System; using System.Web; using System.IO; using System.Text; using System.Web.Security; using weixin_api; public class wxgz_api : IHttpHandler { public void ProcessRequest(HttpContext context) { cont

ThinkPHP微信支付接口开发完整例子

最近有个微商城做了微信支付的接口,现在整理一下发上来.   首先是需要有已开通微信支付接口的公众号,这个相信大家都知道,开通之后微信会发一封邮件到你的邮箱,邮件的内容就是开发需要用到的一些接口信息了(包含账号密码之类的东西).   开发步骤   一.进入公众号平台,先设置几个参数,包括绑定域名.设置回调地址等等.   1.在设置 -> 公众号设置 -> 功能设置 -> 设置JS接口安全域名     2.在微信支付 -> 开发配置 -> 配置你的js支付接口,回调地址等等,正式

php版本银联支付接口开发实例

银联支付,首先要注意二重要的部分: PHP运行环境是5.4.18以上 开了扩展openss 开发手册上面的列子只做参考,因为基本都是错的.你可以试着去官网下一个demo...注意现在银联开发,没有测试密钥提供,只能在正式环境开发[20151219] 下面是我用ThinkPHP编写的一个支付类 /** * 银联支付 v0.1 * @auther:Summer<dengwz7788@gmail.com>; * @date:20151202 * **/   class NetPayAction ex

php微信支付接口开发程序(流程已通)

必要条件: appid //公众号后台开发者中心获得(和邮件内的一样)   mchid//邮件内获得  key//商户后台自己设置  appsecret //公众号开发者中心获得 两个证书文件,邮件内获得 apiclient_cert.pem   apiclient_key.pem 注意事项: 公众号后台微信支付->开发配置->新增测试目录和测试个人微信号. 开发者中心->网页授权获取用户基本信息->修改成你的测试域名.否则会出现redirect_uri 参数错误 --------