← 跨平台应用开发 · 第 12 篇

小程序怎样连接页面、身份与后端数据

设计学习进度小程序的页面、身份交换与数据授权,处理wx.login临时code、网络回调和真机域名校验。

学完这一篇,你能做到

实现课程列表与进度保存,在服务端验证记录归属,并测试登录过期、HTTP错误、重复提交和关闭调试后的真机请求。

学习进度小程序展示课程列表、正文和已完成节数。页面可以提交“完成一节”的意图,服务端负责确认用户身份和记录权限。客户端给出的用户ID不能直接成为授权依据,否则修改请求就可能读写其他人的进度。

本课采用合成课程与账号标识。首先完成列表、登录态和进度接口,不收集手机号,不接支付,也不公开真实账号数据。自己管理后端和使用云函数都必须遵守同样的授权边界。

页面数据与后台记录

课程记录包含ID、标题和节数,进度记录包含用户ID、课程ID、已完成范围和版本。页面只加载当前需要的摘要与正文,不把整个课程库塞进页面数据。列表的加载、空状态、错误和成功分别表达。

页面通过WXML呈现、WXSS设置样式,逻辑层处理事件并用平台提供的方法更新数据。小程序不是任意浏览器或Node环境,依赖与系统能力要按基础库文档确认。离开页面后异步返回也可能到达,用请求ID和当前课程ID判断是否仍应更新。

进度规则先说明“节数”与“已完成集合”的差别。只存一个最大数字意味着所有之前章节都被视为完成;允许跳着学习时应存明确集合或记录。这里用数量做简化案例,实际字段取决于产品规则。

临时code只用于服务端身份交换

调用 wx.login() 得到临时code,传给开发者服务器。服务器调用官方 auth.code2Session 交换身份标识与会话信息,再建立自己的业务登录态。code只能使用一次,不把它当长期访问令牌反复附在进度请求里。

AppSecret留在服务端,session_key 也不能下发给小程序或对外公开。OpenID用于服务端映射应用账户,UnionID是否可得有官方条件,不能假定所有登录都返回。业务请求携带应用自己的会话,由服务端验证并取得当前用户。

登录成功与获得个人资料是不同动作,不需要为了记录学习进度先索取所有个人信息。会话过期时重新获取临时code并交换登录态,重复或失效code返回受控错误;日志不记录密钥和完整凭证。

建立小程序与后端工程

在微信开发者工具建立原生小程序工程,记录基础库与项目配置。增加课程列表、正文和进度三个页面或页面区域,在应用配置中声明路径。先用本地合成JSON完成导航和展示,查看数据大小与页面返回行为。

后端建立登录交换与进度读写端点。登录端点接收code,服务端保管平台凭据并返回业务会话。进度端点验证会话、课程存在、字段范围与记录归属,数据库为用户和课程的组合定义唯一性,避免重复建档。

将客户端请求封装为服务模块,统一处理超时、状态码和业务错误。页面发起操作并等待确认,保存失败保留原显示与重试入口。接入云函数时同样检查函数调用上下文与数据规则,不能把“云开发”当成自动授权所有记录。

记录授权的离线契约

下面Python根据已确认用户检查记录归属,不允许 U-2 读取 U-1 的进度。它不执行 wx.login、会话验证、微信API或数据库查询。

records = {"P-1": {"owner": "U-1", "progress": 3}}
def progress(user, record_id):
    record = records.get(record_id)
    if record is None or record["owner"] != user:
        return None
    return record["progress"]
assert progress("U-1", "P-1") == 3
assert progress("U-2", "P-1") is None
print(progress("U-1", "P-1"))

实际输出 3。未经授权查询返回 None,没有公开另一个账号的进度。真实端点应从服务器验证的会话取得user,而不是接受客户端任意填写;是否区分不存在和无权限,需要按数据暴露策略决定。

写入也检查归属和范围。完成节数不能为负数或超过课程范围;课程版本变化时决定怎样处理旧进度。字段校验不能替代身份校验,两者都通过才允许数据库修改。

网络回调与域名条件

官方网络说明指出,收到服务器响应时,即使statusCode表示错误,也可能进入 success 回调。客户端因此必须检查HTTP状态和业务结果,不能把回调名字等同于保存成功。401、校验失败和服务错误应进入不同恢复流程。

普通请求按当前官方规则配置服务器域名,使用HTTPS并验证证书、协议和端口条件。平台API不能全部直接从小程序访问,敏感交换在服务端完成。云托管的指定调用方式有其官方例外,不能把例外推成所有网络请求都不需要配置。

开发工具可临时跳过域名与证书检查,这只帮助开发。正式验收关闭相应跳过选项,在真机关闭调试状态后测试;只在调试模式成功通常仍说明配置待查。对具体限额与基础库版本查当时文档,不在教程写长期固定数字。

重试与页面恢复

超时不证明写入未执行,进度更新需要稳定操作ID或明确幂等协议。服务端确认版本后客户端更新状态,旧响应不能覆盖用户新操作。弱网下按钮显示进行中,但重复请求仍由服务端防护。

页面进入后台可能中断请求,重新打开时读取服务器确认的进度,并处理尚未确认操作。离线若允许暂存,应存待办和基准版本并标为等待同步;只显示增加后的数字会误导用户以为已经保存。

账户切换后清理前一用户的页面缓存和本地记录索引,再请求当前身份数据。保留私人内容时说明存储作用域,不让同一设备下一个用户看到上一个人的进度。

进度接口可返回当前版本与确认的完成范围,客户端只显示服务端实际接受的值。对课程分页保留游标与查询身份,重试同页不重复插入列表。接口字段版本变化先保持兼容或明确升级要求,旧小程序包仍可能被使用,不能假定所有用户同时取得新代码。

练习:验收身份与失败路径

用两个教学账号请求同一记录,第二个账号不能读取或修改。模拟失效code、会话过期、HTTP错误、重复提交和页面切换后的晚到响应,数据与提示保持一致。

在开发工具与真机分别验证,最终关闭调试和跳过校验后请求仍成功。检查客户端包与日志不含AppSecret、session_key或服务密钥。本文只运行归属模型;登录交换、网络与数据存储需要实际工程验收,完成后再扩展课程搜索。

资料来源与延伸阅读

资料核验:2026-11-10。本文为原创工程讲解,教学示例不代表线上实测。