Skip to main content

机制概述

开放平台采用 app_key 对称签名机制:渠道商与平台共享一对凭据,使用 HMAC-SHA256 对请求/响应原文计算签名,通过 HTTP Header 传递。
  • 仅签名,不加密:报文内容以 HTTPS 传输保护;签名用于确认请求来源可信、内容未被篡改、防止重放攻击;
  • 对称机制:同一密钥既用于请求签名(渠道商→平台),也用于响应验签(平台→渠道商);
  • 防重放:时间戳 ±5 分钟窗口 + 随机串 5 分钟去重,双因子校验。

凭据获取

渠道商入驻(管理端开通)后,平台分配:
请求头 Client-Id 的取值即为 app_key 本身。

请求签名(渠道商 → 平台)

签名原文

对以下内容按顺序拼接,每行以换行符 \n 结尾(包括最后一行的请求体后也有 \n):
对应格式串:"%s\n%s\n%s\n%s\n%s\n%s\n%s\n"

签名算法

  • 算法:HMAC-SHA256,密钥为 app_secret
  • 输出:十六进制小写字符串,放入请求头 Signature

计算示例

以进件提交接口为例,假设: 签名原文(第 7 行之后也有换行符):
Go 计算参考:
完整请求:

平台验签流程

平台收到请求后依次校验,任何一步失败即拒绝:

响应验签(平台 → 渠道商,可选但推荐)

平台对所有响应均签名(包括 4xx/5xx 错误响应),签名放入响应头 Signature
复用请求的头部参数Client-Id/Signature-Type/Timestamp/Nonce-Str 与请求一致),仅最后一行替换为响应 body 原文,同样以 \n 结尾。 渠道商可用同一 app_secret 对响应验签,确认响应未被篡改。

防重放说明

  • Timestamp:限制请求在 5 分钟窗口内有效,过期请求拒绝(HTTP 401);
  • Nonce-Str:同一 app_key 下 5 分钟窗口内不可重复,防止同一请求重放;
  • 两者同时校验,缺一不可。

注意事项

  1. 签名前不要格式化请求体(不要重新排序 JSON 字段、不要压缩/美化),对实际发送的字节签名;
  2. URL 必须包含完整协议与域名(https://gw.xft.xin/openapi/v1/...),且与实际请求完全一致(含 query 参数原序);
  3. 时间戳使用秒级;服务器时间与平台时间偏差过大时先校准系统时钟;
  4. app_secret 泄露时立即联系平台重置;
  5. 对接期间可联系平台将接口加入验签豁免名单(仅限联调)。

与 RSA 签名机制差异

若渠道商同时对接其他支付机构(如易生 RSA 双向签名),注意以下差异: