权限范围
Scope 决定应用能请求哪些平台能力。申请客户端时选择的是能力上限,用户授权时只能在这个上限内授权。
用户身份 Scope
| Scope | 能力 | 是否需要商户 |
|---|---|---|
openid | 获取成对主体标识和 ID Token | 否 |
profile | 读取用户名与昵称,不包含邮箱 | 否 |
email | 读取邮箱地址与邮箱验证状态 | 否 |
邮箱接入需申请并获批 email,授权请求使用 openid email 或 openid profile email。现有客户端不会自动增加权限;管理员可在 准入审核 → 应用审核 → 调整权限 补批。权限变更会撤销旧用户授权和令牌,用户需重新同意。
请求 openid 时必须同时提供 nonce。只做“使用三狗云服务登录”的应用通常申请 openid profile 即可。
商户与交易 Scope
| Scope | 能力 | 可用主体 |
|---|---|---|
merchant.profile.read | 读取绑定商户公开资料 | 用户授权、Client Credentials |
products.write | 创建与更新绑定商户的外部 API 商品 | 仅 Client Credentials |
inventory.write | 更新绑定商户的虚拟库存 | 仅 Client Credentials |
merchant_payments.create | 按金额创建本商户通用收款单、补发失败通知 | 仅 Client Credentials |
merchant_payments.read | 查询本商户收款单、可用渠道与通知投递记录 | 仅 Client Credentials |
products.read | 读取绑定商户已启用商品 | 用户授权、Client Credentials |
orders.create | 代表已授权用户在绑定商户下单 | 仅用户授权 |
orders.read | 读取属于授权用户与绑定商户的订单 | 仅用户授权 |
payments.create | 为可访问订单发起支付 | 仅用户授权 |
payments.read | 查询可访问订单的支付状态 | 仅用户授权 |
强制商户绑定
只要申请中包含任何商户或交易 Scope,平台会忽略客户端提交的商户编号,并自动绑定申请人自己已审核通过且处于启用状态的商户。
因此:
- 没有商户也可以申请统一登录客户端;
- 没有启用中的商户时不能申请店铺 Scope;
- 客户端不能填写其他人的商户编号跨店访问;
- 绑定商户被停用后,相关 OpenAPI 调用会被拒绝;
- 被驳回的申请或已签发应用提交变更为纯登录权限后,审核通过时不再绑定商户;审核期间已签发应用的原配置继续生效。
商户收款权限的申请与审核
在开放平台的原应用资料中选择机密客户端,勾选 merchant_payments.create、merchant_payments.read,提交申请或变更审核。未入驻或商户未启用时不能申请商户权限。管理员在 准入审核 → 应用审核 批准申请,也可通过 调整权限 和审核说明为符合条件的现有客户端补批。
公共客户端不能申请或获批服务端专用的 merchant_payments.*、products.write、inventory.write;先提交机密客户端类型变更。批准后重新获取令牌,新权限不会追加到旧令牌,也不会由管理员身份自动授予。
merchant_payments.* 是商户服务端收款能力,payments.* 是用户商品订单支付能力,两者不能替代。接入步骤见 通用商户收款。
Client Credentials 的限制
只有“机密客户端 + 已绑定商户”才能使用 client_credentials。当前该流程只允许:
merchant.profile.read products.read products.write inventory.write
merchant_payments.create merchant_payments.read商品订单的 orders.*、payments.* 仍要求用户授权。merchant_payments.* 专用于商户服务端通用收款,不要求买家拥有 TDCloud 账号;具体登录要求由商户策略和渠道决定,见 通用商户收款。以上为客户端可申请的范围,只请求实际获批且需要的权限。
curl -X POST "{TOKEN_ENDPOINT}" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "grant_type=client_credentials" \
--data-urlencode "client_id={CLIENT_ID}" \
--data-urlencode "client_secret={CLIENT_SECRET}" \
--data-urlencode "scope=merchant.profile.read products.read"