dedecms集成财付通支付接口
用织梦做了个旅游网站,客户要求财付通支付,上网找了下不是要买就是要钱,只有自己写了。
代码:
<?php
if(!defined('DEDEINC'))exit('RequestError!');
/**
*财付通接口类
*/
classtenpay
{
var$dsql;
var$mid;
var$reqURL_onLine="http://www.tenpay.com";
var$return_url='/plus/carbuyaction.php?dopost=return';//返回处理地址
/**
*构造函数
*
*@access public
*@param
*
*@returnvoid
*/
functiontenpay()
{
global$dsql;
$this->dsql=$dsql;
}
function__construct()
{
$this->tenpay();
}
/**
* 设定接口会送地址
*
* 例如:$this->SetReturnUrl($cfg_basehost."/tuangou/control/index.php?ac=pay&orderid=".$p2_Order)
*
*@param string $returnurl 会送地址
*@return void
*/
functionSetReturnUrl($returnurl='')
{
if(!empty($returnurl))
{
$this->return_url=$returnurl;
}
}
/**
*生成支付代码
*@param array $order 订单信息
*@param array $payment 支付方式信息
*/
functionGetCode($order,$payment)
{
global$cfg_basehost,$cfg_cmspath;
//对于二级目录的处理
if(!empty($cfg_cmspath))$cfg_basehost=$cfg_basehost.'/'.$cfg_cmspath;
$partner = $payment['tenpay_account'];
$out_trade_no=$order['out_trade_no'];
$total_fee=floatval($order['price'])*100;
$body=$order['out_trade_no'];
$attach='';
$bank_type='DEFAULT';
/*交易类型:2、虚拟交易,1、实物交易*/
$trans_type=1;
$trade_mode=empty($payment['tenpay_pay_method'])?'1':$payment['tenpay_pay_method'];
$parameter=array(
'partner' =>$partner,
'out_trade_no' =>$out_trade_no, //订单号
'total_fee' =>$total_fee, //总金额
'notify_url' =>$cfg_basehost.$this->return_url."&code=".$payment['code'], //返回地址
'return_url' =>$cfg_basehost.$this->return_url."&code=".$payment['code'],//提醒地址
'body' =>$body, //交易描述
'bank_type' =>$bank_type, //交易类型 默认财付通
//用户ip
'spbill_create_ip' =>$_SERVER['REMOTE_ADDR'], //交易ip
'fee_type' =>'1', //币种 1人民币
'subject' =>$body, //商品名称
//系统可选参数
'sign_type' =>'MD5', //加密方式
'service_version' =>'1.0', //接口版本号默认1.0
'input_charset' =>'UTF-8', //系统编码 'GBK'
'sign_key_index' =>'1', //密钥序号
//业务可选参数
'attach' =>$attach, //附加数据原样返回 默认为空
'product_fee' =>'', //商品费用
'transport_fee' =>'0', //物流费用
'time_start' =>date("YmdHis"), //订单生成时间 date("YmdHis")
'time_expire' =>'', //订单失效时间
'buyer_id' =>'', //买方财付通帐号
'goods_tag' =>'', //商品标记
'trade_mode' =>$trade_mode, //交易模式(1.即时到帐模式,2.中介担保模式,3.后台选择(卖家进入支付中心列表选择))
'transport_desc' =>'', //物流说明
'trans_type' =>$trans_type, //交易类型
'agentid' =>'', //平台ID
'agent_type' =>'', //代理模式(0.无代理,1.表示卡易售模式,2.表示网店模式)
'seller_id' =>'' //卖家商户号
);
ksort($parameter);
reset($parameter);
$param='';
$sign ='';
foreach($parameterAS$key=>$val)
{
$param.="$key=".urlencode($val)."&";
if(""!=$val&&"sign"!=$key){
$sign .="$key=$val&";
}
}
$param=substr($param,0,-1);
$sign.="key=".$payment['tenpay_key'];
$sign=strtolower(md5($sign));
$button='<divstyle="text-align:center"><ahref="https://gw.tenpay.com/gateway/pay.htm?'.$param.'&sign='.$sign.'"><button>立即使用财付通支付</button></a></div>';
return$button;
/*清空购物车*/
require_onceDEDEINC.'/shopcar.class.php';
$cart =newMemberShops();
$cart->clearItem();
$cart->MakeOrders();
return$button;
}
/**
*响应操作
*/
functionrespond()
{
/*引入配置文件*/
$code=preg_replace("#[^0-9a-z-]#i","",$_GET['code']);
require_onceDEDEDATA.'/payment/'.$code.'.php';
$attach =$_GET['attach'];
$trade_state =$_GET['trade_state'];
$total_fee =$_GET['total_fee'];
$out_trade_no=trim($_GET['out_trade_no']);
if(preg_match("/S-P[0-9]+RN[0-9]/",$order_sn)){
//检查支付金额是否相符
$row=$this->dsql->GetOne("SELECT*FROM#@__shops_ordersWHEREoid='{$order_sn}'");
if($row['priceCount']!=$_GET['total_fee'])
{
return$msg="支付失败,支付金额与商品总价不相符!";
}
$this->mid=$row['userid'];
/*检查数字签名是否正确*/
ksort($_GET);
reset($_GET);
$sign='';
foreach($_GETAS$key=>$val)
{
if(""!=$val&&"sign"!=$key&&$key!='code'){
$sign .="$key=$val&";
}
}
$sign.="key=".$payment['tenpay_key'];
if(strtolower(md5($sign))==strtolower($_GET['sign']))
{
if($trade_state==0)
{
/*改变订单状态*/
if($this->success_db($out_trade_no))
return$msg="支付成功!<br><ahref='/'>返回主页</a><ahref='/member'>会员中心</a>";
else return$msg="支付失败!<br><ahref='/'>返回主页</a><ahref='/member'>会员中心</a>";
}
}
else{
//return$msg="支付失败!<br><ahref='/'>返回主页</a><ahref='/member'>会员中心</a>";
}
}
/*处理物品交易*/
functionsuccess_db($order_sn)
{
$time=time();
$mid=$this->mid;
//获取订单信息,检查订单的有效性
$row=$this->dsql->GetOne("SELECTstate,priceCountFROM#@__shops_ordersWHEREoid='$order_sn'");
if($row['state']>0)
{
returnTRUE;
}
/*改变订单状态_支付成功*/
$sql="UPDATE`#@__shops_orders`SET`state`='1'WHERE`oid`='$order_sn'AND`userid`='".$this->mid."'";
if($this->dsql->ExecuteNoneQuery($sql))
{
$this->log_result("verify_success,订单号:".$order_sn);//将验证结果存入文件
returnTRUE;
}else{
$this->log_result("verify_failed,订单号:".$order_sn);//将验证结果存入文件
returnFALSE;
}
}
function log_result($word){
global$cfg_cmspath;
$fp=fopen(dirname(__FILE__)."/../../data/payment/log.txt","a");
flock($fp,LOCK_EX);
fwrite($fp,$word.",执行日期:".strftime("%Y-%m-%d%H:%I:%S",time())."\r\n");
flock($fp,LOCK_UN);
fclose($fp);
}
}