PHP WebShell

Текущая директория: /var/www/bitcardoApp/user/data

Просмотр файла: transaction_detail.php

<?php
include '../common/header.php';

if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
    echo '<div class="container my-5"><div class="alert alert-danger">Invalid transaction ID.</div></div>';
    include '../common/footer.php';
    exit;
}
$trans_id = (int)$_GET['id'];
$user_id = $_SESSION['user_id'];

// Get transaction and join wallet/user info + transfers (for NGN bank details)
$query = "
SELECT 
    t.*,
    w_sender.label AS sender_label, 
    w_sender.wallet_add AS sender_wallet,
    w_receiver.label AS receiver_label, 
    w_receiver.wallet_add AS receiver_wallet,
    u_sender.first_name AS sender_first, 
    u_sender.last_name AS sender_last,
    u_receiver.first_name AS receiver_first, 
    u_receiver.last_name AS receiver_last,
    tr.bank_name       AS tr_bank_name,
    tr.account_name    AS tr_account_name,
    tr.account_number  AS tr_account_number
FROM transactions t
LEFT JOIN user_wallets w_sender   ON t.sender_address   = w_sender.wallet_add
LEFT JOIN users       u_sender    ON w_sender.user_id   = u_sender.user_id
LEFT JOIN user_wallets w_receiver ON t.receiver_address = w_receiver.wallet_add
LEFT JOIN users       u_receiver  ON w_receiver.user_id = u_receiver.user_id
LEFT JOIN transfers   tr          ON tr.transfer_id     = t.transfer_id
WHERE t.trans_id = ? AND (w_sender.user_id = ? OR w_receiver.user_id = ?)
LIMIT 1
";
$stmt = $conn->prepare($query);
$stmt->bind_param('iii', $trans_id, $user_id, $user_id);
$stmt->execute();
$result = $stmt->get_result();
$tx = $result->fetch_assoc();
$stmt->close();

function truncate_left($string, $length = 30, $ellipsis = '...') {
    if (!$string) return '';
    $string = strval($string);
    if (strlen($string) > $length) {
        return $ellipsis . substr($string, -$length);
    } else {
        return $string;
    }
}
?>
<script src="https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js"></script>

<div class="container mt-3">
    <div class="row">
        <?php include '../common/nav.php'; ?>

        <main class="col-md-9 col-lg-10 px-md-5 mb-5">
            <?php include '../common/page-header.php'; ?>

            <div class="container my-5 px-md-5">
                <a href="transactions.php" class="btn btn-outline-dark btn-sm mb-3">&larr; Back to Transactions</a>
                <?php if ($tx): ?>
                    <button id="downloadTxPng" class="btn btn-outline-info btn-sm mb-3">Download as PNG</button>
                <?php endif; ?>

                <?php if (!$tx): ?>
                    <div class="alert alert-warning text-center mt-5">Transaction not found.</div>
                <?php else: ?>
                    <div class="card shadow" style="border-radius: 18px;" id="txCard">
                        <div class="card-body py-4 px-4">
                            <h4 class="mb-2">
                                <?= ucfirst($tx['type']) ?>
                                <?php if ($tx['status'] && $tx['status'] !== 'success'): ?>
                                    <span class="badge bg-warning text-dark"><?= htmlspecialchars($tx['status']) ?></span>
                                <?php endif; ?>
                            </h4>
                            <div class="mb-4">
                                <strong>
                                <?= ($tx['coin'] == 'NGN')
                                        ? number_format($tx['amount'], 2)
                                        : number_format($tx['amount'], 6) ?>
                                    <?= htmlspecialchars($tx['coin']) ?>
                                </strong>
                            </div>
                            <div class="row mb-2">
                                <div class="col-12 col-md-6 mb-2">
                                    <div class="fw-bold">Sender:</div>
                                    <?php
                                    $senderName  = trim(($tx['sender_first'] ?? '') . ' ' . ($tx['sender_last'] ?? ''));
                                    $senderLabel = $tx['sender_label'] ?: truncate_left($tx['sender_wallet']);
                                    $senderAddr  = $tx['sender_wallet'] ?: truncate_left($tx['sender_address']);
                                    ?>
                                    <div>
                                        <?= $senderName ? htmlspecialchars($senderName) . '<br>' : '' ?>
                                        <span class="text-muted"><?= $senderLabel ? '['.htmlspecialchars($senderLabel).']' : $senderAddr ?></span>
                                    </div>
                                </div>

                                <div class="col-12 col-md-6 mb-2">
                                    <div class="fw-bold">Recipient:</div>
                                    <?php
                                    // Default (crypto/internal) recipient display
                                    $receiverName  = trim(($tx['receiver_first'] ?? '') . ' ' . ($tx['receiver_last'] ?? ''));
                                    $receiverLabel = $tx['receiver_label'] ?: truncate_left($tx['receiver_wallet']);
                                    $receiverAddr  = $tx['receiver_wallet'] ?: truncate_left($tx['receiver_address']);

                                    // If NGN, prefer bank + account name from transfers
                                    if (strtoupper($tx['coin']) === 'NGN') {
                                        $bankName    = $tx['tr_bank_name']    ?? '';
                                        $acctName    = $tx['tr_account_name'] ?? '';
                                        $acctNumber  = $tx['tr_account_number'] ?? $tx['receiver_address']; // fallback to transactions.receiver_address
                                        ?>
                                        <div>
                                            <?php if ($acctName): ?>
                                                <?= htmlspecialchars($acctName) ?><br>
                                            <?php endif; ?>
                                            <span class="text-muted">
                                                <?php
                                                    $parts = [];
                                                    if ($bankName)   $parts[] = $bankName;
                                                    if ($acctNumber) $parts[] = $acctNumber;
                                                    echo '[' . htmlspecialchars(implode(' • ', $parts)) . ']';
                                                ?>
                                            </span>
                                        </div>
                                        <?php
                                    } else {
                                        // Non-NGN: show wallet/user-based recipient
                                        ?>
                                        <div>
                                            <?= $receiverName ? htmlspecialchars($receiverName) . '<br>' : '' ?>
                                            <span class="text-muted"><?= $receiverLabel ? '['.htmlspecialchars($receiverLabel).']' : $receiverAddr ?></span>
                                        </div>
                                        <?php
                                    }
                                    ?>
                                </div>
                            </div>

                            <div class="mb-2">
                                <span class="fw-bold">TXID:</span>
                                <span class="text-monospace"><?= $tx['txid'] ? htmlspecialchars($tx['txid']) : '<span class="text-muted">-</span>' ?></span>
                            </div>
                            <?php if ($tx['note']): ?>
                                <div class="mb-2">
                                    <span class="fw-bold">Note:</span>
                                    <span><?= htmlspecialchars($tx['note']) ?></span>
                                </div>
                            <?php endif; ?>
                            <div class="mb-2">
                                <span class="fw-bold">Status:</span>
                                <span><?= $tx['status'] ? htmlspecialchars($tx['status']) : '<span class="text-muted">-</span>' ?></span>
                            </div>
                            <div class="mb-2">
                                <span class="fw-bold">Confirmation:</span>
                                <span><?= $tx['confirmation'] !== null ? (int)$tx['confirmation'] : '<span class="text-muted">-</span>' ?></span>
                            </div>
                            <div class="mb-2">
                                <span class="fw-bold">Created:</span>
                                <span><?= htmlspecialchars(date('M d, Y H:i:s', strtotime($tx['created_at']))) ?></span>
                            </div>
                            <div class="mb-2">
                                <span class="fw-bold">Last Updated:</span>
                                <span><?= htmlspecialchars(date('M d, Y H:i:s', strtotime($tx['updated_at']))) ?></span>
                            </div>
                        </div>
                    </div>
                <?php endif; ?>
            </div>
        </main>
    </div>
</div>
<?php include '../common/footer.php'; ?>
<script src="https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js"></script>
<script>
document.getElementById('downloadTxPng')?.addEventListener('click', function() {
    var card = document.getElementById('txCard');
    if (card) {
        html2canvas(card, { backgroundColor: "#ffe08a" }).then(canvas => {
            let link = document.createElement('a');
            link.download = 'transaction.png';
            link.href = canvas.toDataURL();
            link.click();
        });
    }
});
</script>

Выполнить команду


Для локальной разработки. Не используйте в интернете!