Files
wordpress-theme-aksrt/inc/helpers/user-center-renderers/credits-wallet.php
T
kate522 8e0f9d989d feat(user-center): add cash wallet balance separate from credits
Introduce AKSRT_Balance (user_meta aksrt_balance + balance_log) for
Zibll-like pay_balance wallet. User center assets panel shows wallet
and points; balance gateway/card-pass/refunds credit cash when enabled.
2026-07-16 13:44:37 +08:00

155 lines
5.8 KiB
PHP

<?php
/**
* User center: cash wallet (站内余额) card + ledger.
*
* Expects extracted $context vars: $user_id, $wallet_balance, $balance_enabled, $card pass opts.
*
* @package AKSRT
*/
defined('ABSPATH') || exit;
if (empty($balance_enabled)) {
return;
}
$wallet = (float) ($wallet_balance ?? 0.0);
$card_pass_balance = ['enabled' => false, 'desc' => '', 'only_password' => true];
if (class_exists('AKSRT_Charge_Card')) {
$opts = AKSRT_Charge_Card::get_instance()->get_public_options();
$card_pass_balance = is_array($opts['balance'] ?? null) ? $opts['balance'] : $card_pass_balance;
} elseif (class_exists('AKSRT_Settings') && method_exists('AKSRT_Settings', 'get_payment_recharge_settings')) {
$recharge = AKSRT_Settings::get_payment_recharge_settings();
$pc = is_array($recharge['pass_charge'] ?? null) ? $recharge['pass_charge'] : [];
$card_pass_balance = [
'enabled' => !empty($pc['enabled']),
'desc' => (string) ($pc['desc'] ?? ''),
'only_password' => !isset($pc['only_password']) || !empty($pc['only_password']),
];
}
?>
<div class="uc-wallet-grid">
<div class="uc-balance-card uc-balance-card--wallet">
<div class="uc-balance-card__bg uc-balance-card__bg--wallet"></div>
<div class="uc-balance-card__content">
<div class="uc-balance-card__header">
<span class="uc-balance-card__label"><?php esc_html_e('钱包余额', 'aksrt'); ?></span>
<span class="uc-balance-card__currency"><?php esc_html_e('元', 'aksrt'); ?></span>
</div>
<div class="uc-balance-card__amount">
<span class="uc-balance-card__value">
<?php
echo esc_html(
class_exists('AKSRT_Balance')
? AKSRT_Balance::format($wallet)
: number_format_i18n($wallet, 2)
);
?>
</span>
</div>
<p class="uc-balance-card__tip"><?php esc_html_e('可用于站内余额支付、卡密充值入账', 'aksrt'); ?></p>
</div>
</div>
</div>
<?php if (!empty($card_pass_balance['enabled'])) : ?>
<div class="uc-card-pass" data-aksrt-card-pass="balance">
<div class="uc-card-pass__title">
<i class="fas fa-ticket-alt" aria-hidden="true"></i>
<span><?php esc_html_e('卡密兑换余额', 'aksrt'); ?></span>
</div>
<?php if (!empty($card_pass_balance['desc'])) : ?>
<p class="uc-card-pass__desc"><?php echo esc_html((string) $card_pass_balance['desc']); ?></p>
<?php endif; ?>
<?php if (empty($card_pass_balance['only_password'])) : ?>
<input type="text" class="uc-card-pass__input" name="aksrt_card_no" data-aksrt-card-no autocomplete="off" placeholder="<?php esc_attr_e('请输入卡号', 'aksrt'); ?>">
<?php endif; ?>
<input type="text" class="uc-card-pass__input" name="aksrt_card_password" data-aksrt-card-password autocomplete="off" placeholder="<?php esc_attr_e('请输入卡密', 'aksrt'); ?>">
<button type="button" class="uc-card-pass__btn" data-aksrt-card-redeem data-type="balance">
<?php esc_html_e('兑换余额', 'aksrt'); ?>
</button>
<p class="uc-card-pass__tip" data-aksrt-card-tip></p>
</div>
<?php endif; ?>
<div class="uc-transactions uc-transactions--wallet">
<div class="uc-transactions__header">
<h3 class="uc-transactions__title">
<i class="fas fa-list-ul" aria-hidden="true"></i>
<?php esc_html_e('余额明细', 'aksrt'); ?>
</h3>
</div>
<?php
$wallet_page = max(1, isset($_GET['wallet_page']) ? (int) $_GET['wallet_page'] : 1);
if (class_exists('AKSRT_Balance')) {
$wlog = AKSRT_Balance::get_log(['user_id' => (int) $user_id, 'page' => $wallet_page, 'per_page' => 10]);
} else {
$wlog = ['items' => [], 'total' => 0];
}
if (!empty($wlog['items'])) :
?>
<div class="uc-transactions__list">
<?php foreach ($wlog['items'] as $row) :
$delta = (float) $row['delta'];
$delta_class = $delta >= 0 ? 'is-positive' : 'is-negative';
$delta_txt = ($delta > 0 ? '+' : '') . (class_exists('AKSRT_Balance') ? AKSRT_Balance::format($delta) : number_format_i18n($delta, 2));
?>
<div class="uc-transactions__item">
<div class="uc-transactions__icon <?php echo esc_attr($delta_class); ?>">
<i class="fas fa-<?php echo $delta >= 0 ? 'arrow-up' : 'arrow-down'; ?>" aria-hidden="true"></i>
</div>
<div class="uc-transactions__info">
<div class="uc-transactions__reason">
<?php
echo esc_html(
class_exists('AKSRT_Balance')
? AKSRT_Balance::reason_label((string) $row['reason'])
: (string) $row['reason']
);
?>
<?php if (!empty($row['remark'])) : ?>
<span class="uc-transactions__remark">(<?php echo esc_html((string) $row['remark']); ?>)</span>
<?php endif; ?>
</div>
<div class="uc-transactions__time">
<?php echo esc_html(get_date_from_gmt((string) $row['created_at'], 'Y-m-d H:i')); ?>
</div>
</div>
<div class="uc-transactions__amount">
<span class="uc-transactions__delta <?php echo esc_attr($delta_class); ?>">
<?php echo esc_html($delta_txt); ?>
</span>
<span class="uc-transactions__balance">
<?php
printf(
/* translators: %s: wallet balance */
esc_html__('余额 %s', 'aksrt'),
esc_html(
class_exists('AKSRT_Balance')
? AKSRT_Balance::format((float) $row['balance_after'])
: number_format_i18n((float) $row['balance_after'], 2)
)
);
?>
</span>
</div>
</div>
<?php endforeach; ?>
</div>
<?php
$total_pages = (int) ceil((int) ($wlog['total'] ?? 0) / 10);
if ($total_pages > 1 && function_exists('aksrt_render_profile_pagination')) {
aksrt_render_profile_pagination($total_pages, $wallet_page, 'wallet_page');
}
?>
<?php else : ?>
<div class="uc-transactions__empty">
<div class="uc-transactions__empty-icon">
<i class="fas fa-wallet" aria-hidden="true"></i>
</div>
<p><?php esc_html_e('还没有任何余额流水', 'aksrt'); ?></p>
</div>
<?php endif; ?>
</div>