<?php
/* *
 * 支付宝异步通知页面（必须只输出 success 或 fail，否则支付宝认为失败）
 */
ob_start();

require_once(__DIR__ . '/inc.php');

// 从订单加载接口配置
$out_trade_no = isset($_POST['out_trade_no']) ? daddslashes($_POST['out_trade_no']) : '';
if($out_trade_no){
	$pay_row = $DB->getRow("SELECT interface_id FROM pre_pay WHERE trade_no='{$out_trade_no}' LIMIT 1");
	$interface_id = isset($pay_row['interface_id']) ? intval($pay_row['interface_id']) : 0;
	if($interface_id > 0){
		$interface = $DB->getRow("SELECT config FROM pre_pay_interface WHERE id='{$interface_id}' LIMIT 1");
		if($interface){
			$interface_config = json_decode($interface['config'], true);
			if($interface_config){
				if(isset($interface_config['appid'])) $conf['alipay_appid'] = $interface_config['appid'];
				if(isset($interface_config['publickey'])) $conf['alipay_publickey'] = $interface_config['publickey'];
				if(isset($interface_config['privatekey'])) $conf['alipay_privatekey'] = $interface_config['privatekey'];
			}
		}
	}
}

require_once(SYSTEM_ROOT."alipay/AlipayTradeService.php");

//计算得出通知验证结果
$alipaySevice = new AlipayTradeService($config); 
//$alipaySevice->writeLog(var_export($_POST,true));
$verify_result = $alipaySevice->check($_POST);

if($verify_result) {
	$out_trade_no = daddslashes($_POST['out_trade_no']);
	$trade_no = daddslashes($_POST['trade_no']);
	$trade_status = $_POST['trade_status'];
	$buyer_id = daddslashes($_POST['buyer_id']);
	$total_amount = $_POST['total_amount'];

	$srow = $DB->getRow("SELECT * FROM pre_pay WHERE trade_no='{$out_trade_no}' LIMIT 1");

	// 原子更新（仅 status=0 时更新），防异步/同步重复回调导致 processOrder 执行两次
	if ($_POST['trade_status'] == 'TRADE_SUCCESS' || $_POST['trade_status'] == 'TRADE_FINISHED') {
		$aff = $DB->exec("UPDATE `pre_pay` SET `status`='1',`endtime`='{$date}',`api_trade_no`='{$trade_no}' WHERE `trade_no`='{$out_trade_no}' AND `status`='0'");
		if ($aff > 0) {
			processOrder($srow);
		}
	}

	ob_clean();
	echo "success";
}
else {
	ob_clean();
	echo "fail";
}