开放平台
开放平台
这是一套面向外部开发者的系统文档。这里的内容重点回答三类问题:
- 我应该先从哪里开始接入
- 我应该如何配置应用、密钥、签名与回调
- 当联调失败时,我应该去哪里排查
如果你要查某个具体接口的请求与响应字段,请优先打开 https://role2.api.role2.com/document/open 或 https://role2.api.role2.com/openapi?view=open。如果你要理解接入流程、调用顺序、常见问题和调试路径,请从本目录继续阅读。
概览
适用对象
本目录面向开放平台的外部接入方开发者,默认你需要完成服务端到服务端的应用接入、签名调用、Webhook 接收和升级维护。
文档地图
- API 参考页:
https://role2.api.role2.com/document/open - 过滤后的开放平台 OpenAPI:
https://role2.api.role2.com/openapi?view=open - 动作目录:
https://role2.api.role2.com/openapi/catalog - 迁移索引:
https://role2.api.role2.com/openapi/migrations - OAuth 浏览器入口:
https://role2.api.role2.com/oauth/authorize - 仓库示例:
example/open/
建议阅读顺序
- 先看“快速开始”,用
https://role2.api.role2.com/api/1/sandbox/open__fixture_ensure拿到一组可立即联调的 sandbox 凭证 - 再看“签名与鉴权”,确保本地能稳定算出与服务端一致的 canonical signature
- 然后用“接口查阅与调试”里的 TS 类型、Postman、HTTPie 示例缩短联调路径
- 若你的应用需要用户授权,再继续阅读 OAuth 相关入口,例如
https://role2.api.role2.com/oauth/authorize - 最后在“Webhook”和“版本与迁移”里补齐回调消费与升级维护能力
快速开始
最短跑通路径
- 启动本地服务
- 打开
https://role2.api.role2.com/document/open,确认你看到的是开放平台 API 参考页 - 调用
POST https://role2.api.role2.com/api/1/sandbox/open__fixture_ensure获取 sandbox owner、open app 和 secure open key - 使用返回的
app_id与app_secret,对POST https://role2.api.role2.com/api/1/account_session/session__read发起第一条签名请求 - 如果签名不一致,使用
POST https://role2.api.role2.com/api/1/sandbox/signature__playground对比服务端计算结果
推荐示例
- 总入口说明:
example/open/readme.md - TypeScript quickstart:
example/open/ts-client/readme.md - TypeScript sample:
example/open/ts-client/index.ts - HTTPie / curl:
example/open/httpie/readme.md - Postman collection:
example/open/postman/readme.md
为什么第一条请求推荐 account_session/session__read
这个动作能一次性验证 open app、open key、scope allowlist、secure key 验签和 canonical request 拼装是否都正常,是最适合作为首次接入健康检查的路径。
应用与密钥
应用与密钥的关系
- open app 表示接入方应用本身
- open key 表示该应用可用于签名调用的凭证
- scope 表示该凭证被允许访问的开放动作集合
常用控制面动作
POST https://role2.api.role2.com/api/1/open_app/current_pickPOST https://role2.api.role2.com/api/1/open_app/current_updatePOST https://role2.api.role2.com/api/1/open_key/regular_readPOST https://role2.api.role2.com/api/1/open_key/regular_createPOST https://role2.api.role2.com/api/1/open_key/regular_updatePOST https://role2.api.role2.com/api/1/open_key/regular_rotatePOST https://role2.api.role2.com/api/1/open_key/regular_revoke
OAuth 相关入口
GET https://role2.api.role2.com/oauth/authorizePOST https://role2.api.role2.com/oauth/authorizePOST https://role2.api.role2.com/oauth/tokenPOST https://role2.api.role2.com/oauth/revokePOST https://role2.api.role2.com/oauth/introspect
适用场景
- 授权码 + PKCE:面向需要用户同意的第三方应用
- client_credentials:面向服务端到服务端的受信调用
管理建议
- 使用 sandbox 环境先跑通最小 scope
- 为不同集成场景拆分不同 key,避免把所有权限放进一个凭证
- Reveal-once secret 返回后立即保存,后续不要假设还能从读接口再次取回明文
- 轮换 key 时优先走并行切换窗口,确认新 key 稳定后再撤销旧 key
签名与鉴权
必需请求头
对要求 secure key 验签的开放动作,请至少准备:
app_idtimestampnoncesignature
canonical request
签名不是简单的 body 签名,而是对 method、path、query、body hash 等 canonical pieces 进行规范化后统一计算。对象字段顺序、空 body 的处理方式、query 排序方式,都可能导致签名不一致。
调试工具
在非生产环境,优先使用:
POST https://role2.api.role2.com/api/1/sandbox/signature__playground
它会返回 method、path、query、body hash、canonical request 与最终 signature,适合用来比对你本地 SDK 或脚本的中间结果。
常见失败原因
timestamp与服务器时间偏差过大nonce被重复使用- body 规范化方式与服务端不一致
- 使用了错误的
app_secret - 调用动作需要 canonical signature,但本地只做了简化签名
接口查阅与调试
什么时候看哪里
- 想看字段、schema、返回值:打开
https://role2.api.role2.com/document/open - 想导出 machine-readable 契约:打开
https://role2.api.role2.com/openapi?view=open - 想确认动作名、scope、auth-source:打开
https://role2.api.role2.com/openapi/catalog - 想看升级与替代关系:打开
https://role2.api.role2.com/openapi/migrations
推荐工具链
- TypeScript 类型导出:
npm run openapi:open:ts - Postman collection 导出:
npm run openapi:open:postman - TS quickstart:
example/open/ts-client/index.ts - HTTPie / curl quickstart:
example/open/httpie/readme.md
canonical action 与官方快捷名
- 成员股列表读取的 canonical action 是
POST https://role2.api.role2.com/api/1/share_team/read_by_symbol - 官方快捷名 alias 是
symbol_read__share_team - alias 与 canonical action 的入参、返回与权限语义保持一致,适合作为 SDK / Request Method 生成层的稳定映射键
调试建议
先用 https://role2.api.role2.com/document/open 确认字段,再用 TS 类型导出锁定结构,最后用 Postman 或 HTTPie 做最小复现。不要一开始就把签名、Webhook、业务逻辑同时绑在一起排查。
Webhook
Webhook 做什么
Webhook 用来把平台侧事件异步推送给接入方。你需要同时完成两件事:
- 能正确接收 HTTP 回调
- 能按开放平台的 canonical 规则验证回调签名
现成示例
- receiver 示例入口:
example/open/webhook-receiver/index.ts - 使用说明:
example/open/webhook-receiver/readme.md
事件目录与联调
- 事件目录可通过
POST https://role2.api.role2.com/api/1/open_event/list查看 - 非生产环境可通过
POST https://role2.api.role2.com/api/1/open_event/emit为当前 app 触发模拟事件 - 通过
POST https://role2.api.role2.com/api/1/open_webhook/regular_upsert为当前 app 配置 webhook listener - 通过
POST https://role2.api.role2.com/api/1/open_webhook/delivery_read查看最近 delivery 状态与失败原因 - 通过
POST https://role2.api.role2.com/api/1/open_webhook/delivery_replay对修复后的 failed delivery 做重放 - 需要先完成 open webhook 的监听配置,再结合 sandbox 与 delivery replay 测试完整消费链路
建议排查顺序
- 先确认 receiver 端口、路径与公网或联调地址正确
- 再确认
timestamp、nonce、signature是否被完整保留到验签逻辑 - 再读取 failed delivery 的 headers、payload 与错误原因
- 修复后通过 replay 重新消费
- 最后再看业务 payload 的字段处理
版本与迁移
迁移入口
- 迁移索引:
https://role2.api.role2.com/openapi/migrations - 动作目录:
https://role2.api.role2.com/openapi/catalog
升级建议
- 每次升级前查看
https://role2.api.role2.com/openapi/migrations - 观察是否出现 deprecation / sunset / replacement 信息
- 重新导出
npm run openapi:open:ts与npm run openapi:open:postman - 调整调用方对错误码、scope 与回调行为的处理
常见问题
常见问题
签名总是不通过怎么办
先不要猜。用 https://role2.api.role2.com/api/1/sandbox/signature__playground 对照 method、query、body hash 与最终 signature,逐项比对差异。
为什么文档写的是 https://role2.api.role2.com/api/1/*,不是内部 https://role2.api.role2.com/call/*
因为外部接入方应该只依赖开放平台 facade,不应该绑定内部控制面路由。
为什么我已经有 key 还会被拒绝
先检查 key 是否已撤销、scope 是否覆盖当前动作、open app 是否处于正确环境,再检查你是否真的在用这把 key 对应的 app_secret。
我应该看 wiki 还是 https://role2.api.role2.com/document/open
想理解接入路径、控制面、排错顺序,请看 wiki。想确认某个接口的 schema、字段和返回值,请看 https://role2.api.role2.com/document/open。
为什么升级后还要重新导出类型与 Postman
因为 https://role2.api.role2.com/openapi?view=open 与 https://role2.api.role2.com/openapi/migrations 反映的是最新公开契约,旧导出可能缺少新字段、弃用提示或替代动作。
Webhook 验签失败但 API 调用正常
这通常说明出问题的是回调侧的 canonical request 还原,而不是 open key 本身。优先检查回调服务是否保留了原始 path、query、headers 和 body。
