Webhook 处理

学习如何接收和处理 Payve 支付通知

7 分钟阅读
更新于 2025/8/13
Webhook通知API

Webhook 是 Payve 主动向您的服务器发送支付事件通知的机制。当支付状态发生变化时,Payve 会向您配置的 Webhook URL 发送 HTTP POST 请求。

工作原理

配置 Webhook

1. 在商户后台配置

登录 Payve 商户后台,在"Webhook 设置"中配置:

  • Webhook URL: 您的服务器接收通知的地址
  • 签名密钥: 用于验证请求来源的密钥
  • 事件类型: 选择要接收的事件类型

2. 通过 API 配置

接收 Webhook 通知

基础示例(Node.js + Express)

Python Flask 示例

事件类型

Payve 支持以下 Webhook 事件类型:

payment.succeeded

支付成功完成

payment.failed

支付失败

payment.expired

支付订单过期

payment.confirming

支付确认中(可选)

重试机制

Payve 的 Webhook 重试策略:

  1. 初次发送: 立即发送
  2. 第1次重试: 1分钟后
  3. 第2次重试: 5分钟后
  4. 第3次重试: 15分钟后
  5. 第4次重试: 1小时后
  6. 第5次重试: 3小时后
  7. 最后重试: 24小时后

处理重试

安全最佳实践

1. 验证签名

始终验证 Webhook 签名以确保请求来自 Payve:

2. 使用 HTTPS

确保您的 Webhook 端点使用 HTTPS:

// 强制 HTTPS
app.use((req, res, next) => {
  if (req.header('x-forwarded-proto') !== 'https') {
    return res.status(403).send('HTTPS required');
  }
  next();
});

3. IP 白名单(可选)

限制只接受来自 Payve 服务器的请求:

4. 限流

防止 Webhook 端点被滥用:

const rateLimit = require('express-rate-limit');
 
const webhookLimiter = rateLimit({
  windowMs: 1 * 60 * 1000, // 1分钟
  max: 100, // 最多100个请求
  message: 'Too many requests'
});
 
app.use('/webhook/payve', webhookLimiter);

测试 Webhook

1. 使用测试工具

在商户后台使用测试工具发送测试通知:

2. 本地测试

使用 ngrok 等工具将本地服务暴露到公网:

# 安装 ngrok
npm install -g ngrok
 
# 暴露本地 3000 端口
ngrok http 3000
 
# 获得公网 URL,例如:https://abc123.ngrok.io
# 在 Payve 后台配置:https://abc123.ngrok.io/webhook/payve

3. 模拟 Webhook

创建测试脚本模拟 Webhook 请求:

故障排查

常见问题

  1. 未收到 Webhook

    • 检查 Webhook URL 是否正确
    • 确认服务器可以从公网访问
    • 查看商户后台的 Webhook 日志
  2. 签名验证失败

    • 确认使用正确的密钥
    • 检查是否正确获取原始请求体
    • 验证时间戳是否在容差范围内
  3. 重复处理事件

    • 实现幂等性检查
    • 使用 eventId 去重
    • 正确返回 200 状态码
  4. 处理超时

    • 异步处理耗时操作
    • 先返回 200,后台处理
    • 优化数据库查询

监控和日志

下一步

相关资源