From db0d63b99f62722425da1e05fb1144dfc35cdeec Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 18 Sep 2026 17:26:50 +0800 Subject: [PATCH] =?UTF-8?q?fix(pay):=20=E4=BC=9A=E5=91=98=E5=8D=A1?= =?UTF-8?q?=E5=AF=86=E5=8D=95=E5=AF=86=E7=A0=81=E9=BB=98=E8=AE=A4=E5=85=B3?= =?UTF-8?q?=E9=97=AD=EF=BC=8C=E5=8D=A1=E5=AF=86=E7=9B=92=E4=B8=8E=E5=85=B6?= =?UTF-8?q?=E4=BB=96=E5=BC=B9=E7=AA=97=E4=B8=80=E8=87=B4=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=8D=A1=E5=8F=B7+=E5=AF=86=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 会员购买/续费弹窗卡密盒此前仅显示卡密输入,与其他两个弹窗(卡号+密码) 不一致。根因是 pay_vip_pass_charge_only_password 的默认值偏离参考主题: - PaymentRuntime:vip 类型 only_password 由「未设置即视为开启」改为 !empty(),与其他两类型同构(参考主题 default false) - ChargeCard:get_public_options 的 vip 回退值 only_password true→false - SchemaPayment + recharge.js:会员卡密单密码模式开关 default true→false - 契约测试同步锁定默认关闭与无 isset 回退 - admin SPA 重新构建 已保存过设置且该键被持久化为开启的站点,需在后台「余额充值 → 卡密 兑换 → 会员卡密单密码模式」手动关闭一次。 --- assets/admin/src/schema/sections/payment/recharge.js | 2 +- src/Admin/Schema/SchemaPayment.php | 2 +- src/Payment/ChargeCard.php | 2 +- src/Settings/PaymentRuntime.php | 3 ++- tests/widget-system/card-pass-modal-redeem.test.cjs | 6 +++++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/assets/admin/src/schema/sections/payment/recharge.js b/assets/admin/src/schema/sections/payment/recharge.js index 02b04182..3925803e 100644 --- a/assets/admin/src/schema/sections/payment/recharge.js +++ b/assets/admin/src/schema/sections/payment/recharge.js @@ -112,7 +112,7 @@ export const rechargeSchema = { { key: 'points_pass_exchange_only_password', label: '积分卡密单密码模式', type: 'switch', default: false, dependsOn: { key: 'points_pass_exchange_s', value: true }, help: '积分卡密仅需输入密码,不需要卡号' }, { key: 'pay_vip_pass_charge_s', label: '启用卡密兑换会员功能', type: 'switch', default: false, help: '开启后用户可在会员购买/续费弹窗选择「卡密」渠道,使用会员卡密直接兑换会员' }, { key: 'pay_vip_pass_charge_desc', label: '卡密兑换会员说明', type: 'textarea', default: '', rows: 2, dependsOn: { key: 'pay_vip_pass_charge_s', value: true }, help: '用户使用卡密兑换会员时显示的内容,建议为提醒事项、兑换协议等,支持HTML代码' }, - { key: 'pay_vip_pass_charge_only_password', label: '会员卡密单密码模式', type: 'switch', default: true, dependsOn: { key: 'pay_vip_pass_charge_s', value: true }, help: '会员卡密仅需输入密码,不需要卡号' }, + { key: 'pay_vip_pass_charge_only_password', label: '会员卡密单密码模式', type: 'switch', default: false, dependsOn: { key: 'pay_vip_pass_charge_s', value: true }, help: '会员卡密仅需输入密码,不需要卡号;默认关闭,会员卡需输入卡号和密码(与其他卡密兑换一致)' }, ], }, { diff --git a/src/Admin/Schema/SchemaPayment.php b/src/Admin/Schema/SchemaPayment.php index 997503c5..25856197 100644 --- a/src/Admin/Schema/SchemaPayment.php +++ b/src/Admin/Schema/SchemaPayment.php @@ -163,7 +163,7 @@ class SchemaPayment { ['key' => 'points_pass_exchange_only_password', 'label' => '积分卡密单密码模式', 'type' => 'switch', 'default' => false, 'dependsOn' => ['key' => 'points_pass_exchange_s', 'value' => true], 'help' => '积分卡密仅需输入密码,不需要卡号'], ['key' => 'pay_vip_pass_charge_s', 'label' => '启用卡密兑换会员功能', 'type' => 'switch', 'default' => false, 'help' => '开启后用户可在会员购买/续费弹窗选择「卡密」渠道,使用会员卡密直接兑换会员'], ['key' => 'pay_vip_pass_charge_desc', 'label' => '卡密兑换会员说明', 'type' => 'textarea', 'default' => '', 'rows' => 2, 'dependsOn' => ['key' => 'pay_vip_pass_charge_s', 'value' => true], 'help' => '用户使用卡密兑换会员时显示的内容,建议为提醒事项、兑换协议等,支持HTML代码'], - ['key' => 'pay_vip_pass_charge_only_password', 'label' => '会员卡密单密码模式', 'type' => 'switch', 'default' => true, 'dependsOn' => ['key' => 'pay_vip_pass_charge_s', 'value' => true], 'help' => '会员卡密仅需输入密码,不需要卡号'], + ['key' => 'pay_vip_pass_charge_only_password', 'label' => '会员卡密单密码模式', 'type' => 'switch', 'default' => false, 'dependsOn' => ['key' => 'pay_vip_pass_charge_s', 'value' => true], 'help' => '会员卡密仅需输入密码,不需要卡号;默认关闭,会员卡需输入卡号和密码(与其他卡密兑换一致)'], ]], ['key' => 'points-exchange', 'title' => '余额兑换积分', 'fields' => [ ['key' => 'pay_balance_points_exchange_s', 'label' => '启用余额兑换积分', 'type' => 'switch', 'default' => false, 'dependsOn' => ['key' => 'pay_balance_s', 'value' => true]], diff --git a/src/Payment/ChargeCard.php b/src/Payment/ChargeCard.php index 8c637cb8..18c6842c 100644 --- a/src/Payment/ChargeCard.php +++ b/src/Payment/ChargeCard.php @@ -131,7 +131,7 @@ class ChargeCard { $types = [ 'balance' => ['enabled' => false, 'desc' => '', 'only_password' => false], 'credits' => ['enabled' => false, 'desc' => '', 'only_password' => false], - 'vip' => ['enabled' => false, 'desc' => '', 'only_password' => true], + 'vip' => ['enabled' => false, 'desc' => '', 'only_password' => false], ]; if ($channel_on && class_exists('\AKSRT\Settings\Settings')) { diff --git a/src/Settings/PaymentRuntime.php b/src/Settings/PaymentRuntime.php index 6b192adb..55f536b8 100644 --- a/src/Settings/PaymentRuntime.php +++ b/src/Settings/PaymentRuntime.php @@ -124,7 +124,8 @@ class PaymentRuntime { 'vip' => [ 'enabled' => !empty($settings['pay_vip_pass_charge_s']), 'desc' => sanitize_textarea_field((string) ($settings['pay_vip_pass_charge_desc'] ?? '')), - 'only_password' => !isset($settings['pay_vip_pass_charge_only_password']) || !empty($settings['pay_vip_pass_charge_only_password']), + // 默认非单密码(卡号+密码),对齐参考主题 pay_vip_pass_charge_only_password 默认 false。 + 'only_password' => !empty($settings['pay_vip_pass_charge_only_password']), ], ], 'points_exchange' => [ diff --git a/tests/widget-system/card-pass-modal-redeem.test.cjs b/tests/widget-system/card-pass-modal-redeem.test.cjs index 7cfcd7e9..849aad44 100644 --- a/tests/widget-system/card-pass-modal-redeem.test.cjs +++ b/tests/widget-system/card-pass-modal-redeem.test.cjs @@ -146,7 +146,11 @@ test('REST 契约:type 必填(balance/vip/credits),无空类型自动识 test('后端类型闸门:三个独立开关各约束自己的类型', () => { assert.match(chargeCard, /'balance' => \['enabled' => false, 'desc' => '', 'only_password' => false\]/); assert.match(chargeCard, /'credits' => \['enabled' => false, 'desc' => '', 'only_password' => false\]/); - assert.match(chargeCard, /'vip'\s+=> \['enabled' => false, 'desc' => '', 'only_password' => true\]/); + assert.match(chargeCard, /'vip'\s+=> \['enabled' => false, 'desc' => '', 'only_password' => false\]/); + // 会员单密码默认关闭(对齐参考主题 default false):未显式开启时卡密盒显示卡号+密码。 + assert.doesNotMatch(chargeCard, /'only_password' => true/); + assert.match(read('src', 'Settings', 'PaymentRuntime.php'), /'only_password' => !empty\(\$settings\['pay_vip_pass_charge_only_password'\]\),/); + assert.doesNotMatch(read('src', 'Settings', 'PaymentRuntime.php'), /!isset\(\$settings\['pay_vip_pass_charge_only_password'\]\)/); assert.match(chargeCard, /卡密兑换余额功能未开启/); assert.match(chargeCard, /卡密兑换积分功能未开启/); assert.match(chargeCard, /卡密兑换会员功能未开启/);