积分与余额账务系统硬切重构

This commit is contained in:
2026-08-24 15:59:11 +08:00
parent ca12226b39
commit 5cae5b5c93
159 changed files with 7275 additions and 4718 deletions
+27 -12
View File
@@ -37,7 +37,7 @@ class DownloadState {
* @return array{
* state:string,can_download:bool,message:string,action_label:string,
* action_url:string,cost:int,balance:int,login_url:string,pay_modo:string,
* amount:float,need_purchase:bool,need_vip:bool,has_paid_access:bool
* amount:int|string,need_purchase:bool,need_vip:bool,has_paid_access:bool
* }
*/
public function resolve(int $post_id): array {
@@ -72,13 +72,14 @@ class DownloadState {
$pay_modo = is_array($priced)
? ((($priced['modo'] ?? '0') === 'points') ? 'points' : '0')
: '0';
$amount = is_array($priced) ? (float) ($priced['amount'] ?? 0) : 0.0;
$amount = is_array($priced)
? ($priced['amount'] ?? ($pay_modo === 'points' ? 0 : '0.00'))
: ($pay_modo === 'points' ? 0 : '0.00');
$amount_minor = $this->amount_minor($amount, $pay_modo);
$cost = function_exists('aksrt_resource_download_cost')
? (int) aksrt_resource_download_cost($post_id)
: 0;
$balance = ($user_id > 0 && class_exists('\AKSRT\Credits\Credits'))
? \AKSRT\Credits\Credits::balance($user_id)
: 0;
$balance = $user_id > 0 ? \AKSRT\Ledger\LedgerService::get_instance()->balance($user_id, \AKSRT\Ledger\AssetType::POINTS) : 0;
$gate = function_exists('aksrt_can_download') ? aksrt_can_download($post_id, $user_id) : true;
if (is_wp_error($gate)) {
@@ -130,9 +131,9 @@ class DownloadState {
}
// need_purchase / legacy insufficient credits → cashier.
if (in_array($code, ['aksrt_need_purchase', 'aksrt_credits_insufficient'], true)) {
if (in_array($code, ['aksrt_need_purchase', 'aksrt_points_insufficient'], true)) {
$label = $pay_modo === 'points'
? sprintf(__('购买(%s 积分)', 'aksrt'), (string) (int) ceil($amount > 0 ? $amount : $cost))
? sprintf(__('购买(%s 积分)', 'aksrt'), (string) ($amount_minor > 0 ? $amount_minor : $cost))
: __('去购买', 'aksrt');
return $this->build_result(
self::STATE_NEED_PURCHASE,
@@ -145,7 +146,7 @@ class DownloadState {
$login_url,
[
'pay_modo' => $pay_modo,
'amount' => $amount > 0 ? $amount : (float) $cost,
'amount' => $amount_minor > 0 ? $amount : ($pay_modo === 'points' ? $cost : '0.00'),
'need_purchase' => true,
'need_vip' => false,
'has_paid_access' => false,
@@ -174,8 +175,8 @@ class DownloadState {
// Paid / free unlock.
$has_paid = !empty($access['has_paid_access']);
if ($has_paid || $amount <= 0) {
$owned = $has_paid && $amount > 0;
if ($has_paid || $amount_minor <= 0) {
$owned = $has_paid && $amount_minor > 0;
return $this->build_result(
$owned ? self::STATE_OWNED : self::STATE_AVAILABLE,
true,
@@ -189,7 +190,7 @@ class DownloadState {
$login_url,
[
'pay_modo' => $pay_modo,
'amount' => 0.0,
'amount' => $pay_modo === 'points' ? 0 : '0.00',
'need_purchase' => false,
'need_vip' => false,
'has_paid_access' => true,
@@ -241,10 +242,24 @@ class DownloadState {
'balance' => $balance,
'login_url' => $login_url,
'pay_modo' => '0',
'amount' => 0.0,
'amount' => '0.00',
'need_purchase' => false,
'need_vip' => false,
'has_paid_access' => false,
], $extra);
}
private function amount_minor($value, string $pay_modo): int {
if ($pay_modo === 'points') {
return is_int($value) ? max(0, $value) : 0;
}
if (!is_string($value)) {
return 0;
}
try {
return \AKSRT\Ledger\AssetAmount::balance_minor($value);
} catch (\InvalidArgumentException $e) {
return 0;
}
}
}