dedecms集成财付通支付接口 |
本文标签:dedecms,财付通,支付接口 用织梦做了个旅游网站,客户要求财付通支付,上网找了下 不是要买就是要钱,只有自己写了 。 代码: 复制代码 代码如下: <?php if(!defined(DEDEINC)) exit(Request Error!); /** *财付通接口类 */ class tenpay { var $dsql; var $mid; var $reqURL_onLine = "http://www.tenpay.com"; var $return_url=/plus/carbuyaction.php?dopost=return; //返回处理地址 /** * 构造函数 * * @access public * @param * * @return void */ function tenpay() { 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 */ function SetReturnUrl($returnurl=) { if (!empty($returnurl)) { $this->return_url = $returnurl; } } /** * 生成支付代码 * @param array $order 订单信息 * @param array $payment 支付方式信息 */ function GetCode($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 ($parameter AS $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 = <div style="text-align:center"><a href="https://gw.tenpay.com/gateway/pay.htm?.$param. &sign=.$sign."><button>立即使用财付通支付</button></a></div>; return $button; /* 清空购物车 */ require_once DEDEINC./shopcar.class.php; $cart = new MemberShops(); $cart->clearItem(); $cart->MakeOrders(); return $button; } /** * 响应操作 */ function respond() { /* 引入配置文件 */ $code = preg_replace( "#[^0-9a-z-]#i", "", $_GET[code] ); require_once DEDEDATA./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_orders WHERE oid = {$order_sn}"); if ($row[priceCount] != $_GET[total_fee]) { return $msg = "支付失败,支付金额与商品总价不相符!"; } $this->mid = $row[userid]; /* 检查数字签名是否正确 */ ksort($_GET); reset($_GET); $sign = ; foreach ($_GET AS $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> <a href=/>返回主页</a> <a href=/member>会员中心</a>"; else return $msg = "支付失败!<br> <a href=/>返回主页</a> <a href=/member>会员中心</a>"; } } else{ //return $msg = "支付失败!<br> <a href=/>返回主页</a> <a href=/member>会员中心</a>"; } } /*处理物品交易*/ function success_db($order_sn) { $time=time(); $mid=$this->mid; //获取订单信息,检查订单的有效性 $row = $this->dsql->GetOne("SELECT state,priceCount FROM #@__shops_orders WHERE oid=$order_sn "); if($row[state] > 0) { return TRUE; } /* 改变订单状态_支付成功 */ $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); //将验证结果存入文件 return TRUE; } else { $this->log_result ("verify_failed,订单号:".$order_sn);//将验证结果存入文件 return FALSE; } } 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); } } |