续命打卡 App · 未打卡完整流程说明书
版本 V1.1 · 适用系统:Android App / 微信小程序 + PHP 后台 + 阿里云短信/语音 · 阅读对象:运营、客服、测试、家属联系人
版本更新记录
V1.1(2026-10-02)守护与火花
- 守护关系:机主生成邀请卡(72 小时有效)分享给好友,好友接受后成为守护人,双方各得积分奖励(默认 50 分/人,单用户每月上限 500 分,后台可配);
- 续火花:机主每日打卡后,守护人 24 小时内回应表情(👍/❤️/🌙)完成「互守」,连续互守天数计为火花 🔥;断一天熄灭,48 小时内可用 50 积分补燃(每月限 1 次);
- 守护树:火花驱动守护树生长(🌱→🌿→🌳→🌸→🍎),等级 ✨初燃 / 🔥连续 7 天 / 💎永恒 30 天 / 🏆传家 100 天;解除关系后树停止生长但永不枯死;
- 分享三件套:邀请卡 / 平安卡 / 果实成就卡(≥30 天解锁),支持分享给好友和朋友圈;
- 提醒方式:全部走站内(首页横幅 + 红点 + 页内提示),不使用微信订阅消息;
- 后台:新增「守护关系」管理页(列表 + 强制解除),积分规则新增 2 项(建立关系奖励、月度上限);
- 排查增强:呼入电话按非 1 键时,日志显式记录按键值(如
pressed key 6),便于排查。
V1.0(2026-10-01)首个正式版
- 核心「死人开关」闭环:服务器权威倒计时 → 超时进入宽限期(短信 + IVR 语音按 1 + App 通知三通道)→ 宽限超时触发碎片分发(短信 + 邮件 + 语音,领取码方案)→ 联系人凑齐门限在恢复页还原秘密;
- 多端:Android App + 微信小程序(注册/登录/打卡/设置/事件日志/积分中心);
- 积分体系:注册/邀请/签到/里程碑奖励,被动打卡与消息通道计费,卡密充值;
- 消息广播:后台发布公告,小程序首页横幅轮播展示;
- 用户反馈工单:小程序提交反馈,后台查看/回复/标记处理。
一、倒计时在哪里?关闭 App / 小程序后还运行吗?
一句话结论:倒计时的权威计时在服务器上,App 和小程序只是「显示器 + 操作入口」。用户关闭 App、关闭小程序、手机关机、甚至卸载 App,倒计时都一秒不停地正常运行,超时后宽限通知和碎片分发照样执行——这正是「死人开关」类产品的核心设计:判定必须发生在机主无法干预的地方。
权威计时在服务器
- 每次打卡后,服务器把新的
deadline(打卡截止)与 grace_deadline(宽限截止)写入数据库 vaults 表;
- 服务器定时任务
cron.php 每分钟巡检一次,把当前时间与 deadline 比对,自动推进状态机:超时 → GRACE(发三通道通知)→ 宽限也超时 → TRIGGERED(分发碎片);
- 整个判定过程完全不依赖任何客户端是否在线:哪怕手机丢了、没电了、App 被卸载,服务器照常推进;
- 唯一部署前提:生产环境的
cron.php 必须用 Linux crontab 或 Windows 计划任务保持每分钟调用,巡检停了状态机才会停。
客户端(App / 小程序)里的倒计时只是「显示器 + 本地闹钟」
| 客户端功能 | 实现方式 | 关闭 App / 小程序后 |
| 主界面实时倒计时 | 每秒刷新,显示的是服务器下发的 deadline | 停止显示(无所谓,只是界面) |
| 截止前的本地提醒通知 | App 用系统闹钟(AlarmManager)注册,不依赖 App 进程 | ✅ 仍会弹出提醒 |
| 重启手机后恢复提醒 | App 的开机广播接收器(BootReceiver)自动重设闹钟 | ✅ 重启后自动恢复 |
| 宽限期短信 + 语音电话 + 一键打卡链接 | 全部由服务器经阿里云/运营商发起 | ✅ 与客户端无关,永远有效 |
| 超时判定、进入宽限、触发分发 | 全部由服务器 cron 巡检推进 | ✅ 与客户端无关,永远有效 |
常见误解澄清:「我把 App 关了/把小程序删了,是不是就不会触发了?」——恰恰相反。关闭客户端只会让你收不到「主动提醒」,但服务器的倒计时照样走,超时后短信和电话依然会打给你;如果你是因为关机、停机、失联而没打卡,宽限期结束后碎片照样分发给联系人。想合法地暂停计时,唯一方式是主动使用「暂停监控」功能(状态 PAUSED)。
二、整体状态机(账号的 4 种状态)
| 状态 | 标识 | 含义 |
| ACTIVE监控中 | 绿色 | 正常计时。用户在 App 设置了「打卡间隔」(如 24 小时),每次打卡后重新倒计时。 |
| GRACE宽限期 | 黄色 | 已超过打卡截止时间,但还未到宽限截止。系统通过短信 + 电话 + App 通知三通道通知机主「立即确认存活」。 |
| TRIGGERED已触发 | 红色 | 宽限期也结束仍无任何打卡。判定机主失联/出事,不可撤回,立即把加密秘密的碎片分发给各位紧急联系人。 |
| PAUSED已暂停 | 蓝色 | 用户主动暂停监控(出差、住院等场景),不计时、不通知。 |
二、未打卡后的完整时间轴
示例:打卡间隔 24 小时、宽限期 12 小时。T0 = 上一次打卡时间。
T0 —— T0+24h
ACTIVE正常倒计时
App 主界面显示实时倒计时「距下次打卡还剩 xx:xx:xx」。临近截止时 App 会弹出本地通知提醒主动打卡。用户点击「打卡」按钮即回到 T0,一切重新开始。
T0+24h(超过打卡截止时间)
进入 GRACE 宽限期三通道同时通知机主
服务器定时任务(cron.php)巡检发现超时,立即:
- 把账号状态改为
GRACE,写入事件日志 ENTER_GRACE;
- 生成一个一次性被动打卡令牌(256 位随机数,仅在本次宽限期内有效);
- 同时通过 ① 短信 ② 语音电话 ③ App 推送 三种方式呼叫机主本人。
T0+24h —— T0+36h(宽限期内)
等待机主「被动打卡」
机主通过任一渠道确认,账号立即恢复 ACTIVE 并重新倒计时,事件日志记录 PASSIVE_CHECKIN(渠道)。三个渠道只需成功一个,其余渠道的链接/令牌同步失效。
T0+36h(宽限期也结束,仍无打卡)
TRIGGERED 触发分发不可撤回
系统判定机主失联,进入触发流程:
- 状态改为
TRIGGERED,记录触发时间,写事件日志 TRIGGERED;
- 给每一位紧急联系人发送:一条含「专属碎片」的短信 + 一通语音电话(读出其碎片编号);
- 给机主本人发最后一条告知短信「分发已执行」;
- 所有消息先落库
messages 表,发送失败自动重试,最多 10 次;
- 触发后 App 端「打卡」按钮锁死变红,提示「已触发分发,不可撤回」。
触发后任意时间
RECOVER联系人拼合碎片还原秘密
联系人打开恢复页 /r.php,多人凑齐门限数量(如 3 人中 2 人)的碎片后,网页还原出机主预先存放的加密内容(遗言、账号密码、嘱托等)。
四、宽限期三通道通知 · 具体内容
渠道 ① 提醒短信(发给机主本人)
【续命打卡】短信 · 发给机主 138****8888
【续命打卡】您已超过打卡时间!
原打卡截止:2026-09-28 08:00(北京时间)
宽限截止:2026-09-28 20:00(北京时间)
逾期未完成打卡,系统将把您保管的秘密分发给 3 位紧急联系人,不可撤回。
👉 点击链接一键确认存活(无需打开 App):
http://你的域名/checkin.php?t=a1b2c3…(一次性链接)
- 链接内含一次性令牌,打开页面点一下「我还活着,立即确认打卡」按钮即完成打卡,无需登录;
- 链接只能使用一次:再次打开会提示「该链接已使用过」;宽限期结束后链接自动过期;
- 确认页会显示账号尾号、原截止时间、宽限截止时间和剩余时间,防止误点钓鱼链接。
渠道 ② 语音电话(阿里云智能语音外呼,发给机主本人)
来电显示:平台语音真实号(如 0571-XXXXXXXX)
接通后语音播报(放音文件):
「续命打卡紧急提醒:您已超过打卡时间。确认您仍然安全,请在手机上按 1 键,按 1 后自动完成打卡。如需查看详情,请打开续命打卡 App。」
机主操作:
- 按 1 → 播放确认音 → 平台回执服务器 → 核销令牌 → 打卡成功 → 自动挂机;
- 按其他键 → 静默,10 秒超时后自动挂机;
- 什么都不按 → 10 秒超时自动挂机。
渠道 ③ App 推送通知(通知栏一键打卡)
⏰
⚠️ 宽限期提醒 · 请立即确认存活
已超过打卡时间,宽限截止 09-28 20:00,逾期将向 3 位联系人分发秘密且不可撤回。
立即打卡(中止分发)
- 不用打开 App,在通知栏直接点「立即打卡」按钮,后台静默请求服务器完成打卡,成功后再弹一条「✅ 已一键打卡成功」;
- 要求手机已授予通知权限(Android 13+ 首次启动会引导授权)。
五、触发后 · 紧急联系人收到的内容
联系人短信(每位联系人的碎片内容不同)
【续命打卡】短信 · 发给联系人甲 139****1111
【续命打卡】紧急通知
您的好友 张三(手机尾号 8888)已连续失联超过设定时限,其生前托付的秘密现已进入分发流程。
您是第 1 位保管人,您的专属恢复碎片为:
LIFECHECK-SHARD-V1 1 9f3c2a…(一串编码)
请妥善保管本碎片。集齐 2/3 块碎片后,打开恢复页还原秘密:
http://你的域名/r.php
同时还会接到一通语音电话,播报名义大意:
「续命打卡紧急通知:您的联系人张三已触发秘密分发,您是第 1 位碎片保管人,碎片编码已通过短信发送,请查收并妥善保管。」
碎片还原(Shamir 门限秘密共享)
- 秘密在保存时用 AES-256-GCM 加密,密钥再用 Shamir 算法拆成 N 片(如 3 片),需要凑够 M 片(如 2 片)才能还原;
- 少于 M 片 = 完全无法还原,服务器后台、数据库、管理员都看不到明文;
- 联系人在
/r.php 页面逐条粘贴碎片,凑够门限后立即在浏览器中显示明文;碎片错误或不匹配会明确提示;
- 机主若在触发前「打卡成功」,本次流程终止,碎片永不发出。
六、边界情况与常见问题
| 情况 | 系统行为 |
| 宽限期内机主才看到短信,点链接 | ✅ 链接仍有效(未过宽限截止、未使用),点确认即打卡成功。 |
| 同一个短信链接点第二次 | ❌ 提示「该链接已使用过」。令牌一次性核销,防重放。 |
| 电话里按了 2、3 等其它键 | 不算打卡,平台静默忽略,10 秒超时后自动挂机。后台「短信/语音记录」页的通话状态会显示「已接听·按8」。 |
| 三个渠道都通知了,会先打卡哪个? | 以最先到达的为准。其余渠道的令牌立即失效(同一令牌三渠道共用)。 |
| 手机没电 / 没网 / 停机 | 短信与语音由运营商触达,无需手机有网;App 推送需网络。消息发送失败自动重试最多 10 次,后台「消息记录」页可查看每条的发送状态与失败原因。 |
| 触发后还能不能撤回? | 不能。这是产品的核心安全设计:触发即代表机主可能已无法操作手机,任何撤回入口都可能被他人利用。App 内触发前所有「测试触发」都需二次确认。 |
| 触发后机主又出现了 | 账号保持 TRIGGERED 状态,需要联系管理员在后台核实情况后人工处理;已发出的碎片建议通知联系人作废。 |
| 宽限期短信/电话没收到 | 在后台「消息记录」页查看该条消息的投递状态与运营商回执错误码(如签名未报备、模板未审核、号码黑名单等)。 |
| 想暂停监控(住院手术、坐飞机等) | App 内「暂停监控」,状态变 PAUSED,期间不计时;回来后「恢复监控」重新倒计时。 |
七、多端支持:App / 微信小程序 / 网页均可打卡
核心结论:倒计时的权威计时在服务器(数据库 deadline 字段 + 每分钟巡检的 cron.php),App 只是客户端之一。用户在微信小程序里打卡、设置参数,与在 App 里操作完全等效,整个未打卡流程照常运行。
| 核心能力 | 实现位置 | 小程序可用 |
| 倒计时判定、超时进入宽限、触发分发 | 服务器 cron.php + sweep.php 定时巡检 | ✅ 与客户端无关 |
| 注册 / 登录 / 改密码(短信验证码) | 服务器 api.php(HTTP JSON + JWT) | ✅ 小程序 wx.request 直接调 |
| 打卡 / 暂停 / 恢复 / 设置间隔与联系人 | 服务器 api.php 同一批接口 | ✅ 完全等效 |
| 宽限期提醒短信 + 语音电话(按 1 打卡) | 服务器经阿里云发起,运营商触达 | ✅ 不受影响 |
| 碎片分发短信 / 语音、r.php 还原页 | 服务器 + 浏览器网页 | ✅ 不受影响 |
| 通知栏「一键打卡」按钮 | Android 系统通知(App 专属能力) | ❌ 小程序无此通道 |
小程序端的差异与弥补
- 少一条「App 推送」通道:小程序无法像 App 那样在通知栏弹「一键打卡」按钮。宽限期提醒改为依赖 短信链接 + 语音电话 两条兜底通道(这两条本来就更可靠,不依赖手机联网)。可选补充:小程序「订阅消息」发微信内提醒,但需用户逐次授权且需服务类目资质。
- 多端的打卡是互通的:同一账号,在 App 打卡、在小程序打卡、点短信链接打卡、电话里按 1——最终都是调用服务器同一个 checkin 接口,任意一端成功即恢复 ACTIVE,其余渠道的令牌同步失效。
- 关掉小程序 / 卸载 App 都不影响判定:倒计时永远在服务器上跑,客户端只是「显示器和操作入口」。
小程序上线的硬性前提
- 服务器必须部署在 HTTPS + 已备案域名 上,并在微信小程序后台配置 request 合法域名(开发期可在微信开发者工具勾选「不校验合法域名」临时调试);
- 小程序不能像 App 那样让用户自填局域网 IP,服务器地址在代码中固定为公网域名;
- 生产环境必须切换 MySQL、配置真实阿里云短信/语音参数(不能使用开发模式的 outbox 固定验证码)。
架构优势:由于后端是纯 HTTP API + 服务器端权威计时,未来增加 iOS App、网页版、甚至电话语音-only 用户(全程只用短信链接和电话按键)都不需要改动后端,只需新增前端壳。
八、守护与火花(V1.1 新增)
「死人开关」管的是极端失联场景,「守护与火花」管的是日常牵挂:让家人/好友每天都能感知到「TA 今天平安」。
核心玩法:互守点亮火花,火花养成守护树
- 建立守护:机主在小程序「守护与火花」页生成邀请卡(72 小时有效),转发给好友;好友接受后建立单向守护关系,双方各得积分奖励;
- 每日互守:机主当天完成打卡后,守护人在 24 小时内回应一个表情(👍 / ❤️ / 🌙),即完成当日「互守」;
- 火花累计:连续互守的天数计为火花值 🔥,断一天即熄灭;熄灭后 48 小时内可用 50 积分补燃一次(每月限 1 次);
- 守护树生长:火花值驱动守护树生长——🌱 幼苗(1 天)→ 🌿 枝叶(7 天)→ 🌳 大树(14 天)→ 🌸 开花(30 天)→ 🍎 结果(30+ 天且历史最高 ≥30);
- 解除关系后树不枯死:树停止生长但永远保留,家庭产品不做「清零惩罚」。
火花等级
| 连续互守天数 | 等级标识 | 名称 |
| 当天完成互守 | ✨ | 初燃之火 |
| 连续 7 天 | 🔥 | 连续之焰 |
| 连续 30 天 | 💎 | 永恒守护 |
| 连续 100 天 | 🏆 | 传家之宝 |
分享三件套
| 分享卡类型 | 触发时机 |
| 邀请卡 | 随时可分享,带 72 小时有效邀请码,好友接受即建立守护关系 |
| 平安卡 | 有机主打卡后可分享,展示「我今日已平安」+ 守护树当前状态 |
| 果实成就卡 | 历史最高连续互守 ≥30 天解锁,可分享「永恒守护」成就 |
设计原则(硬约束):不使用微信订阅消息(提醒全走站内:首页横幅 + 红点 + 页内提示);守护入口不进 tabBar(放「我的」页 + 首页卡片);文案禁止「不分享就受限」式诱导措辞;火花断签只停长不枯死。
九、管理员在后台能看到什么
- 事件日志:每个账号的
CHECKIN(主动打卡)、PASSIVE_CHECKIN(短信链接/电话按键/App通知)、ENTER_GRACE、TRIGGERED 等全量事件,含时间与渠道;
- 消息记录:每条短信/语音的接收号码、类型(验证码/宽限提醒/碎片分发)、状态(待发/成功/失败)、重试次数、运营商错误信息;
- 守护关系:全部守护关系的机主/守护人手机号、火花状态(燃烧中/待回应/已熄灭)、连续互守天数、历史最高天数,支持强制解除;
- 用户管理:账号状态、打卡间隔、宽限时长、联系人数量、当前倒计时;
- 客户端日志:App 自动上报的运行日志与崩溃信息,便于定位「用户说没收到通知」类问题;
- 后台地址
/admin/,默认账号 admin / admin123(生产环境务必修改)。
隐私承诺:用户存放的秘密全程 AES-256-GCM 加密,密钥经 Shamir 分片,服务器与管理员均无法查看明文;只有凑齐门限碎片的联系人才能在恢复页还原。
—— 续命打卡 · 让重要的托付永不丢失 ——