fix(payment): wire balance wallet end-to-end when pay_balance_s is on
Opening 余额功能 alone now enables cash-wallet pay (unless 余额支付 is explicitly off). Drop points-as-balance fallback, stop fake method injection, expose real wallet in cashiers, and honor auto_to_balance on recharge fulfill.
This commit is contained in:
1 parent
c85774f9a0
commit
3267bee71e
12 files changed
+109
-105
No files matched your search
@@ -10,7 +10,7 @@ defined('ABSPATH') || exit;
|
||||
/**
|
||||
* 站内余额支付网关(内置实现)。
|
||||
*
|
||||
* 优先扣现金钱包(\AKSRT\Credits\Balance / pay_balance);未启用时回退到积分。
|
||||
* 仅扣现金钱包(\AKSRT\Credits\Balance / pay_balance_s),不再回退到积分。
|
||||
*/
|
||||
|
||||
class BalanceGateway implements GatewayInterface {
|
||||
@@ -24,9 +24,8 @@ class BalanceGateway implements GatewayInterface {
|
||||
}
|
||||
|
||||
public function is_configured(): bool {
|
||||
$wallet_on = class_exists('\AKSRT\Credits\Balance') && \AKSRT\Credits\Balance::enabled();
|
||||
$credits_on = class_exists('\AKSRT\Credits\Credits');
|
||||
if (!$wallet_on && !$credits_on) {
|
||||
// Cash wallet only — do not treat points as 余额.
|
||||
if (!class_exists('\AKSRT\Credits\Balance') || !\AKSRT\Credits\Balance::enabled()) {
|
||||
return false;
|
||||
}
|
||||
if (class_exists('\AKSRT\Settings\PaymentRuntime')) {
|
||||
@@ -40,55 +39,26 @@ class BalanceGateway implements GatewayInterface {
|
||||
$amount = round((float) ($order['amount'] ?? 0), 2);
|
||||
$order_number = (string) ($order['order_number'] ?? '');
|
||||
|
||||
// Prefer cash wallet when pay_balance_s is on.
|
||||
if (class_exists('\AKSRT\Credits\Balance') && \AKSRT\Credits\Balance::enabled()) {
|
||||
if ($user_id <= 0) {
|
||||
return ['success' => false, 'message' => __('请先登录', 'aksrt')];
|
||||
}
|
||||
$balance = \AKSRT\Credits\Balance::balance($user_id);
|
||||
if ($balance < $amount) {
|
||||
return ['success' => false, 'message' => __('余额不足', 'aksrt')];
|
||||
}
|
||||
$result = \AKSRT\Credits\Balance::deduct(
|
||||
$user_id,
|
||||
$amount,
|
||||
'order_payment',
|
||||
['type' => 'order', 'id' => 0, 'order' => $order_number],
|
||||
sprintf(__('订单 %s 支付', 'aksrt'), $order_number)
|
||||
);
|
||||
if (is_wp_error($result)) {
|
||||
return ['success' => false, 'message' => $result->get_error_message() ?: __('扣款失败', 'aksrt')];
|
||||
}
|
||||
return [
|
||||
'success' => true,
|
||||
'transaction_id' => 'BAL_' . ($order_number !== '' ? $order_number : (string) time()),
|
||||
'message' => __('余额支付成功', 'aksrt'),
|
||||
];
|
||||
if (!class_exists('\AKSRT\Credits\Balance') || !\AKSRT\Credits\Balance::enabled()) {
|
||||
return ['success' => false, 'message' => __('余额功能未启用', 'aksrt')];
|
||||
}
|
||||
|
||||
// Fallback: legacy points-as-balance (1 元 = 100 积分).
|
||||
if (!class_exists('\AKSRT\Credits\Credits')) {
|
||||
return ['success' => false, 'message' => __('积分系统未启用', 'aksrt')];
|
||||
if ($user_id <= 0) {
|
||||
return ['success' => false, 'message' => __('请先登录', 'aksrt')];
|
||||
}
|
||||
|
||||
$credits_cost = (int) ceil($amount * 100);
|
||||
$balance = \AKSRT\Credits\Credits::balance($user_id);
|
||||
if ($balance < $credits_cost) {
|
||||
$balance = \AKSRT\Credits\Balance::balance($user_id);
|
||||
if ($balance < $amount) {
|
||||
return ['success' => false, 'message' => __('余额不足', 'aksrt')];
|
||||
}
|
||||
|
||||
$result = \AKSRT\Credits\Credits::deduct(
|
||||
$result = \AKSRT\Credits\Balance::deduct(
|
||||
$user_id,
|
||||
$credits_cost,
|
||||
$amount,
|
||||
'order_payment',
|
||||
['order' => $order_number],
|
||||
['type' => 'order', 'id' => 0, 'order' => $order_number],
|
||||
sprintf(__('订单 %s 支付', 'aksrt'), $order_number)
|
||||
);
|
||||
|
||||
if (is_wp_error($result)) {
|
||||
return ['success' => false, 'message' => $result->get_error_message() ?: __('扣款失败', 'aksrt')];
|
||||
}
|
||||
|
||||
return [
|
||||
'success' => true,
|
||||
'transaction_id' => 'BAL_' . ($order_number !== '' ? $order_number : (string) time()),
|
||||
@@ -127,37 +97,20 @@ class BalanceGateway implements GatewayInterface {
|
||||
$user_id = (int) $order['user_id'];
|
||||
$amount = round((float) $amount, 2);
|
||||
|
||||
if (class_exists('\AKSRT\Credits\Balance') && \AKSRT\Credits\Balance::enabled()) {
|
||||
$result = \AKSRT\Credits\Balance::add(
|
||||
$user_id,
|
||||
$amount,
|
||||
'order_refund',
|
||||
['type' => 'order', 'order' => $order_number],
|
||||
sprintf(__('订单 %s 退款', 'aksrt'), $order_number)
|
||||
);
|
||||
if (is_wp_error($result)) {
|
||||
return ['success' => false, 'message' => $result->get_error_message() ?: __('退款失败', 'aksrt')];
|
||||
}
|
||||
return ['success' => true, 'refund_id' => 'BAL_REF_' . $order_number, 'message' => __('退款成功', 'aksrt')];
|
||||
if (!class_exists('\AKSRT\Credits\Balance') || !\AKSRT\Credits\Balance::enabled()) {
|
||||
return ['success' => false, 'message' => __('余额功能未启用', 'aksrt')];
|
||||
}
|
||||
|
||||
if (!class_exists('\AKSRT\Credits\Credits')) {
|
||||
return ['success' => false, 'message' => __('积分系统未启用', 'aksrt')];
|
||||
}
|
||||
|
||||
$credits_refund = (int) ceil($amount * 100);
|
||||
$result = \AKSRT\Credits\Credits::add(
|
||||
$result = \AKSRT\Credits\Balance::add(
|
||||
$user_id,
|
||||
$credits_refund,
|
||||
$amount,
|
||||
'order_refund',
|
||||
['order' => $order_number],
|
||||
['type' => 'order', 'order' => $order_number],
|
||||
sprintf(__('订单 %s 退款', 'aksrt'), $order_number)
|
||||
);
|
||||
|
||||
if (is_wp_error($result)) {
|
||||
return ['success' => false, 'message' => $result->get_error_message() ?: __('退款失败', 'aksrt')];
|
||||
}
|
||||
|
||||
return ['success' => true, 'refund_id' => 'BAL_REF_' . $order_number, 'message' => __('退款成功', 'aksrt')];
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user