EZR · Authentication Profile

Ezr Authentication

Authentication

EZR secures its APIs with signedRequest across 1 declared security scheme, as derived from its OpenAPI definitions.

CompanyEnterpriseSCRMCRMRetailMarketingWeChatE-CommerceLoyaltyMembershipCouponsPoint of SaleWebhooksChina
Methods: signedRequest Schemes: 1 OAuth flows: API key in: form-body

Security Schemes

EZRSignedRequest signedRequest
· in: form-body ()

Source

Authentication Profile

ezr-authentication.yml Raw ↑
generated: '2026-08-13'
method: searched
source: https://open.ezrpro.com/#/apiFile/guide/00001
docs: https://open.ezrpro.com/#/apiFile/guide/00003
note: >-
  Derived from the EZR Open Platform developer guide (开发指南) and signing-algorithm page
  (加签、验签算法), both published anonymously at open.ezrpro.com, and corroborated by the
  provider's own packaged Agent Skill (skills/ezr-common-infrastructure.md). EZR publishes no
  OpenAPI, so there are no OpenAPI securitySchemes to derive from — this profile is read from
  the provider's prose reference, not fabricated.
summary:
  types: [signedRequest]
  oauth2: false
  openid_connect: false
  api_key_in: [form-body]
  bearer: false
  mutual_tls: false
  scopes: none — access is granted per interface at provisioning time, not by scope
onboarding:
  steps:
  - 申请商家代码AppID和接口请求地址 — request a brand/merchant AppId and the interface request address from EZR
  - 开放平台会分配接入参数Token和Appsystem,并开通接口权限 — EZR issues the Token and AppSystem and enables interface permissions
  - 按照接口文档实现业务逻辑 — implement against the interface reference
  self_service: false
  gate: EZR technical support / account manager assigns credentials; there is no public sign-up
  source: https://open.ezrpro.com/#/apiFile/guide/00001
schemes:
- name: EZRSignedRequest
  type: signedRequest
  in: form-body
  transport: HTTPS POST, application/x-www-form-urlencoded, UTF-8
  credentials:
  - {name: AppId, type: string, required: true, description: 品牌接入的应用编号/品牌编码 — the brand/merchant application code issued by EZR}
  - {name: Token, type: string, required: true, description: shared secret held by the client; never transmitted, only mixed into the signature}
  - {name: AppSystem, type: string, required: true, description: 对接系统来源 — the calling system identifier (e.g. POS, ERP), also the rate-limit key}
  - {name: Timestamp, type: string, required: true, description: 'yyyyMMddHHmmss; rejected with StatusCode 308 if more than 10 minutes out'}
  - {name: Sign, type: string, required: true, description: uppercase hex request signature}
  - {name: Args, type: string, required: true, description: business parameters as a JSON string}
  signing:
    algorithm_default: SHA1
    algorithm_alternate: MD5 (32) — must be enabled by the EZR project manager
    canonical_string: AppId={AppId}&Timestamp={Timestamp}&Token={Token}
    canonicalisation: parameter names sorted in English dictionary order, joined as a query string, UTF-8 bytes
    encoding: hexadecimal, uppercase
    published_example:
      input: AppId=EZP&Timestamp=20150701093010&Token=9cd8c0ed38a9e113
      note: >-
        The provider's guide prints worked SHA1 and MD5 outputs for this input; they are
        illustrative doc values, not credentials, and are intentionally not reproduced here.
  response_verification:
    signed: true
    algorithm: SHA1 over the same AppId/Timestamp/Token canonical string
    field: Sign
    rule: >-
      Verify the response Sign before acting on Result; ignore the message entirely if
      verification fails. Do not verify when Status=false.
  webhook_verification:
    applies_to: asyncapi/ezr-webhooks.yml
    note: EZR signs its outbound pushes with the same scheme, so receivers can verify inbound pushes.
network_controls:
- control: ip-allowlist
  required: true
  description: >-
    Access is IP-restricted; a call from an unregistered address is rejected with StatusCode
    400 (访问受限通常指不在IP白名单). Interfaces are enabled by default once granted, but
    re-enabling requires configuring the IP address.
  source: https://doc.ezrpro.com/ (help centre, per search result) and status code 400
environments:
- {name: 测试环境 (test), https: 'https://open-q1.ezrpro.com', http: null}
- {name: UCloud, https: 'https://open-up.ezrpro.com', http: 'http://open-up.ezrpro.com'}
- {name: QCloud (production), https: 'https://open-tp.ezrpro.com', http: 'http://open-tp.ezrpro.com'}
- {name: KOS 测试环境 (test), https: 'https://open-kos-q1.ezrpro.com', http: null}
- {name: KOS QCloud (production), https: 'https://open-kos-tp.ezrpro.com', http: null}
gaps:
  - No OAuth 2.0, OIDC, or scoped tokens — a single long-lived Token per brand.
  - No published token rotation or revocation procedure.
  - Plaintext HTTP endpoints are published alongside HTTPS for the UCloud and QCloud environments.
  - The Token is never transmitted, which is a genuine strength of the scheme.