宝塔安装 · 微信发布 · 首页换图 · 寄养、相册与好物商城
给院长的配置与使用手册 · 2026 年 9 月 9 日
这是免建库 PHP 后台源码和原生微信小程序源码。解压到宝塔 PHP 网站后,打开 https://你的域名/admin 完成初始化。微信 AppID、AppSecret、支付资料和订阅模板都可以安装后在商家后台填写、修改。
| 你要做的事 | 在哪里做 |
|---|---|
| 客户、狗狗、余额、预约、商品、照片、订单 | 你的网站 /admin |
| 换首页大照片、页面内 Logo | 后台 → 首页图片 |
| 填写微信密钥、支付密钥、消息模板 | 后台 → 小院设置 |
| 小程序认证、备案、账号头像、服务类目、隐私指引、审核发布 | 微信公众平台的小程序账号 |
| 预览真机效果、上传小程序代码 | 电脑上的微信开发者工具 |
在线网页预览使用演示数据,只用来查看页面和操作效果;不连接你的服务器,不收取款项,也不发送微信提醒。演示数据刷新后会重置,各页面的演示数据独立。
已包含:独立后台、客户 UID 与狗狗 ID、隐私授权流程、寄养预约、入住日历、事件相册、商城入口开关、微信支付 API v3 接口、全额退款、私密交付凭证、订阅提醒、后台导出小程序包。
尚未完成真实微信和服务器联调。此环境没有可用 PHP;随包 PHP 集成测试未执行。没有微信发货信息自动上报、快递实时查询、部分退款、在线寄养套餐充值,也没有 Node 旧库自动迁移。发货信息需另外在微信公众平台维护。
v2.7.0 安装页使用 no-referrer 策略,浏览器的普通表单 POST 会把 Origin 变成 null,随后被本站来源校验拒绝。截图中的报错发生在安装码验证之前。这是程序配置冲突,不是数据库或目录权限提示。
本版仅在安装页改用 same-origin,并加同样的页面策略;保留安装码、CSRF、Cookie 和严格来源校验。真正的外站来源仍会被拒绝,null 来源会提示重新打开安装页。依据:Fetch 标准的 Origin 生成规则。
https://pet.qh1001.xin/admin。页面底部应显示“安装页 v2.7.1”;看到这个标记后再填写。补丁只更新 install/index.php 和 app/App.php,不含 storage 或 install/package.php。后者保留原有安装码校验资料。如果仍显示旧版本,确认解压路径正确,再刷新;必要时在宝塔重载本站 PHP。
完整包已同步修复,同样沿用原安装码。已经完成安装的站点不应重新初始化;保留完整 storage 即可。
维护人员可运行 MIDAN_PHP_BIN=/path/to/php node tests/http.mjs;用例使用临时站点和测试安装码。单独观察浏览器行为可运行 node tests/installer-policy-server.mjs,在本机浏览器访问 http://127.0.0.1:8767/old 与 http://127.0.0.1:8767/fixed,分别点击“提交测试”。后者是纯来源策略实验,不代替 PHP 安装测试。
storage 文件夹,保存客户、订单、照片和设置。你截图中的 PHP 8.2、HTTPS、图片和压缩扩展已经通过检查。备份当前未完成安装的程序,再把新版完整包解压到 /www/wwwroot/pet.qh1001.xin,覆盖同名程序文件。确保这一层直接看到 index.php、admin、api、app 和 install,不要多套目录。
只覆盖程序;如果站点已产生客户、余额或订单,不适用这次全新安装流程,见第⑥节。解压后把安装 ZIP 移走或删除,只保留解压出的程序。安装码文本保留在自己的电脑,不要上传。
https://pet.qh1001.xin/admin,会自动进入安装页。/admin 或 /api。设置管理员账号和 12—128 位密码,两次密码一致后点安装。/admin。本站安装入口自动关闭,安装码以后不用再填。“小院设置”里填写店名、电话、地址、每晚预约上限(默认 5 只)、微信 AppID / AppSecret、订阅模板和支付资料。商城默认隐藏,准备好商品和自提 / 配送方式后再打开。主页大图和页面内 Logo 在“首页图片”修改。
app/bootstrap.php 和 install/index.php;再刷新,必要时重载本站 PHP。使用小程序账号登录微信公众平台。按该账号当前页面完成主体信息、所需认证/备案、服务类目、隐私保护指引和相关资质。寄养按实际宠物服务选择类目;鲜食、玩具、用品按真实销售内容选择对应经营范围,不能一律当作鲜食类目。
具体可选类目、主体资格和审核材料以该账号当前页面为准,本手册不保证某个类目一定对你的主体开放。本次未能读取微信官方文档页面来逐项核验最新平台要求;文末提供官方入口,发布前请核对。
| 微信设置项 | 本例填写 | 说明 |
|---|---|---|
| request 合法域名 | https://pet.qh1001.xin | 客户登录、资料、相册、预约、订单和本版图片二进制上传 |
| uploadFile 合法域名 | https://pet.qh1001.xin | 可同时配置同一域名;本版上传通过 wx.request |
| downloadFile 合法域名 | https://pet.qh1001.xin | 图片访问、预览与下载所用域名 |
| socket、UDP、TCP、业务域名 | 本版没有对应功能要求 | 无需为本程序额外填写 |
域名应满足微信平台当前校验要求、证书完整有效,与后台“HTTPS 域名”一致。不要填写服务器 IP、后台路径或旧站域名。真机验收时开启域名和 HTTPS 校验,不能只依赖开发工具的跳过校验选项。
在小程序账号的开发配置中获取实际 AppID 和 AppSecret,填入米蛋后台 → 小院设置 → 微信配置。AppID 是小程序身份;AppSecret 是服务端密钥。后台“已配置 / 就绪”表示配置格式已具备,不代表已通过真实登录或支付测试。
密钥留空表示保留已保存的值,不是清空。保存后不回显完整密钥。更换同一账号的密钥、证书、消息模板可在后台进行;已有微信客户时直接换 AppID 会被阻止,避免客户身份变乱。商户号也受旧订单和售后限制。
thing1、time2。不是每次上传都能无条件推送。一次性订阅受用户授权和可用次数约束。一场散步的多张照片属于一个事件,发布时只通知这个狗狗 ID 绑定的主人;后来补图、调整封面或改公开范围不重复推送。未能发送微信提醒时,已经保存的相册和订单仍可以在小程序查看。
| 后台字段 | 从哪里获取 / 注意什么 |
|---|---|
| 小程序 AppID | 必须是客户实际使用的小程序,并按微信支付要求绑定商户 |
| 商户号 | 你的微信支付商户平台 |
| 商户证书序列号 | 与当前商户 API 证书对应的序列号 |
| 商户私钥 | 完整 PEM 私钥文本,包含 BEGIN / END;不是文件名或文件路径 |
| 微信支付公钥 ID / 平台证书序列号 | 与你填写的平台验签公钥或证书对应,不能和商户证书序列号混填 |
| 微信支付公钥 / 平台证书 | 微信支付提供的完整 PEM 公钥或平台证书文本 |
| API v3 密钥 | 商户平台配置的 32 字节密钥;不是 AppSecret |
| 支付回调地址 | 程序根据域名生成:https://pet.qh1001.xin/api/wechat-pay-notify.php |
支付成功以服务端验证后的微信交易结果为准;小程序付款弹窗完成不直接把订单改成已付款。出现网络异常时,先在对应订单点击微信对账,避免重复收款或退款。本版是全额原路退款,实际到账以微信结果为准。
project.config.json 的 midan-miniprogram 目录,不是只选择内层 miniprogram 文件夹。以后只换首页图片、商品、相册或同一账号的服务端密钥,不需要手改小程序源码。这次从旧版升级至支持公开预约日历的 2.6 界面,仍要重新上传并发布小程序代码。以后变更接口域名或 AppID,也要重新下载对应发布包并发布。
两张图分别管理,恢复其中一张不会重置另一张。每张支持 JPG、PNG、WebP,最多 5 MB、800 万像素;超出时先缩小尺寸。上传失败会保留已选内容,重试时已成功上传的图不会重复上传;离开页面前没有保存的更换不会生效。
这是向所有访客公开的首页宣传区域,请单独选择适合公开的图片。系统不允许直接挪用客户头像、宠物档案、相册或订单凭证的旧链接。相册管理与首页宣传分开,避免改首页时改变狗狗照片的原可见范围。
首页 → 小窝预约日历。所有人都能打开,不需要先登录;日历按月显示每天已预约的狗狗数量和剩余名额。点某一天,再点“从这天开始预约”,登录后选择狗狗与离店日期。
打开 https://你的域名/admin → 小院设置 → 每晚预约上限(只) → 保存。新安装默认 5 只,可以改成 1–100 的整数,不需要修改源码或重新发布小程序。已有安装保留原容量;升级后如需统一为 5,请在这里手动改成 5。
| 情况 | 名额怎样计算 |
|---|---|
| 同一订单带两只狗 | 每一晚占 2 个名额,不是只算一笔订单。 |
| 9 月 10 日入住、13 日离店 | 占 10、11、12 日三晚,13 日当晚可给下一位预约。 |
| 待确认、已确认、正在入住 | 都占预约名额。待确认只占名额,不预留余额;确认后才预留余额。 |
| 取消 / 拒绝 | 待确认可由客户直接取消;已确认的取消申请须商家处理。只有实际取消或拒绝才释放名额。 |
| 一晚只剩 1 位,客户带 2 只 | 包含这一晚的整段预约不能提交,即使其他日期空位足够。 |
| 多人同时预约 | 服务器在同一个独占文件锁事务中检查名额并写入预约,不能只依赖客户端按钮。并发回归用例已附,需在 PHP 环境执行。 |
| 未按时接走 | 在住订单即使已超过计划离店日,也继续占用今天的名额。接走后及时办理离店;不自动推定未来延住天数。 |
| 调低上限 | 新值不能低于当前实际在住数和任何未来日期的已占位数(含待确认);冲突会显示具体日期。 |
公开日历只显示数量,不返回客户姓名、手机号、客户 UID、预约编号、狗狗档案或习性备注。商家“谁来小住”的正式日历仍只排已确认 / 在住 / 已离店档期,可以点具体狗狗查看私密手帐;待确认预约在预约管理处理,也已占前台名额。
日历支持下拉刷新,每次打开重新读取。数字是查询时的余位,提交时服务器会再次检查;如果别人先订走最后一个名额,会提示重新选日期,不会显示预约成功。网络异常时不把未知余位当作空房,也不会继续开放提交。
从旧版升级,备份后更新服务器源码;在后台重新下载小程序发布包,使用微信开发者工具上传,审核并发布,客户才会看到新日历。之后仅修改上限,无需再审核代码。安装与原数据目录保持不变,不要删除私有数据目录或主密钥。
GET /api/index.php?route=%2Fapi%2Fpublic%2Favailability&start=2026-09-10&end=2026-09-13参数为 YYYY-MM-DD,结束日不含,单次 1–93 天(预约本身最多 90 晚)。返回 start, end, today, capacity, days;每项只含 date, booked, remaining, full。北京时间定义“今天”,无登录要求;响应禁止缓存。实际日期按需替换。
后台 → 客户与狗狗 → 给客户开档,填写称呼、联系电话、狗狗名字和初始寄养晚数。把一次性绑定码交给主人;主人在小程序微信登录后绑定,才能看到这个旧档案的余额和狗狗。绑定码重新生成后,旧码失效;不要替同名狗狗随意换主人。
每位客户有只读 UID,每只狗狗有独立 ID。改名字、头像不会改变 ID;绑定已有商家档案后,以绑定后的档案 UID 为准。上传头像、使用照片前按微信隐私状态展示授权;拒绝时不继续读取和上传图片。隐私同意、相册公开同意、订阅提醒是三个不同选择。
本版按狗狗 × 晚数计费,不是按自然日显示天数自动扣款。例如 9 月 1 日入住、9 月 4 日离店,一只狗计 3 晚,两只狗计 6 晚。待确认预约不占用余额;确认后预留晚数,取消时释放,办理离店后才核销一次。充值由商家在线下收款后录入晚数和原因。
| 内容 | 谁能看 |
|---|---|
| 公开事件相册 | 所有访客;提醒只针对该狗狗绑定主人 |
| 仅给主人相册 | 对应主人与商家 |
| 狗狗习性与商家注意事项 | 只给商家 |
| 发货、自提、完成凭证 | 本单客户与商家 |
| 首页宣传大图和 Logo | 所有访客 |
公开相册不能放商家的私密备注或客户地址;“相册说明”公开后同样人人可见。主人撤回公开授权后,公开接口不再展示其相册;已被别人看过或保存过的照片无法远程收回。
在“好物货架”添加商品图片、名称、价格、库存和说明;玩具、用品不必填食品专用的保存与保质期字段。商城开关在小院设置,隐藏后客户不能新下单,但已有订单不会消失。
商家“订单管理”和客户“我的订单”都分寄养与商品。商品已付款后再发货或确认自提;配送需填真实物流单号,可加照片或说明作为凭证。已保存的凭证可在相应订单补改,不会进入宣传相册,也不重复核销寄养晚数。
物流记录为商家手动填写,客户能查看历史更新;不是快递公司实时接口。需要退款时先处理实际退货交接,再在后台确认全额退款。网络不确定时先对账,不用另建退款单重复操作。
这次 v2.7 是免建库的全新安装版,针对你当前还没完成初始化的站点。旧版要求的站外文件夹不再使用;不用为了新版去创建它,也不用手动导入数据。
v2.0—2.6 使用 SQLite,本版改为数据文件,没有自动迁移旧 SQLite / Node 数据。已有真实资料时,应保留完整原程序、站外数据目录和原配置,迁移后再切换。不要删除旧库来绕过提示,也不要创建同名客户代替旧 UID。
storage。里面的 state.php 是客户 / 订单等记录,config.php 含加密主密钥,uploads 保存照片;必须一起保留。客户数据仍然需要长期保存;“免建库”指不需要数据库服务或数据库设置,不表示数据可以删除。数据文件损坏或安装后缺失时,程序会报错,不会自动创建空白记录覆盖。
宝塔计划任务每 5 分钟执行一次下面命令,处理超时订单、对账、待发送提醒和过期会话。将版本和网站路径换成实际值;运行用户须能写入本站 storage。
/www/server/php/82/bin/php /www/wwwroot/pet.qh1001.xin/tools/cron.php忘记商家密码时在宝塔终端运行下面命令,按提示输入两次新密码。成功后旧商家登录失效。
/www/server/php/82/bin/php /www/wwwroot/pet.qh1001.xin/tools/reset-password.php --username=adminv2.7.0 的 110 项前端回归检查通过;本次安装修复没有重新执行这组业务前端测试,覆盖隐私授权逻辑、相册排序、订单入口、账号切换、首页换图和预约日历。这些使用本地 JavaScript 与明确的模拟微信响应。
本环境没有 PHP,新增文件存储和真实 HTTP 安装测试未执行,也没有微信真机联调。新增 tests/store.php 的 10 个用例,覆盖事务回滚、唯一订单、会话、文件保护、损坏拒绝及 4 进程并发;既有业务和 HTTP 安装用例已改为文件版。安装页会在你的服务器上实际检测文件读写和替换,但不能代替业务与支付验收。
未新增浏览器视觉实测。手册内图片和 320 / 390 宽度记录来自 v2.5;v2.6 的网页装载与模拟容量检查是历史记录。本版没有更改小程序布局,不能据此承诺所有手机无重叠。
| 现象 | 先处理 |
|---|---|
| 打开网站还是默认欢迎页 | 检查根目录、默认文档 index.php、旧 index.html 和本站旧反向代理。 |
| /admin 打不开或显示 PHP 源码 | 网站须启用 PHP 8.2+ 并正确解析 PHP,不能当静态站托管;先修 PHP 配置。 |
| 仍提示站外私有目录 | 这是旧版页面,确认 v2.7 覆盖到了当前站点。新版不再需要站外目录,也不需要改 open_basedir。 |
| 上传出现 413 / 图片太大 | 压缩到单图 ≤5 MB、≤800 万像素;检查 Nginx 请求体限制和 PHP 配置,建议 client_max_body_size 与 post_max_size 至少 8m。 |
| 换图保存成功但首页没变 | 确认小程序已升级本版、连接同一域名,再重新进入首页或下拉刷新。网页演示与正式服务的数据不相通。 |
| 过一会儿图片打不开 | 受控上传图片链接有效期约 5 分钟,刷新页面获取新链接;检查 HTTPS、系统时间与域名设置。后台持久保存的是图片编号,不是临时链接。 |
| 仅给主人切不回公开 | 编辑原事件;检查该狗狗对应客户是否已经同意公开。缺少同意时不是按钮故障。 |
| 开发工具能用,手机不行 | 检查实际 AppID、发布包接口域名、合法域名、证书链、账号权限和隐私声明;不要靠跳过校验来验收。 |
| 付款后仍显示待支付 | 先检查回调可达和签名配置,再点击订单微信对账,不要重新创建或手动标已付款。 |
| 上传成功却没微信提醒 | 查看发送记录:模板、字段类型、AppID、主人授权和剩余次数;保存照片不等于微信发送成功。 |
| 重装后旧客户找不到 | 停止继续写入,恢复完整网站和 storage;旧 SQLite 版恢复其原始配置和数据目录,不要新建同名账户代替旧档案。 |
生产运行不需要 Node。以下 Node 命令仅用于测试。PHP 测试使用临时数据文件与明确的微信模拟适配器,不访问真实支付账号。
node tests/privacy-public.mjs
node tests/native-events.mjs
node tests/event-ui.mjs
node tests/calendar.mjs
node tests/ui.mjs
node tests/home-session.mjs
node tests/appearance-ui.mjs
node tests/availability.mjs
php tests/store.php
php tests/wechat.php
php tests/integration.php
php tests/event-notifications.php
php tests/logistics-events.php
php tests/appearance.php
MIDAN_PHP_BIN=/www/server/php/82/bin/php node tests/http.mjsPHP 命令须使用装好必要扩展的 PHP 8.2+;如命令行 PHP 不同,请用完整可执行文件路径。先在测试环境运行并保留结果,再做真实微信联调。
以下为官方文档入口,便于你在发布时按账号当前要求核对;本次无法完整读取这些页面,不将其列为已完成的最新规则核验。