www.gusucode.com > Destoon B2B仿淘宝电子商务网站 UTF8 v6.0源码程序 > destoon/api/pay/tenpay/notify.php

    <?php
$_SERVER['REQUEST_URI'] = '';
$_DPOST = $_POST;
$_DGET = $_GET;
require '../../../common.inc.php';
$_POST = $_DPOST;
$_GET = $_DGET;
if(!$_POST && !$_GET) exit('fail');
$bank = 'tenpay';
$PAY = cache_read('pay.php');
if(!$PAY[$bank]['enable']) exit('fail');
if(!$PAY[$bank]['partnerid']) exit('fail');
if(strlen($PAY[$bank]['keycode']) < 10) exit('fail');
$receive_url = '';

require DT_ROOT.'/api/pay/'.$bank.'/ResponseHandler.class.php';
require DT_ROOT.'/api/pay/'.$bank.'/RequestHandler.class.php';
require DT_ROOT.'/api/pay/'.$bank.'/ClientResponseHandler.class.php';
require DT_ROOT.'/api/pay/'.$bank.'/TenpayHttpClient.class.php';
require DT_ROOT.'/api/pay/'.$bank.'/function.php';
require DT_ROOT.'/api/pay/'.$bank.'/config.inc.php';


		#log_result("进入后台回调页面");


	/* 创建支付应答对象 */
		$resHandler = new ResponseHandler();
		$resHandler->setKey($key);

	//判断签名
		if($resHandler->isTenpaySign()) {
	
	//通知id
		$notify_id = $resHandler->getParameter("notify_id");
	
	//通过通知ID查询,确保通知来至财付通
	//创建查询请求
		$queryReq = new RequestHandler();
		$queryReq->init();
		$queryReq->setKey($key);
		$queryReq->setGateUrl("https://gw.tenpay.com/gateway/simpleverifynotifyid.xml");
		$queryReq->setParameter("partner", $partner);
		$queryReq->setParameter("notify_id", $notify_id);
		
	//通信对象
		$httpClient = new TenpayHttpClient();
		$httpClient->setTimeOut(5);
	//设置请求内容
		$httpClient->setReqContent($queryReq->getRequestURL());
	
	//后台调用
		if($httpClient->call()) {
	//设置结果参数
			$queryRes = new ClientResponseHandler();
			$queryRes->setContent($httpClient->getResContent());
			$queryRes->setKey($key);
		
		if($resHandler->getParameter("trade_mode") == "1"){
	//判断签名及结果(即时到帐)
	//只有签名正确,retcode为0,trade_state为0才是支付成功
		if($queryRes->isTenpaySign() && $queryRes->getParameter("retcode") == "0" && $resHandler->getParameter("trade_state") == "0") {
				#log_result("即时到帐验签ID成功");
	//取结果参数做业务处理
				$out_trade_no = $resHandler->getParameter("out_trade_no");
	//财付通订单号
				$transaction_id = $resHandler->getParameter("transaction_id");
	//金额,以分为单位
				$total_fee = $resHandler->getParameter("total_fee");
	//如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee
				$discount = $resHandler->getParameter("discount");
				
				//------------------------------
				//处理业务开始
				//------------------------------
				
				//处理数据库逻辑
				//注意交易单不要重复处理
				//注意判断返回金额

				$total_fee = ($total_fee+$discount)/100;
				$out_trade_no = intval($out_trade_no);
				$r = $db->get_one("SELECT * FROM {$DT_PRE}finance_charge WHERE itemid='$out_trade_no'");
				if($r) {
					if($r['status'] == 0) {
						$charge_orderid = $r['itemid'];
						$charge_money = $r['amount'] + $r['fee'];
						$charge_amount = $r['amount'];
						$editor = 'N'.$bank;
						if($total_fee == $charge_money) {
							$db->query("UPDATE {$DT_PRE}finance_charge SET status=3,money=$charge_money,receivetime='$DT_TIME',editor='$editor' WHERE itemid=$charge_orderid");
							require DT_ROOT.'/include/module.func.php';
							money_add($r['username'], $r['amount']);
							money_record($r['username'], $r['amount'], $PAY[$bank]['name'], 'system', '在线充值', '流水号:'.$charge_orderid);
							$MOD = cache_read('module-2.php');
							if($MOD['credit_charge'] > 0) {
								$credit = intval($r['amount']*$MOD['credit_charge']);
								if($credit > 0) {
									credit_add($r['username'], $credit);
									credit_record($r['username'], $credit, 'system', '充值奖励', '充值'.$r['amount'].$DT['money_unit']);
								}
							}
							exit('success');
						} else {
							$note = '充值金额不匹配S:'.$charge_money.'R:'.$total_fee;
							$db->query("UPDATE {$DT_PRE}finance_charge SET status=1,receivetime='$DT_TIME',editor='$editor',note='$note' WHERE itemid=$charge_orderid");//支付失败
							#log_result($note);
							exit('fail');
						}
					} else if($r['status'] == 1) {
						exit('fail');
					} else if($r['status'] == 2) {
						exit('fail');
					} else {
						exit('success');
					}
				} else {
					#log_result('通知订单号不存在R:'.$out_trade_no);
					exit('fail');
				}

				
				//------------------------------
				//处理业务完毕
				//------------------------------
				#log_result("即时到帐后台回调成功");
				echo "success";
				
			} else {
	//错误时,返回结果可能没有签名,写日志trade_state、retcode、retmsg看失败详情。
	//echo "验证签名失败 或 业务错误信息:trade_state=" . $resHandler->getParameter("trade_state") . ",retcode=" . $queryRes->                         getParameter("retcode"). ",retmsg=" . $queryRes->getParameter("retmsg") . "<br/>" ;
			   #log_result("即时到帐后台回调失败");
			   echo "fail";
			}
		}
		
	    
		
		
	//获取查询的debug信息,建议把请求、应答内容、debug信息,通信返回码写入日志,方便定位问题
	/*
		echo "<br>------------------------------------------------------<br>";
		echo "http res:" . $httpClient->getResponseCode() . "," . $httpClient->getErrInfo() . "<br>";
		echo "query req:" . htmlentities($queryReq->getRequestURL(), ENT_NOQUOTES, "GB2312") . "<br><br>";
		echo "query res:" . htmlentities($queryRes->getContent(), ENT_NOQUOTES, "GB2312") . "<br><br>";
		echo "query reqdebug:" . $queryReq->getDebugInfo() . "<br><br>" ;
		echo "query resdebug:" . $queryRes->getDebugInfo() . "<br><br>";
		*/
	} else {
		//通信失败
		echo "fail";
		//后台调用通信失败,写日志,方便定位问题
		//echo "<br>call err:" . $httpClient->getResponseCode() ."," . $httpClient->getErrInfo() . "<br>";
	 } 
	
	
   } else {
	   echo "fail";
    //echo "<br/>" . "认证签名失败" . "<br/>";
    //echo $resHandler->getDebugInfo() . "<br>";
}
?>