feat(pay): points-to-VIP exchange and remaining-days upgrade pricing

Add pay_vip_points_exchange packages (level|points|days|title), REST redeem
for non-VIP users, unit|daily upgrade product for residual VIP1 days, and UI.
This commit is contained in:
kate522 committed 2026-07-14 18:52:11 +08:00
1 parent ba6ae854f8
commit 9eaddce457
6 files changed
+504 -66

No files matched your search

@@ -1,6 +1,6 @@
<?php
/**
* User center credits: VIP membership card + purchase packages.
* User center credits: VIP membership card + purchase packages + points exchange.
*
* Expects extracted $context vars.
*
@@ -41,12 +41,20 @@ if ($vip_level >= 1 && !empty($vip_settings['levels'][$vip_level]['name'])) {
$packages = [];
$renew_desc = '';
$upgrade_desc = '';
$points_exchange = ['enabled' => false, 'packages' => [], 'desc' => ''];
$user_points = 0;
$currency_name = class_exists('AKSRT_Settings') ? AKSRT_Settings::get_currency_name() : __('积分', 'aksrt');
if (class_exists('AKSRT_Vip_Service')) {
$catalog = AKSRT_Vip_Service::get_instance()->get_catalog($user_id);
$packages = is_array($catalog['level_packages'] ?? null) ? $catalog['level_packages'] : [];
$methods = is_array($catalog['payment_methods'] ?? null) ? $catalog['payment_methods'] : [];
$renew_desc = (string) ($catalog['renew_desc'] ?? '');
$upgrade_desc = (string) ($catalog['upgrade_desc'] ?? '');
$points_exchange = is_array($catalog['points_exchange'] ?? null) ? $catalog['points_exchange'] : $points_exchange;
$user_points = (int) ($catalog['user_points'] ?? 0);
if (!empty($catalog['currency_name'])) {
$currency_name = (string) $catalog['currency_name'];
}
} else {
$methods = [['id' => 'balance', 'name' => __('站内余额', 'aksrt')]];
}
@@ -61,6 +69,7 @@ $shop_title = __('开通会员', 'aksrt');
if ($vip_level > 0) {
$shop_title = __('续费 / 升级会员', 'aksrt');
}
$points_pkgs = is_array($points_exchange['packages'] ?? null) ? $points_exchange['packages'] : [];
?>
<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>
@@ -183,6 +192,52 @@ if ($vip_level > 0) {
<p class="uc-vip-shop__tip" data-aksrt-vip-tip></p>
</div>
<?php elseif (!empty($vip_settings['help_text'])) : ?>
<?php endif; ?>
<?php if (!empty($points_exchange['enabled']) && $points_pkgs !== []) : ?>
<div class="uc-vip-shop uc-vip-shop--points" data-aksrt-vip-points>
<div class="uc-vip-shop__title">
<i class="fas fa-coins" aria-hidden="true"></i>
<span><?php esc_html_e('积分兑换会员', 'aksrt'); ?></span>
</div>
<div class="uc-vip-shop__balance">
<?php
printf(
/* translators: 1: points balance 2: currency name */
esc_html__('我的积分:%1$s %2$s', 'aksrt'),
esc_html((string) $user_points),
esc_html($currency_name)
);
?>
</div>
<?php if (!empty($points_exchange['desc'])) : ?>
<p class="uc-vip-shop__note"><?php echo esc_html((string) $points_exchange['desc']); ?></p>
<?php endif; ?>
<div class="uc-vip-shop__grid">
<?php foreach ($points_pkgs as $item) :
$pid = (int) ($item['package_id'] ?? 0);
$cost = (int) ($item['points'] ?? 0);
$enough = $user_points >= $cost;
?>
<button
type="button"
class="uc-vip-shop__item<?php echo $enough ? '' : ' is-disabled'; ?>"
data-aksrt-vip-points-buy
data-package-id="<?php echo esc_attr((string) $pid); ?>"
data-points="<?php echo esc_attr((string) $cost); ?>"
<?php disabled(!$enough); ?>
>
<span class="uc-vip-shop__item-title"><?php echo esc_html((string) ($item['title'] ?? '')); ?></span>
<span class="uc-vip-shop__item-days"><?php echo esc_html((string) ($item['days_label'] ?? '')); ?></span>
<span class="uc-vip-shop__item-price"><?php echo esc_html((string) ($item['price_label'] ?? '')); ?></span>
<span class="uc-vip-shop__item-cta">
<?php echo $enough ? esc_html__('立即兑换', 'aksrt') : esc_html__('积分不足', 'aksrt'); ?>
</span>
</button>
<?php endforeach; ?>
</div>
<p class="uc-vip-shop__tip" data-aksrt-vip-points-tip></p>
</div>
<?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; ?>