开放平台文档固定沙箱合同
Sandbox onlyPUBLIC SANDBOX DOCUMENTATION
从合成数据开始接入
使用固定 Scope、PKCE S256 和一次性沙箱授权码验证集成。生产 OAuth、生产 Client、Secret、Token 与真实用户数据尚未开放。
HARD BOUNDARY
所有示例仅限沙箱
示例只使用 sac1.* 一次码、sbox_at1.*短期令牌和合成场景;不要把它们接入生产账号、真实权益或生产回调。
QUICK START
安全起步
- 使用攀登者通行证完成一次性开发者会话交接。
- 登记唯一开发者主体,创建应用草稿并配置精确 HTTPS 回调。
- 在应用沙箱选择固定合成场景和最小 Scope。
- 用 PKCE S256 完成一次授权,并在固定 UserInfo Explorer 验证结果。
OIDC-LIKE SANDBOX
仅用于模拟的授权链
控制台创建绑定应用、场景、回调、state、Scope 与 PKCE challenge 的 一次性 sac1.* 授权码。数据面只开放以下固定路由:
POST /sandbox/oauth2/tokenGET /sandbox/v2/userinfoPOST /sandbox/oauth2/revoke
访问令牌最长 600 秒,不签发 Refresh Token;浏览器 Cookie、通行证 Token 和未来生产 Token 均不能进入沙箱数据面。
SCOPES & CLAIMS
固定 Scope 与返回字段
| Scope | 用途 | 合成字段 |
|---|---|---|
openid | 用途返回仅对当前沙箱应用稳定的合成 pairwise sub。 | 合成字段sub |
passport.basic | 用途读取合成的通行证编号、昵称和头像。 | 合成字段pdz_no, nickname, avatar_url |
passport.level.read | 用途读取合成等级、标签和已激活系统数。 | 合成字段passport_level, level_label, paid_system_count |
entitlements.summary.read | 用途读取不对应真实权益的合成权益摘要。 | 合成字段entitlements |
ERRORS
稳定错误与恢复方式
DEVELOPER_SANDBOX_INVALID_REQUEST- 请求字段、格式或固定操作不符合合同。
DEVELOPER_SANDBOX_ACCESS_DENIED- 当前主体或应用不能执行该沙箱操作。
DEVELOPER_SANDBOX_NOT_FOUND- 资源不存在,跨主体资源也统一返回此错误。
DEVELOPER_SANDBOX_VERSION_CONFLICT- 资源版本已变化,重新读取后再提交。
DEVELOPER_SANDBOX_IDEMPOTENCY_CONFLICT- 同一幂等键绑定了不同正文。
DEVELOPER_SANDBOX_INVALID_GRANT- 一次码、PKCE 或有效期校验失败。
DEVELOPER_SANDBOX_RATE_LIMITED- 请求超出有界速率,按响应提示稍后重试。
DEVELOPER_SANDBOX_PRODUCTION_ACCESS_DISABLED- 生产能力固定关闭。
网络或 5xx 导致结果不确定时,只能使用原正文和原幂等键重试;409 后重新读取资源与 ETag,不得静默覆盖。
WEBHOOK STATUS
第三方 Webhook 尚未开放
仓库已经冻结 Ed25519 签名信封、事件 ID、时间戳、正文 SHA-256、固定 DNS/TLS 投递和重试语义,但第三方端点登记与生产事件订阅尚未开放。 当前不得配置接收地址,也不能把内部事件样例当作已承诺的生产事件。
pdz-webhook-idpdz-webhook-timestamppdz-webhook-key-idpdz-webhook-body-sha256pdz-webhook-signature: v1=...
TYPESCRIPT SDK
最小沙箱客户端
TypeScript SDK 只封装固定沙箱合同、严格响应解析、no-store、PKCE 与幂等恢复;仓库内参考包尚未公开发布,也不接受任意 URL、生产 Client Secret 或生产令牌。
import { PassportDeveloperClient } from "@pdz/sdk-typescript";
const client = new PassportDeveloperClient({
apiOrigin: "https://open-api.pdz.club",
});
const products = await client.readSandboxProducts();
// 仅返回固定沙箱 Scope 和合成字段目录