feat(pay): card-pass redeem for VIP and balance (zibll-style)

Rewrite charge-card into typed single-use card_pass inventory with public redeem REST, user-center UI for balance/VIP, admin type-aware create/batch, and CAS mark-used fulfillment via Credits/activate_vip.
This commit is contained in:
kate522 committed 2026-07-14 20:13:46 +08:00
1 parent 5d7b138c2c
commit d34c954b83
14 files changed
+936 -132

No files matched your search

@@ -1,6 +1,6 @@
<?php
/**
* User center credits: balance card + sign-in controls.
* User center credits: balance card + sign-in controls + card-pass redeem.
*
* Expects extracted $context vars.
*
@@ -11,6 +11,20 @@ defined('ABSPATH') || exit;
$balance = (float) ($credit_balance ?? 0.0);
$credits_enabled = !empty($credits_enabled);
$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-balance-card">
<div class="uc-balance-card__bg"></div>
@@ -34,3 +48,23 @@ $credits_enabled = !empty($credits_enabled);
<?php endif; ?>
</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; ?>
@@ -70,6 +70,18 @@ if ($vip_level > 0) {
$shop_title = __('续费 / 升级会员', 'aksrt');
}
$points_pkgs = is_array($points_exchange['packages'] ?? null) ? $points_exchange['packages'] : [];
$card_pass_vip = ['enabled' => false, 'desc' => '', 'only_password' => true];
if (class_exists('AKSRT_Charge_Card')) {
$card_opts = AKSRT_Charge_Card::get_instance()->get_public_options();
$card_pass_vip = is_array($card_opts['vip'] ?? null) ? $card_opts['vip'] : $card_pass_vip;
} elseif (!empty($vip_settings['benefit']['pass_charge'])) {
$card_pass_vip = [
'enabled' => true,
'desc' => (string) ($vip_settings['benefit']['pass_charge_desc'] ?? ''),
'only_password' => !isset($vip_settings['benefit']['pass_charge_only_password']) || !empty($vip_settings['benefit']['pass_charge_only_password']),
];
}
?>
<div class="uc-vip-card<?php echo $is_vip_user ? ' uc-vip-card--active' : ''; ?>" data-aksrt-vip-panel>
<div class="uc-vip-card__bg"></div>
@@ -241,3 +253,23 @@ $points_pkgs = is_array($points_exchange['packages'] ?? null) ? $points_exchange
<?php elseif (empty($packages) && !empty($vip_settings['help_text'])) : ?>
<p class="uc-vip-shop__empty"><?php echo esc_html((string) $vip_settings['help_text']); ?></p>
<?php endif; ?>
<?php if (!empty($card_pass_vip['enabled'])) : ?>
<div class="uc-card-pass" data-aksrt-card-pass="vip">
<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_vip['desc'])) : ?>
<p class="uc-card-pass__desc"><?php echo esc_html((string) $card_pass_vip['desc']); ?></p>
<?php endif; ?>
<?php if (empty($card_pass_vip['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="vip">
<?php esc_html_e('兑换会员', 'aksrt'); ?>
</button>
<p class="uc-card-pass__tip" data-aksrt-card-tip></p>
</div>
<?php endif; ?>