WeChatDeveloper/docs/design.md

70 lines
3.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 设计
## 定位
2.0 把 SDK 收敛为协议层模块少量稳定入口承载认证、HTTP、签名、验签和加解密复杂度业务接口名称和字段继续以平台官方文档为准。
```text
Application
|
v
We\Client -- ConfigInterface
|
+-- WeChat platform / wxapp / service clients
+-- WeChat Pay APIv3 client
+-- Alipay platform / payment clients
|
+-- StoreCacheInterface / StoreTokenInterface
+-- injected Guzzle ClientInterface
```
`Client` 提供六个显式类型工厂,也保留动态 `get()` 供配置驱动系统使用。删除魔术 `__call()` 后,错误工厂名称能在开发阶段更早暴露。
## 模块边界
| 模块 | 负责 | 不负责 |
|------|------|--------|
| `Config` | 必填字段、URL、RSA 和平台信任材料校验 | 读取环境变量、密钥轮换 |
| 平台客户端 | token、请求协议、响应解析、平台签名 | 业务实体和数据库 |
| `Support` | 密钥规范化、缓存、签名、XML、加解密 | 业务流程编排 |
| 缓存契约 | token TTL 和刷新互斥 | 通用应用缓存 API |
| Token 契约 | 授权方 refresh token 读写 | 账号数据模型 |
| 异常层级 | 统一捕获和平台诊断上下文 | 日志与告警策略 |
## 安全决策
支付数据采用强安全默认值:
- 支付宝响应必须存在预期节点、标量 code 和有效签名。
- 微信支付普通 JSON 响应必须包含完整平台签名头,并以原始 body 验签。
- 微信支付通知先验签,再检查默认 300 秒时间窗口,最后解密 resource。
- 缺少信任材料在配置阶段失败,不允许“未配置即跳过验签”。
- 支付密钥不仅要求 OpenSSL 可解析,还要求算法确为 RSA。
通知幂等保留在业务层。SDK 不知道订单聚合、合法状态转换或事务边界,因此不能可靠代替业务持久化去重。
## URL 边界
通用微信平台和 JSON 客户端只接受相对 path避免调用方参数把受信客户端变成任意 URL 请求器。
微信账单的绝对 URL 是官方协议要求,因此封装在专用 `downloadBill()` 内:只有先通过已签名 API 响应取得的有效 HTTPS 地址才会交给下载 HTTP 适配器。该能力不会泄漏到通用客户端。
## 缓存设计
缓存键由部署前缀、平台通道和逻辑用途组成。三段独立编码并使用点号连接,既保留隔离语义,又满足 PSR-16 对保留字符的限制。
`FileCacheStore` 通过临时文件和原子重命名发布新值。过期读不做按路径删除,避免旧读者在新值重命名后误删新文件。
## 扩展接缝
- 框架缓存实现 `StoreCacheInterface`,或用 `PsrSimpleCacheStore` 适配 PSR-16。
- 微信服务平台账号仓库实现 `StoreTokenInterface`
- 测试或特殊传输策略向根 `Client` 注入 Guzzle `ClientInterface`
- 新官方 API 优先通过现有平台客户端的 `get()``post()``call()``raw()``download()``upload()` 表达。
只有当新协议形态无法由现有公开接口安全表达时,才增加专用方法,例如两阶段账单下载。
## 版本边界
2.0 不移植 1.x 上百个业务接口类,不保留旧命名空间、静态 `instance()` 或全局 helper。主版本断代使协议层接口保持可发现、可测试和较小的维护面。