feat(credits): exchange balance for points

Replace the legacy points-to-balance and external points purchase flows
with direct integer balance-to-points exchange. Enforce exchange and
points-transfer limits and capability checks across the UI and REST API.
This commit is contained in:
2026-08-13 15:20:06 +08:00
parent f9bce15c9a
commit 1247f9bf4e
18 changed files with 234 additions and 648 deletions
+6 -4
View File
@@ -110,10 +110,12 @@ class PaymentRuntime {
'desc' => sanitize_textarea_field((string) ($settings['pay_balance_pass_charge_desc'] ?? '')),
'only_password' => !empty($settings['pay_balance_pass_charge_only_password']),
],
'exchange' => [
'enabled' => !empty($settings['pay_balance_exchange_s']),
'rate' => max(1, min(10000, (int) ($settings['pay_balance_exchange_rate'] ?? 100))),
'desc' => sanitize_textarea_field((string) ($settings['pay_balance_exchange_desc'] ?? '')),
'points_exchange' => [
'enabled' => !empty($settings['pay_balance_points_exchange_s']),
'rate' => max(1, min(10000, (int) ($settings['pay_balance_points_exchange_rate'] ?? 100))),
'min_points' => max(1, min(10000000, (int) ($settings['pay_balance_points_exchange_min_points'] ?? 100))),
'daily_max_points' => max(1, min(10000000, (int) ($settings['pay_balance_points_exchange_daily_max_points'] ?? 100000))),
'desc' => sanitize_textarea_field((string) ($settings['pay_balance_points_exchange_desc'] ?? '')),
],
];
}