使用 wx.request#
function request(options) {
return new Promise((resolve, reject) => {
wx.request({
...options,
success(res) {
if (res.statusCode >= 200 && res.statusCode < 300) {
resolve(res.data);
} else {
reject(new Error("请求失败:" + res.statusCode));
}
},
fail: reject
});
});
}小程序端要处理加载、成功、空数据、业务错误、网络失败和重新尝试。不要把所有错误都提示成“网络错误”。
合法域名与 HTTPS#
正式小程序只能访问后台配置的合法域名,普通请求使用 HTTPS。开发工具中的“不校验合法域名”只适合本地调试,不能证明真机和正式版本可用。
上线前确认:
- API 使用域名,不依赖 localhost 或裸 IP;
- 域名、证书和备案满足平台要求;
- 请求、上传、下载、WebSocket 分别配置;
- 测试版和正式环境地址分开;
- 超时和错误状态有界面反馈。
登录流程的正确理解#
小程序调用登录 API 获得一次性 code
│
▼
把 code 发送给自己的后端
│
▼
后端携带 AppID 与 AppSecret 调用微信服务
│
▼
后端建立自己的用户会话并返回安全凭据AppSecret 永远留在后端。一次性 code 不能当作长期登录状态。后端还要根据自己的业务用户和权限决定能访问哪些数据。
授权不等于获取资料#
登录用于识别用户,不代表自动获得昵称、头像、手机号或其他个人信息。涉及用户资料和敏感能力时,应按最新平台规则明确告知用途、在需要时请求,并提供可理解的拒绝与后续路径。
本地缓存#
本地缓存适合偏好、草稿和非敏感的临时数据。它可能被清理,也可能过期,不能作为订单或服务端业务状态的唯一来源。
需要设计:
- 缓存键名和版本;
- 写入时间与过期策略;
- 退出登录时清理哪些数据;
- 用户切换后不能看到上一个用户缓存;
- 服务端数据与缓存冲突时谁为准。
上传与分页#
上传前限制文件类型和大小,服务端再次验证;不要只相信文件扩展名。列表接口使用分页并限制每页数量,小程序滚动加载时避免同一页重复请求。
常见错误#
- 把 AppSecret、数据库密码放入小程序;
- 正式环境仍使用“不校验域名”思维;
- 只根据前端传入 userId 判断用户;
- 登录后不检查对象所有权;
- 缓存 Token 永不过期;
- 网络失败时留下永久加载动画;
- 用户快速点击导致重复提交。
动手练习#
让任务小程序调用任务 API:登录后查看自己的任务,支持分页、新增和完成;关闭网络时显示失败与重试;连续点击提交只创建一条;账号 A 无法读取账号 B 的任务。
完成标准#
- 能画出 code 经过后端换取身份的流程。
- 小程序代码中没有任何服务端秘密。
- 了解合法域名与 HTTPS 要求。
- 每个接口都由后端判断用户和资源权限。
- 缓存有过期、用户隔离和清理策略。