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获取mysql版本的几种方法小结
Mar 25 PHP
PHP 数字左侧自动补0
Mar 31 PHP
用PHP伪造referer突破网盘禁止外连的代码
Jun 15 PHP
php 显示指定路径下的图片
Oct 29 PHP
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
Dec 02 PHP
php Smarty初体验二 获取配置信息
Aug 08 PHP
表格展示无限级分类(PHP版)
Aug 21 PHP
PHP正则表达式 /i, /is, /s, /isU等介绍
Oct 23 PHP
php微信开发之批量生成带参数的二维码
Jun 26 PHP
PHP中类的自动加载的方法
Mar 17 PHP
Laravel使用消息队列需要注意的一些问题
Dec 13 PHP
用php实现分页效果的示例代码
Dec 10 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中的fopen()函数用打开文件模式说明
2013/06/20 PHP
PHP动态输出JavaScript代码实例
2015/02/12 PHP
php简单实现无限分类树形列表的方法
2015/03/27 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
JS面向对象、prototype、call()、apply()
2009/05/14 Javascript
jquery简单的拖动效果实现原理及示例
2013/07/26 Javascript
Bootstrap 轮播(Carousel)插件
2016/12/26 Javascript
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
微信小程序 判断手机号的实现代码
2017/04/19 Javascript
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
2018/08/25 Javascript
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
jQuery实现异步上传一个或多个文件
2020/08/17 jQuery
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
2020/11/24 Javascript
[14:36]2014 DOTA2国际邀请赛中国区预选赛5.21 Orenda VS NE
2014/05/22 DOTA
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
Python编程修改MP3文件名称的方法
2017/04/19 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
2018/06/07 Python
Python实现iOS自动化打包详解步骤
2018/10/03 Python
python开启debug模式的方法
2019/06/27 Python
解决torch.autograd.backward中的参数问题
2020/01/07 Python
如何在sublime编辑器中安装python
2020/05/20 Python
keras load model时出现Missing Layer错误的解决方式
2020/06/11 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
2020/08/28 Python
html5指南-6.如何创建离线web应用程序实现离线访问
2013/01/07 HTML / CSS
Nasty Gal英国:美国女性服饰销售网站
2021/03/02 全球购物
广播电视新闻学专业应届生求职信
2013/10/08 职场文书
环保倡议书400字
2014/05/15 职场文书
捐款活动总结
2014/08/27 职场文书
党在我心中演讲稿
2014/09/02 职场文书
英语感谢信范文
2015/01/20 职场文书
当你焦虑迷茫时,请读读这6句话
2019/07/24 职场文书
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL
【海涛dota解说】DCG联赛第一周 LGD VS DH
2022/04/01 DOTA
python中redis包操作数据库的教程
2022/04/19 Python
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers