Skip to content

通知 ​

当订单状态发生变更时,HashNut 会向您的服务器发送 Webhook 通知。本页介绍通知载荷、签名验证和重试策略。

Webhook 投递 ​

当订单状态变更时(例如从 INIT 变为 PAID,或从 CONFIRMING 变为 SUCCESS),HashNut 会向该订单配置的 Notify URL 发送 HTTP POST 请求。

通知载荷 ​

通知体设计为最小化,仅包含查询完整订单详情所需的标识信息:

json
{
  "payOrderId": "PO202606210001",
  "merchantOrderId": "ORDER-20260621-001",
  "accessSign": "BASE64_HMAC_SIGNATURE",
  "state": 3
}
字段类型说明
payOrderIdstringHashNut 订单 ID
merchantOrderIdstring您的唯一订单标识符
accessSignstring用于查询订单的 HMAC-SHA256 签名
stateinteger新的订单状态。参见订单状态

通知请求头 ​

通知请求包含 HMAC 签名请求头(与身份认证格式相同):

请求头说明
hashnut-request-uuid本次通知的 UUID
hashnut-request-timestampUnix 时间戳(毫秒)
hashnut-request-signuuid + timestamp + body 的 Base64 编码 HMAC-SHA256 签名

签名验证 ​

DANGER

处理通知前务必验证 hashnut-request-sign 请求头。接受未验证的通知会使您的系统面临伪造攻击风险。

验证步骤:

  1. 读取 hashnut-request-uuid、hashnut-request-timestamp 和 hashnut-request-sign 请求头。
  2. 读取原始请求体字符串。
  3. 拼接:signString = uuid + timestamp + body
  4. 使用您的 Secret Key 计算 base64( hmac_sha256( secretKey, signString ) )。
  5. 将计算结果与收到的 hashnut-request-sign 比对。

推荐商户处理流程 ​

收到通知后:

  1. 验证请求头签名(如上所述)。
  2. 查询完整订单详情:使用通知体中的 payOrderId、merchantOrderId 和 accessSign 调用查询订单 API。
  3. 更新您内部系统的订单状态(以查询结果为准)。
  4. 返回字符串 success 确认收到。

TIP

不要仅依赖通知中的 state 字段来执行业务逻辑。务必调用查询订单 API 获取完整且权威的订单数据(金额、交易哈希等)。

响应要求 ​

您的 Notify URL 端点必须返回纯文本字符串 success(HTTP 200)以确认收到通知。

HTTP/1.1 200 OK
Content-Type: text/plain

success

WARNING

如果您的端点未返回 "success",HashNut 会将该通知视为失败并进行重试投递。

重试策略 ​

重试次数距上次间隔
第 1 次重试15 秒
第 2 次重试30 秒
第 3 次重试1 分钟
第 4 次重试5 分钟
第 5 次重试30 分钟
第 6 次重试1 小时
第 7 次重试6 小时

7 次重试后(总计约 8 小时),HashNut 停止重试。如果您错过了通知,可以使用查询订单来轮询当前状态。

Notify URL 与 Callback URL 的区别 ​

这两个 URL 有完全不同的用途,请勿混淆。

Notify URLCallback URL
方向HashNut 后端 --> 您的后端客户浏览器 --> 您的前端
用途服务器到服务器的 Webhook 通知支付完成后的前端跳转
传输方式带 JSON 载荷的 HTTP POST浏览器重定向(302 或 JS 重定向)
认证请求头 HMAC 签名无签名
可靠性失败时重试单次重定向,不重试
示例 URLhttps://api.yoursite.com/api/notifyhttps://yoursite.com/payment-result

TIP

务必实现 Notify URL 以可靠地跟踪订单状态。Callback URL 是可选的,仅用于改善客户支付后的前端体验。