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); } }