PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子


Posted in PHP onMay 10, 2014

最近,一个项目要求做交通银行在线支付,ecshop本身没有这方面的接口,于是通过一些时间的专研,做了一个插件出来。有好的东西,当然要分享,在此特地分享出来,希望能够帮助到跟我一样有需要的人,为大家减轻一下开发的负担,也多请大家指出一些好的方法和建议,相互的学习、进步!

在使用插件之前,请配置好交通银行在线支付的环境(具体安装方法,交行提供的demo会有,也不是很难,注意好细节就行)。安装好之后,请将把下面的插件源码和语言包源码按路径保存到相应文件,最后进入后台的支付模块安装即可。

插件源码(includes/modules/payment/bankcomm.php):

<?php
/**
 * 交通银行在线支付插件 For Ecshop
 * Author: Reson
 * Date: 2014/03/31
 */
if (!defined('IN_ECS'))
{
 die('Hacking attempt');
}
$payment_lang = ROOT_PATH . 'languages/' .$GLOBALS['_CFG']['lang']. '/payment/bankcomm.php';
if (file_exists($payment_lang))
{
 global $_LANG;
 include_once($payment_lang);
}
/* 模块的基本信息 */
if (isset($set_modules) && $set_modules == TRUE)
{
 $i = isset($modules) ? count($modules) : 0;
 /* 代码 */
 $modules[$i]['code']    = basename(__FILE__, '.php');
 /* 描述对应的语言项 */
 $modules[$i]['desc']    = 'bankcomm_desc';
 /* 是否支持货到付款 */
 $modules[$i]['is_cod']  = '0';
 /* 是否支持在线支付 */
 $modules[$i]['is_online']  = '1';
 /* 支付费用,由配送决定 */
 $modules[$i]['pay_fee'] = '0';
 /* 作者 */
 $modules[$i]['author']  = 'Reson';
 /* 网址 */
 $modules[$i]['website'] = 'https://3water.com';
 /* 版本号 */
 $modules[$i]['version'] = '1.0.0.0';
 /* 配置信息 */
 $modules[$i]['config']  = array();
 return;
}
/**
 * 类
 */
class bankcomm
{
 /**
  * 构造函数
  *
  * @return void
  */
 function bankcomm()
 {
 }
 function __construct()
 {
  $this->bankcomm();
 }
 /**
  * 提交函数
  */
 function get_code($order)
 {
  //获得表单传过来的数据
  $param['interfaceVersion'] = '1.0.0.0'; //消息版本号*
  $param['merID'] = '301310063009501'; //商户号 (测试号,后期可自行更改)
  $param['orderid'] = $order['orderid']; //订单号*
  $param['orderDate'] = local_date("Ymd",gmtime()); //商户订单日期* yyyyMMdd
  $param['orderTime'] = local_date("His",gmtime()); //商户订单时间* HHmmss
  $param['tranType'] = 0; //交易类别* 0:B2C
  $param['amount'] = $order['amount']; //订单金额*
  $param['curType'] = 'CNY'; //交易币种* 默认CNY
  $param['orderContent'] = '';
  $param['orderMono'] = $order['orderMono']; //商家备注
  $param['phdFlag'] = ''; //物流配送标志
  $param['notifyType'] = 1; //通知方式* 1 通知
  $param['merURL'] = ''; 
  $param['goodsURL'] = $order['goodsURL']; //取货URL
  $param['jumpSeconds'] = '';
  $param['payBatchNo'] = '';
  $param['proxyMerName'] = '';
  $param['proxyMerType'] = '';
  $param['proxyMerCredentials'] = '';
  $param['netType'] = 0; //渠道编号* 0:html渠道
  $param['issBankNo'] = '';
  $tranCode = "cb2200_sign";
  htmlentities($param['orderMono'],"ENT_QUOTES","utf-8");
  //连接字符串
  $source = '';
  foreach($param as $key=>$val){
   if($key != 'issBankNo')
   $source .= $val.'|';
  }
  $source = substr($source,0,strlen($source)-1); 
  //连接地址
  $socketUrl = "tcp://127.0.0.1:8080"; //这里的端口根据自己配置的情况
  $fp = stream_socket_client($socketUrl, $errno, $errstr, 30);
  $retMsg="";
  //
  if (!$fp) {
   echo "$errstr ($errno)<br />\n";
  } else 
  {
   $in  = "<?xml version='1.0' encoding='UTF-8'?>";
   $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);
  } 
  //解析返回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;
  //echo "retMsg=".$retMsg;
  //echo $retCode_value." ".$errMsg_value." ".$signMsg_value." ".$orderUrl_value;
  if($retCode_value != "0"){
   //echo "交易返回码:".$retCode_value."<br>";
   //echo "交易错误信息:" .$errMsg_value."<br>";
   return "交易错误信息:" .$errMsg_value."<br>";
  }else{
   $param['signMsg_value'] = $signMsg_value;
   $param['orderUrl_value'] = $orderUrl_value;
   $form_code = $this->create_html($param); //创建提交表单
   return $form_code;
  }
 }
 /**
  * 创建提交表单
  */
 function create_html($param){
  $pay_html ='<form name = "form1" method = "post" action = "'.$param['orderUrl_value'].'">
  <input type = "hidden" name = "interfaceVersion" value = "'.$param['interfaceVersion'].'">
  <input type = "hidden" name = "merID" value = "'.$param['merID'].'">
  <input type = "hidden" name = "orderid" value = "'.$param['orderid'].'">
  <input type = "hidden" name = "orderDate" value = "'.$param['orderDate'].'">
  <input type = "hidden" name = "orderTime" value = "'.$param['orderTime'].'">
  <input type = "hidden" name = "tranType" value = "'.$param['tranType'].'">
  <input type = "hidden" name = "amount" value = "'.$param['amount'].'">
  <input type = "hidden" name = "curType" value = "'.$param['curType'].'">
  <input type = "hidden" name = "orderContent" value = "'.$param['orderContent'].'">
  <input type = "hidden" name = "orderMono" value = "'.$param['orderMono'].'">
  <input type = "hidden" name = "phdFlag" value = "'.$param['phdFlag'].'">
  <input type = "hidden" name = "notifyType" value = "'.$param['notifyType'].'">
  <input type = "hidden" name = "merURL" value = "'.$param['merURL'].'">
  <input type = "hidden" name = "goodsURL" value = "'.$param['goodsURL'].'">
  <input type = "hidden" name = "jumpSeconds" value = "'.$param['jumpSeconds'].'">
  <input type = "hidden" name = "payBatchNo" value = "'.$param['payBatchNo'].'">
  <input type = "hidden" name = "proxyMerName" value = "'.$param['proxyMerName'].'">
  <input type = "hidden" name = "proxyMerType" value = "'.$param['proxyMerType'].'">
  <input type = "hidden" name = "proxyMerCredentials" value = "'.$param['proxyMerCredentials'].'">
  <input type = "hidden" name = "netType" value = "'.$param['netType'].'">
  <input type = "hidden" name = "merSignMsg" value = "'.$param['signMsg_value'].'">
  <input type = "hidden" name = "issBankNo" value = "'.$param['issBankNo'].'">
  <input type="submit" value=" " class="pay_button" />
  </form>';
  return $pay_html;
 }
 /**
  * 处理函数
  */
 function respond()
 {  
  $tranCode = "cb2200_verify";
  $notifyMsg = $_REQUEST["notifyMsg"];   
  $lastIndex = strripos($notifyMsg,"|");
  $signMsg = substr($notifyMsg,$lastIndex+1); //签名信息
  $srcMsg = substr($notifyMsg,0,$lastIndex+1);//原文
  //连接地址
  $socketUrl = "tcp://127.0.0.1:8080";
  $fp = stream_socket_client($socketUrl, $errno, $errstr, 30);
  $retMsg="";
  if (!$fp) {
   //echo "$errstr ($errno)<br />\n";
   return false;
  }else{
   $in  = "<?xml version='1.0' encoding='UTF-8'?>";
   $in .= "<Message>";
   $in .= "<TranCode>".$tranCode."</TranCode>";
   $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;
  $signMsg = $dom->getElementsByTagName('signMsg');
  $signMsg_value = $signMsg->item(0)->nodeValue;
  if($retCode_value != ''){
   //echo "交易返回码:".$retCode_value."<br>";
   //echo "交易错误信息:" .$errMsg_value."<br>";
   return false;
  }else{
   $arr = preg_split("/\|{1,}/",$srcMsg); 
   $pay_id = $arr[1];
   $action_note = base64_decode($arr[16]);
   // 完成订单。
   order_paid($pay_id, PS_PAYED, $action_note);
   //告诉用户交易完成
   return true; 
  }
  ///////////////// respond END ///////////////
 }
}
?>

语言包源码(languages/zh_cn/payment/bankcomm.php):
<?php
/**
 * 交通银行语言文件
 * by: Reson
 * 2014/03/31
 */
global $_LANG;
$_LANG['bankcomm'] = '交通银行在线支付';
$_LANG['bankcomm_desc'] = '交通银行在线支付';
$_LANG['pay_button'] = '交通银行支付';
?>

以下是调用的范例:

include_once(ROOT_PATH . 'includes/modules/payment/bankcomm.php');
$order_['orderid'] = $order['order_sn'];
$order_['amount'] = $order['yd_price'];
$order_['orderMono'] = '测试'; //商家备注
$order_['goodsURL'] = "http://".$_SERVER['HTTP_HOST'].'/respond.php?code=bankcomm'; //取货URL
$pay_code = new bankcomm;
$pay_button = $pay_code->get_code($order_);
$order['pay_button'] = $pay_button; //即此时已经生成了一个支付按钮
PHP 相关文章推荐
深入php 正则表达式的学习探讨
Jun 06 PHP
PHP设计模式之命令模式的深入解析
Jun 13 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
Jun 18 PHP
php内核解析:PHP中的哈希表
Jan 30 PHP
php的ajax简单实例
Feb 27 PHP
php实现文件编码批量转换
Mar 10 PHP
Yii2框架使用计划任务的方法
May 25 PHP
php mysql 封装类实例代码
Sep 18 PHP
PHP通过bypass disable functions执行系统命令的方法汇总
May 02 PHP
php处理多图上传压缩代码功能
Jun 13 PHP
PHP常用函数之base64图片上传功能详解
Oct 21 PHP
PHP实现本地图片转base64格式并上传
May 29 PHP
php中curl和file_get_content的区别
May 10 #PHP
php实现文件下载功能的几个代码分享
May 10 #PHP
php按百分比生成缩略图的代码分享
May 10 #PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
May 10 #PHP
php下获取http状态的实现代码
May 09 #PHP
PHP防范SQL注入的具体方法详解(测试通过)
May 09 #PHP
简单的php新闻发布系统教程
May 09 #PHP
You might like
PHP开发框架总结收藏
2008/04/24 PHP
php array_intersect比array_diff快(附详细的使用说明)
2011/07/03 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
2014/09/06 PHP
php实现以只读方式打开文件的方法
2015/03/16 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
javascript中的对象和数组的应用技巧
2007/01/07 Javascript
js判断IE6/IE7/FF的代码[XMLHttpRequest]
2011/02/16 Javascript
解析URI与URL之间的区别与联系
2013/11/22 Javascript
JavaScript插件化开发教程 (二)
2015/01/27 Javascript
使用CamanJS在Web页面上处理图像的技巧
2015/08/18 Javascript
jQuery复制表单元素附源码分享效果演示
2015/09/30 Javascript
第七章之菜单按钮图标组件
2016/04/25 Javascript
jquery 判断selection range 是否在容器中的简单实例
2016/08/02 Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
2017/03/02 Javascript
Javascript实现找不同色块的游戏
2017/07/17 Javascript
vue.js引入外部CSS样式和外部JS文件的方法
2019/01/06 Javascript
vue中$refs, $emit, $on, $once, $off的使用详解
2019/05/26 Javascript
微信小程序跳转到其他网页(外部链接)的实现方法
2019/09/20 Javascript
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
2020/08/14 Javascript
electron踩坑之dialog中的callback解决
2020/10/06 Javascript
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
python实现复制整个目录的方法
2015/05/12 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
python获取命令行参数实例方法讲解
2020/11/02 Python
基于OpenCV的路面质量检测的实现
2020/11/04 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
迪卡侬中国官网:Decathlon中国
2020/08/10 全球购物
门卫岗位安全职责
2013/12/13 职场文书
就业意向书
2014/07/29 职场文书
公司授权委托书范文
2014/08/02 职场文书
小学生感恩父母演讲稿
2014/08/28 职场文书
转让协议书范本
2014/09/13 职场文书
企业法人代表证明书
2014/09/27 职场文书
教育项目合作协议书格式
2014/10/17 职场文书
2015年城管执法工作总结
2015/07/23 职场文书