ecshop
最近,一个项目要求做交通银行在线支付,ecshop本身没有这方面的接口,于是通过一些时间的专研,做了一个插件出来。有好的东西,当然要分享,在此特地分享出来,希望能够帮助到跟我一样有需要的人,为大家减轻一下开发的负担,也多请大家指出一些好的方法和建议,相互的学习、进步!
在使用插件之前,请配置好交通银行在线支付的环境(具体安装方法,交行提供的demo会有,也不是很难,注意好细节就行)。安装好之后,请将把下面的插件源码和语言包源码按路径保存到相应文件,最后进入后台的支付模块安装即可。
插件源码(includes/modules/payment/bankcomm.php):
复制代码 代码如下:
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)
\n;
} else
{
$in = ;
$in .= ;
$in .= .$trancode.;
$in .= .$source.;
$in .= ;
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.
;
//echo 交易错误信息: .$errmsg_value.
;
return 交易错误信息: .$errmsg_value.
;
}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 ='
';
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)
\n;
return false;
}else{
$in = ;
$in .= ;
$in .= .$trancode.;
$in .= .$notifymsg.;
$in .= ;
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.
;
//echo 交易错误信息: .$errmsg_value.
;
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):
复制代码 代码如下:
以下是调用的范例:
复制代码 代码如下:
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; //即此时已经生成了一个支付按钮