HarmonyOS 账号注销闭环实战:身份校验、数据处理与结果留痕

HarmonyOS 账号注销闭环实战:身份校验、数据处理与结果留痕 HarmonyOS 账号注销闭环实战身份校验、数据处理与结果留痕账号注销不是退出登录也不是清空本地 token。真正上线时注销链路会牵涉身份校验、风险告知、设备解绑、个人信息处理、订单或资产保留规则、结果通知和审计记录。任何一步没设计清楚都可能出现“用户以为注销成功但后台仍可登录”“误点后无法恢复”“删除失败没有补偿记录”这类问题。这篇文章从客户端工程视角整理一套 HarmonyOS 应用的注销闭环。示例代码用 ArkTS 风格表达服务端接口用契约占位重点是让页面、账号服务、数据处理和审计记录之间边界清楚。1. 注销链路先区分三件事很多项目把退出登录、解绑设备、注销账号混在一起后期很难维护。行为结果是否可逆退出登录清除当前设备登录态可重新登录解绑设备当前设备不再接收账号相关能力可重新绑定注销账号账号进入删除或匿名化流程通常不可逆或有冷静期因此注销入口必须比退出登录更慎重二次确认、身份校验、风险说明和结果留痕都不能省。2. 资料和版本边界注销涉及个人信息处理建议同步核对官方资料、隐私政策和项目账号协议。资料用途华为开发者文档中心https://developer.huawei.com/consumer/cn/doc/查询 HarmonyOS 应用、隐私、安全和发布资料入口HarmonyOS 指南https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/查权限、数据、日志、应用生命周期相关说明项目隐私政策确认注销后个人信息处理规则账号服务接口文档确认注销、解绑、删除、冷静期状态本文示例不直接规定法律策略工程上只做一件事把注销流程拆成可验证步骤并给每一步留出失败处理空间。在项目里可以把注销相关文件固定到几个位置便于后续审查项目位置建议职责pages/account/DeleteAccountPage.ets展示风险说明、校验结果和进度状态services/account/AccountDeleteService.ets创建注销任务、查询状态、处理失败services/account/IdentityVerifier.ets二次校验本人身份services/privacy/DataErasePlan.ets维护数据删除、匿名化、保留规则services/audit/DeleteAudit.ets保存最小审计记录这样排查问题时能快速定位页面卡住看页面状态校验失败看身份服务数据没处理看删除计划结果说不清看审计记录。3. 用删除计划描述要处理的数据注销不是一个接口名而是一份数据处理计划。typeEraseActiondelete|anonymize|retainByRule|unbind;interfaceAccountEraseItem{target:string;action:EraseAction;reason:string;required:boolean;}consterasePlan:AccountEraseItem[][{target:loginSession,action:delete,reason:清除登录态,required:true},{target:deviceBinding,action:unbind,reason:解除设备关联,required:true},{target:profile,action:anonymize,reason:删除可识别个人信息,required:true},{target:orderRecord,action:retainByRule,reason:按业务规则保留必要记录,required:false},];这份计划让客户端和服务端能对齐哪些数据必须处理哪些数据按规则保留哪些数据只做匿名化。页面不应该自己猜注销后哪些数据还存在。4. 注销入口先展示风险说明风险说明要具体不要只写“操作不可恢复”。interfaceDeleteWarningState{title:string;bullets:string[];confirmText:string;cancelText:string;}functionbuildDeleteWarning():DeleteWarningState{return{title:确认注销账号,bullets:[注销后当前账号将无法继续登录,已绑定设备会解除关联,个人资料将按规则删除或匿名化,部分依法或按业务规则保留的记录不会在页面继续展示,],confirmText:我已了解继续注销,cancelText:暂不注销,};}这段代码只负责用户理解成本。它防止用户把注销误认为退出登录也为后续身份校验提供上下文。5. 身份校验要独立于页面按钮不要因为用户已经登录就允许直接注销。注销前至少需要一次二次确认。typeVerifyMethodpassword|sms|biometric;interfaceIdentityVerifyRequest{accountId:string;method:VerifyMethod;challengeId:string;}classIdentityVerifier{asyncverify(request:IdentityVerifyRequest):Promiseboolean{if(!request.accountId||!request.challengeId){returnfalse;}// 实际项目中调用账号服务或系统认证能力。returnrequest.methodpassword||request.methodsms;}}身份校验层不处理删除数据只判断“是否是本人操作”。它防止设备被别人拿到后直接注销账号。6. 注销服务要有状态机注销过程可能失败不能只返回一个 boolean。typeDeleteStatuscreated|verifying|erasing|finished|failed;interfaceDeleteTask{taskId:string;accountId:string;status:DeleteStatus;failedReason?:string;createdAt:number;}classAccountDeleteService{asynccreateTask(accountId:string):PromiseDeleteTask{return{taskId:delete_${Date.now()},accountId,status:created,createdAt:Date.now(),};}asyncexecute(task:DeleteTask):PromiseDeleteTask{try{return{...task,status:finished};}catch(e){return{...task,status:failed,failedReason:(easError).message};}}}状态机让页面知道当前处于哪一步也让服务端可以补偿失败任务。注销这种链路不适合“一次请求定生死”。7. 审计记录只留必要证据注销留痕不是保留个人信息而是保留处理状态和排查证据。interfaceDeleteAuditRecord{taskId:string;accountIdHash:string;status:DeleteStatus;eraseTargets:string[];operator:user|system;createdAt:number;}classDeleteAudit{privatereadonlyrecords:DeleteAuditRecord[][];append(record:DeleteAuditRecord):void{this.records.push(record);}latest():DeleteAuditRecord[]{returnthis.records.slice().reverse();}}accountIdHash表示不直接保存明文账号 ID。审计记录服务于“处理过什么、结果如何”不是再次保存用户资料。8. 页面控制器串完整链路页面层要做的是触发、展示进度、处理失败不应该直接删除数据。classAccountDeleteController{constructor(privatereadonlyverifier:IdentityVerifier,privatereadonlyservice:AccountDeleteService,privatereadonlyaudit:DeleteAudit){}asyncsubmit(accountId:string,challengeId:string):PromiseDeleteStatus{constverifiedawaitthis.verifier.verify({accountId,challengeId,method:password,});if(!verified){returnfailed;}consttaskawaitthis.service.createTask(accountId);constfinishedawaitthis.service.execute(task);this.audit.append({taskId:finished.taskId,accountIdHash:hash_${accountId.length},status:finished.status,eraseTargets:erasePlan.map((item)item.target),operator:user,createdAt:Date.now(),});returnfinished.status;}}这段代码把“校验身份、创建任务、执行删除、记录结果”串起来。它防止页面绕过身份校验也保证失败时有状态可查。9. 注销验证动作场景操作预期结果未二次校验直接点击确认不允许进入删除任务校验失败输入错误凭证状态为 failed不删除数据删除成功正常走完整链路清除登录态记录审计状态删除失败mock 服务端失败显示可理解提示保留任务状态再次登录注销完成后尝试登录按账号规则拒绝或进入恢复说明注销链路必须用真实测试账号验证。不要只 mock 成功因为失败补偿才是这个功能的风险点。10. 注销问题排查表现象优先检查修复方式用户误点注销风险说明是否具体增加二次确认和冷静期说明注销后仍能登录登录态和服务端状态是否同步注销完成后强制清理会话数据处理说不清是否缺少 erasePlan按数据类型补处理计划删除失败无记录是否缺少审计状态记录 taskId 和失败原因页面一直转圈状态机是否只有成功态增加 failed 和重试提示排查时先看任务状态。如果没有任务状态只能靠日志猜流程走到哪一步。11. 发布前注销验收记录interfaceAccountDeleteReleaseCheck{identityVerified:boolean;warningShown:boolean;erasePlanReviewed:boolean;auditSaved:boolean;failureHandled:boolean;}constaccountDeleteCheck:AccountDeleteReleaseCheck{identityVerified:true,warningShown:true,erasePlanReviewed:true,auditSaved:true,failureHandled:true,};这份记录适合和隐私材料、账号协议一起保存。后续规则变化时也能知道当前包采用了哪套处理边界。发布前还要补一组人工验证使用一个测试账号完整走注销流程分别记录“取消注销、校验失败、校验成功、服务端删除失败、删除完成后再次登录”五个结果。注销链路一旦上线最好不要只依赖自动化测试因为它还涉及文案理解、系统返回、账号状态和服务端处理时序。注销专项证据包身份校验、数据处理和通知要闭环账号注销不是一个删除按钮。它至少包含身份确认、风险提示、数据处理、结果通知和留痕。每一步都要能回答“谁发起、处理了什么、结果是什么”。阶段证据身份校验登录态、二次确认数据处理删除、匿名化、保留原因结果通知成功或失败说明留痕操作时间和处理批次interfaceAccountCancelEvidence{requestId:stringidentityVerified:booleandataPlan:delete|anonymize|retainnotified:boolean}functionassertCancelEvidence(e:AccountCancelEvidence):void{if(!e.identityVerified)thrownewError(注销前未完成身份校验)if(!e.notified)thrownewError(注销结果未通知${e.requestId})}这段代码把注销验收拆成可核验字段避免只关注接口返回成功。注销链路复现场景给读者一组可执行核验注销要能回放完整链路身份确认、风险提醒、数据处理、结果通知。只看到接口成功不能证明注销闭环完成。核验维度读者需要准备的证据输入页面入口、用户动作、关键参数过程日志、状态变化、异常分支输出UI 表现、回调结果、持久化结果回归同场景重复执行后的结果interfaceCancelReplayCase{requestId:anyverifyMethod:anydataAction:anynotifyChannel:any}constreplay64:CancelReplayCase{requestId:sample,verifyMethod:sample,dataAction:sample,notifyChannel:sample,}functionassertReplay64(item:CancelReplayCase):void{if(item.notifyChannel.length0)thrownewError(注销结果缺少通知渠道)}这组核验把注销请求从接口调用扩展到用户通知和处理留痕避免注销结果只停留在服务端返回值。12. 小结注销要能解释、能执行、能追溯HarmonyOS 应用里的账号注销工程上要避免两个极端只做前端按钮或者把所有细节都丢给服务端。更稳定的做法是客户端负责风险说明、身份校验、状态展示和结果留痕服务端负责真实数据处理审计记录负责证明链路执行过。这样注销功能既不误导用户也能在上架和线上排查时说清楚。