<?php
/**
 * 支付异步通知页面
 * 支付完成后，支付平台会异步通知此页面
 */

require_once __DIR__ . '/../MPHX/common.php';

// 获取支付通知参数
$pid = isset($_POST['pid']) ? $_POST['pid'] : (isset($_GET['pid']) ? $_GET['pid'] : '');
$trade_no = isset($_POST['trade_no']) ? $_POST['trade_no'] : (isset($_GET['trade_no']) ? $_GET['trade_no'] : '');
$out_trade_no = isset($_POST['out_trade_no']) ? $_POST['out_trade_no'] : (isset($_GET['out_trade_no']) ? $_GET['out_trade_no'] : '');
$type = isset($_POST['type']) ? $_POST['type'] : (isset($_GET['type']) ? $_GET['type'] : '');
$name = isset($_POST['name']) ? $_POST['name'] : (isset($_GET['name']) ? $_GET['name'] : '');
$money = isset($_POST['money']) ? $_POST['money'] : (isset($_GET['money']) ? $_GET['money'] : '');
$trade_status = isset($_POST['trade_status']) ? $_POST['trade_status'] : (isset($_GET['trade_status']) ? $_GET['trade_status'] : '');
$sign = isset($_POST['sign']) ? $_POST['sign'] : (isset($_GET['sign']) ? $_GET['sign'] : '');
$sign_type = isset($_POST['sign_type']) ? $_POST['sign_type'] : (isset($_GET['sign_type']) ? $_GET['sign_type'] : '');

// 记录日志
function notifyLog($message) {
    $logFile = __DIR__ . '/../logs/notify.log';
    $logDir = dirname($logFile);
    if (!is_dir($logDir)) {
        mkdir($logDir, 0755, true);
    }
    $time = date('Y-m-d H:i:s');
    $log = "[$time] $message\n";
    file_put_contents($logFile, $log, FILE_APPEND);
}

notifyLog("收到通知: out_trade_no=$out_trade_no, trade_status=$trade_status, money=$money");

// 验证签名
$verify_result = false;
if (!empty($sign) && !empty($conf['hxt'])) {
    // 构建待签名数组
    $para = array(
        'pid' => $pid,
        'trade_no' => $trade_no,
        'out_trade_no' => $out_trade_no,
        'type' => $type,
        'name' => $name,
        'money' => $money,
        'trade_status' => $trade_status
    );
    
    // 过滤空值
    $para_filter = array();
    foreach ($para as $key => $val) {
        if ($val !== '' && $val !== null) {
            $para_filter[$key] = $val;
        }
    }
    
    // 排序
    ksort($para_filter);
    reset($para_filter);
    
    // 构建签名字符串
    $arg = '';
    foreach ($para_filter as $key => $val) {
        $arg .= $key . '=' . $val . '&';
    }
    $arg = substr($arg, 0, -1);
    
    // 计算签名
    $mysign = md5($arg . $conf['hxt']);
    
    // 验证签名
    $verify_result = ($mysign === $sign);
    
    notifyLog("签名验证: mysign=$mysign, sign=$sign, result=" . ($verify_result ? 'success' : 'fail'));
}

// 判断支付状态
if ($verify_result && ($trade_status === 'TRADE_SUCCESS' || $trade_status === 'TRADE_FINISHED')) {
    // 支付成功，更新订单状态
    if (!empty($out_trade_no)) {
        // 查询订单
        $order = $DB->get_row("SELECT * FROM `balance_orders` WHERE `order_no`='{$out_trade_no}'");
        
        if ($order) {
            notifyLog("找到订单: id={$order['id']}, status={$order['status']}, uid={$order['uid']}");
            
            if ($order['status'] === 'pending') {
                // 更新订单状态为已支付
                $DB->query("UPDATE `balance_orders` SET `status`='paid', `pay_time`=NOW(), `trade_no`='{$trade_no}' WHERE `id`='{$order['id']}'");
                
                // 增加用户余额
                $uid = intval($order['uid']);
                $amount = floatval($order['amount']);
                $DB->query("UPDATE `zj` SET `balance`=`balance`+{$amount} WHERE `id`='{$uid}'");
                
                notifyLog("订单处理成功: 订单状态已更新，余额已增加 {$amount} 元");
                
                // 返回成功
                echo 'success';
                exit;
            } else {
                notifyLog("订单已处理: status={$order['status']}");
                echo 'success';
                exit;
            }
        } else {
            notifyLog("订单不存在: out_trade_no=$out_trade_no");
        }
    } else {
        notifyLog("订单号为空");
    }
} else {
    notifyLog("验证失败或状态错误: verify_result=" . ($verify_result ? 'true' : 'false') . ", trade_status=$trade_status");
}

// 返回失败
echo 'fail';
