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教程 预定义变量
Oct 23 PHP
php中session_unset与session_destroy的区别分析
Jun 16 PHP
PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
Dec 16 PHP
php切割页面div内容的实现代码分享
Jul 31 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
Jul 10 PHP
php实现获取文件mime类型的方法
Feb 11 PHP
php计算税后工资的方法
Jul 28 PHP
PHP生成和获取XML格式数据的方法
Mar 04 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
thinkphp5.1 文件引入路径问题及注意事项
Jun 13 PHP
php apache开启跨域模式过程详解
Jul 08 PHP
详细分析PHP7与PHP5区别
Jun 26 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
《星际争霸II》全新指挥官斯台特曼现已上线
2020/03/08 星际争霸
PHP_Flame(Version:Progress)的原代码
2006/10/09 PHP
B/S开发中常用javaScript技术与代码
2007/03/09 Javascript
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
JavaScript mapreduce工作原理简析
2012/11/25 Javascript
深入理解javaScript中的事件驱动
2013/05/21 Javascript
jQuery toggle 代替方法
2016/03/22 Javascript
jQuery的文档处理程序详解
2016/05/10 Javascript
JS加载iFrame出现空白问题的解决办法
2016/05/13 Javascript
Js调用Java方法并互相传参的简单实例
2016/08/11 Javascript
jquery easyUI中ajax异步校验用户名
2016/08/19 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
2016/11/09 Javascript
JavaScript比较同一天的时间大小实例代码
2018/02/09 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
vue引入axios同源跨域问题
2018/09/27 Javascript
详解使用webpack+electron+reactJs开发windows桌面应用
2019/02/01 Javascript
基于Fixed定位的框选功能的实现代码
2019/05/13 Javascript
Vue项目中使用jquery的简单方法
2019/05/16 jQuery
超详细的5个Shell脚本实例分享(值得收藏)
2019/08/15 Javascript
vue element upload实现图片本地预览
2019/08/20 Javascript
nodejs文件夹深层复制功能
2019/09/03 NodeJs
vue组件开发之slider组件使用详解
2020/08/21 Javascript
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
python移位运算的实现
2019/07/15 Python
python通用数据库操作工具 pydbclib的使用简介
2020/12/21 Python
中国专业的综合网上购物商城:京东
2016/08/02 全球购物
约瑟夫·特纳男装:Joseph Turner
2017/10/10 全球购物
医药专业应届毕业生求职信范文
2014/01/01 职场文书
个人简历中的自我评价怎么写
2014/01/26 职场文书
平面设计专业大学生职业规划书
2014/03/12 职场文书
2015年后备干部工作总结
2015/05/15 职场文书
售房协议书范本
2015/08/11 职场文书
如何书写读后感?(附范文)
2019/07/26 职场文书
评估“风险”创业计划的几大要点
2019/08/12 职场文书
Python制作表白爱心合集
2022/01/22 Python
windows系统安装配置nginx环境
2022/06/28 Servers