EVJ-代理商API
  1. 前置必读
  • 前置必读
    • 请求签名算法说明
    • Webhook 签名校验文档
    • 端点响应状态码
  • 持卡人
    • 持卡人列表-分页查询
      POST
    • 创建持卡人
      POST
  • 卡片操作
    • 获取卡产品列表
      GET
    • 实体卡绑定
      POST
    • 激活实体卡
      POST
    • 卡片激活码(回调异常情况下主动获取)
      POST
    • 卡片详情
      POST
    • 卡片充值
      POST
    • 卡片敏感信息(卡片三要素)
      POST
    • 设置卡片状态
      POST
  • WebHook
    • 获取WebHook信息
      GET
    • 设置WebHook
      POST
    • 通知记录
      POST
  • 模拟测试
    • API签名生成
      POST
    • 卡片授权交易--仅沙箱环境可用
      POST
  1. 前置必读

Webhook 签名校验文档

指导代理商验证 EVJ 平台发送的 Webhook 回调请求,确保数据来源可信、内容未被篡改。

1. Webhook 安全机制概述#

EVJ 平台每次推送 Webhook 时,都会在 HTTP Header 中携带安全字段:
Header说明
X-Webhook-Signature使用 webhook_secret 对 payload 进行 HMAC-SHA256 签名
X-Payload-Sha256payload 原始内容的 SHA256 指纹
Content-Type固定为 application/json
代理商必须验证两项内容:
1.
payload 未被篡改
2.
回调确实来源于 EVJ(签名验证)

2. Webhook 请求示例#

请求头:#

X-Webhook-Signature: 9c0a55be63df...c92a
X-Payload-Sha256: 2cd52a741c49c9...93cd
Content-Type: application/json

请求 Body:#

{
  "event": "card.created",
  "card_id": "c_1298123",
  "cardholder_id": 12345,
  "status": "active",
  "timestamp": 1736501235
}

3. 验证步骤#

步骤 1:验证 Payload 完整性#

计算原始字符串的 SHA256:
local_sha256 = sha256(raw_body)
对比:
local_sha256 == X-Payload-SSha256

步骤 2:验证签名#

expected_signature = HMAC_SHA256(raw_body, webhook_secret)
对比:
expected_signature == X-Webhook-Signature

4. 获取 Webhook Secret#

通过 API 设置 webhook:
POST /agent/v1/webhook/set
返回示例:
{
  "webhook_url": "https://api.xxx.com/hook",
  "secret": "whsec_ab12cd34ef56..."
}

5. 代码示例#

PHP#

Node.js(Express)#

Python(Flask)#


6. 验签失败的常见原因#

JSON 被格式化或压缩,导致 SHA256 不一致
代理商中间层修改了 body
使用错误的 webhook_secret
未使用原始 body 进行签名

7. 回调响应要求#

返回 200 + 字符串 "ok":
HTTP/1.1 200 OK
ok
否则平台会自动重试(指数退避):
次数延迟
1立即
260s
3120s
4180s
5240s
6300s
7360s

8. 安全最佳实践#

强制使用 HTTPS
验证签名后再处理业务
不要泄露 webhook_secret
如被泄露,请重新生成
上一页
请求签名算法说明
下一页
端点响应状态码
Built with