接入

HTP 快捷登录

用 OpenID Connect 登录用户,获取用于收付款的 sub。

支付接口只通过 OIDC sub 识别用户。请先接入 HTP 快捷登录,并保存每个用户的 sub。

端点

用发现文档配置你的 OIDC 库:

http
GET /.well-known/openid-configuration
用途 路径
授权 /oauth2/authorize
令牌 /oauth2/token
用户信息 /oauth2/userinfo
公钥(JWKS) /oauth2/jwks
撤销 /oauth2/revoke

授权码模式 + PKCE S256(SPA / 原生 App 必须,Web 推荐)。ID Token 使用 RS256 签名。客户端认证:client_secret_basic(推荐)、client_secret_post,公开客户端为 none。

Scope

Scope Claims
openid(必填) sub
profile name、given_name、family_name、nickname、picture、gender、birthdate、updated_at
email email、email_verified —— 需审核
phone phone_number、phone_number_verified —— 需审核
offline_access 返回 refresh_token

开放平台 App 默认可用 openid profile offline_access。

流程

http
GET /oauth2/authorize
    ?response_type=code
    &client_id=<client_id>
    &redirect_uri=https%3A%2F%2Fshop.example.com%2Fauth%2Fhtp%2Fcallback
    &scope=openid%20profile%20offline_access
    &state=<state>
    &nonce=<nonce>
    &code_challenge=<code_challenge>
    &code_challenge_method=S256

回调时校验 state 和 iss,然后用授权码换取令牌(只能使用一次,5 分钟内有效):

bash
curl -X POST /oauth2/token \
  -u "<client_id>:<client_secret>" \
  -d grant_type=authorization_code \
  -d code=<code> \
  -d redirect_uri=https://shop.example.com/auth/htp/callback \
  -d code_verifier=<code_verifier>

校验 id_token(用 JWKS 验签,校验 iss、aud = 你的 client_id、exp、nonce),然后读取 sub。

sub 是 pairwise 的

  • 同一开发者的所有 App 拿到同一用户的同一个 sub,可以在你的多个 App 间共享用户。
  • 不同开发者拿到的 sub 不同 —— 无法跨开发者关联用户。
  • sub 永久不变。请与用户记录一起保存,并作为 payer_sub / payee_sub 传入。

用户可以取消授权

用户可在 HTP App 的「已授权应用」中移除你的 App。之后 refresh token 和 userinfo 失效,你也无法再向该用户收款或付款(USER_NOT_AUTHORIZED),直到用户重新登录。

沙箱 App

App 发布前,只有你本人和测试用户能登录,其他人返回 access_denied。登录页会向用户标注该应用尚未经过 HTP 审核。