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">← 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>
Выполнить команду
Для локальной разработки. Не используйте в интернете!