prepare('SELECT password FROM ' . tn('users') . ' WHERE id = ?'); $stmt->execute([$admin['id']]); $hash = $stmt->fetchColumn(); if (!password_verify($cur, $hash)) { $err = '当前密码错误。'; } elseif (strlen($new) < 6) { $err = '新密码至少 6 位。'; } elseif ($new !== $new2) { $err = '两次输入的新密码不一致。'; } else { $newHash = password_hash($new, PASSWORD_DEFAULT); db()->prepare('UPDATE ' . tn('users') . ' SET password = ? WHERE id = ?') ->execute([$newHash, $admin['id']]); $msg = '管理员密码已修改。'; } } if (isset($_POST['savesmtp'])) { verifyCsrf(); foreach (['smtp_host', 'smtp_port', 'smtp_enc', 'smtp_user', 'smtp_pass', 'smtp_from', 'smtp_fromname', 'notify_emails'] as $k) { saveSetting($k, trim((string) ($_POST[$k] ?? ''))); } $msg = 'SMTP 配置已保存!'; } if (isset($_POST['saveabout'])) { verifyCsrf(); saveSetting('mall_about', trim((string) ($_POST['mall_about'] ?? ''))); $msg = '商城介绍已保存!'; } if (isset($_POST['savepoints'])) { verifyCsrf(); saveSetting('points_enabled', isset($_POST['points_enabled']) ? '1' : '0'); saveSetting('points_sign', max(0, (int) ($_POST['points_sign'] ?? 0))); saveSetting('points_invite', max(0, (int) ($_POST['points_invite'] ?? 0))); $msg = '积分设置已保存'; } if (isset($_POST['savepay_ali'])) { verifyCsrf(); saveSetting('pay_alipay_enabled', isset($_POST['pay_alipay_enabled']) ? '1' : '0'); saveSetting('pay_alipay_appid', trim((string) ($_POST['pay_alipay_appid'] ?? ''))); saveSetting('pay_alipay_private_key', trim((string) ($_POST['pay_alipay_private_key'] ?? ''))); saveSetting('pay_alipay_public_key', trim((string) ($_POST['pay_alipay_public_key'] ?? ''))); saveSetting('pay_alipay_sandbox', isset($_POST['pay_alipay_sandbox']) ? '1' : '0'); $msg = '支付宝配置已保存!'; } if (isset($_POST['savepay_wx'])) { verifyCsrf(); saveSetting('pay_wechat_enabled', isset($_POST['pay_wechat_enabled']) ? '1' : '0'); saveSetting('pay_wechat_mch_id', trim((string) ($_POST['pay_wechat_mch_id'] ?? ''))); saveSetting('pay_wechat_api_key', trim((string) ($_POST['pay_wechat_api_key'] ?? ''))); saveSetting('pay_wechat_appid', trim((string) ($_POST['pay_wechat_appid'] ?? ''))); $msg = '微信支付配置已保存!'; } if (isset($_POST['savefavicon']) || isset($_POST['delfavicon'])) { verifyCsrf(); if (!$isAdmin) { $err = '客服账号仅可查看,如需操作请联系管理员。'; } elseif (isset($_POST['delfavicon'])) { $old = getSetting('favicon', ''); if ($old && file_exists(__DIR__ . '/../' . $old)) { @unlink(__DIR__ . '/../' . $old); } saveSetting('favicon', ''); $msg = '已恢复默认图标。'; } else { if (empty($_FILES['favicon_file']) || $_FILES['favicon_file']['error'] !== UPLOAD_ERR_OK) { $err = '请选择要上传的 .ico 文件。'; } else { $f = $_FILES['favicon_file']; $ext = strtolower(pathinfo($f['name'], PATHINFO_EXTENSION)); if ($ext !== 'ico') { $err = '仅支持 .ico 格式的图标文件。'; } elseif ($f['size'] > 256 * 1024) { $err = '文件过大,请控制在 256KB 以内。'; } else { // 校验 ICO 文件头:00 00 01 00 $head = file_get_contents($f['tmp_name'], false, null, 0, 4); if ($head !== "\x00\x00\x01\x00") { $err = '文件内容不是有效的 ICO 图标(文件头校验失败)。'; } else { $dest = __DIR__ . '/../assets/favicon.ico'; if (!move_uploaded_file($f['tmp_name'], $dest) && !copy($f['tmp_name'], $dest)) { $err = '保存失败,请检查 assets/ 目录写入权限。'; } else { saveSetting('favicon', 'assets/favicon.ico'); $msg = '网站图标已更新,刷新浏览器即可看到(若未变请强制刷新清缓存)。'; } } } } } } $testResult = null; if (isset($_POST['testmail'])) { verifyCsrf(); $to = trim($_POST['test_to'] ?? ''); if (!filter_var($to, FILTER_VALIDATE_EMAIL)) { $err = '请填写有效的测试收件邮箱。'; } else { $cfg = smtpConfig(); $body = '
' . '

[' . h(SITE_NAME) . '] SMTP 测试邮件

' . '

这是一封由商城后台发送的测试邮件,若你收到了它,说明 SMTP 配置正确。

' . '

发送时间:' . date('Y-m-d H:i:s') . '

'; $testResult = fnwSendMail($to, '[' . SITE_NAME . '] SMTP 测试邮件', $body); if ($testResult['ok']) { $msg = '测试邮件已发送,请查收(含 SMTP 会话日志见下方)。'; } else { $err = '发送失败:' . ($testResult['error'] ?? '未知错误'); } } } $cfg = smtpConfig(); adminHeader('设置', 'settings'); ?>

设置

修改管理员密码

当前管理员:

商城介绍(前台首页展示)

这段文字会显示在商城首页「关于商城」区块,向访客介绍你的商城。留空则不显示该区块。

站点名称

该名称会显示在浏览器标题、页面顶部、邮件通知等位置。

网站图标(Favicon)

上传 .ico 格式图标(建议 16×16 或 32×32,最大 256KB),将显示在浏览器标签页。留空则使用默认图标。

当前图标 当前图标( 当前:默认图标

积分系统设置

开启后,用户可在前台「每日签到」获取积分、通过邀请链接邀请好友获得积分;商品可设置「积分价」,结算时选择「积分支付」。

SMTP 邮件配置

用于:用户提交工单后通知处理人员、处理回复通知用户。常见配置:QQ 邮箱 smtp.qq.com / 端口 465 / 加密 SSL / 密码填「授权码」。


发送测试邮件

SMTP 会话日志:

支付接口配置

配置后用户下单可选择对应支付方式。未启用(或未填密钥)的渠道不会在前台显示。沙箱模式仅支付宝支持,仅用于联调,正式上线请关闭。

支付宝(电脑网站支付 · RSA2)


微信支付(Native 扫码支付 · V3)