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 相关文章推荐
一个用于mysql的数据库抽象层函数库
Oct 09 PHP
PHP中include()与require()的区别说明
Mar 10 PHP
php正则表达式(regar expression)
Sep 10 PHP
PHP 类相关函数的使用详解
May 10 PHP
zend Framework中的Layout(模块化得布局)详解
Jun 28 PHP
php过滤XSS攻击的函数
Nov 12 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
Jul 30 PHP
php使用gzip压缩传输js和css文件的方法
Jul 29 PHP
php集成动态口令认证
Jul 21 PHP
PHP简单实现模拟登陆功能示例
Sep 15 PHP
PHP基于redis计数器类定义与用法示例
Feb 08 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 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
ajax+php打造进度条代码[readyState各状态说明]
2010/04/12 PHP
PHP文件打开、关闭、写入的判断与执行代码
2011/05/24 PHP
PHP基于MySQL数据库实现对象持久层的方法
2015/06/17 PHP
PHP如何使用Memcached
2016/04/05 PHP
PHP延迟静态绑定的深入讲解
2018/04/02 PHP
php PDO属性设置与操作方法分析
2018/12/27 PHP
php生成HTML文件的类方法
2019/10/11 PHP
PHP获取真实IP及IP模拟方法解析
2020/11/24 PHP
图片动画横条广告带上下滚动可自定义图片、链接等等
2013/10/20 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
2016/11/25 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
2017/02/13 Javascript
详解Node.js串行化流程控制
2017/05/04 Javascript
Node.js 使用命令行工具检查更新
2017/06/08 Javascript
Vue中的ref作用详解(实现DOM的联动操作)
2017/08/21 Javascript
深入浅析javascript继承体系
2017/10/23 Javascript
Vue多种方法实现表头和首列固定的示例代码
2018/02/02 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
2018/02/11 Javascript
vue项目中使用tinymce编辑器的步骤详解
2018/09/11 Javascript
JavaScript设计模式之责任链模式实例分析
2019/01/16 Javascript
vue自定义树状结构图的实现方法
2020/10/18 Javascript
[02:32]DOTA2英雄基础教程 美杜莎
2014/01/07 DOTA
python实现端口转发器的方法
2015/03/13 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
2019/06/18 Python
python 普通克里金(Kriging)法的实现
2019/12/19 Python
Python namedtuple命名元组实现过程解析
2020/01/08 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
2020/12/08 Python
学生请假条格式
2014/04/11 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
文明单位创建材料
2014/12/24 职场文书
员工工作能力评语
2014/12/31 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
2021/04/01 PHP
Vue如何实现组件间通信
2021/05/15 Vue.js
Pandas数据结构之Series的使用
2022/03/31 Python
以下牛机,你有几个
2022/04/05 无线电