如何实现AppSumo Webhook的URL验证,响应指定事件?
解决AppSumo Webhook验证问题的PHP实现
核心修改方向
- 新增JSON响应头,确保返回格式符合AppSumo要求
- 解析Webhook发送的JSON payload,提取事件类型
- 验证事件类型是否为
activate/deactivate/purchase三类之一 - 返回200 OK状态及指定结构的JSON响应
- 保留原有数据记录功能,同时补充错误日志排查机制
完整代码实现
<?php require_once __DIR__ . '/vendor/autoload.php'; require_once 'config.php'; ini_set("error_log", "appsumo.errors.log.txt"); // 设置JSON响应头,确保AppSumo能正确解析返回内容 header('Content-Type: application/json'); // 明确返回200 OK状态码 http_response_code(200); // 获取POST原始数据 $data = file_get_contents('php://input'); if (empty($data)) { echo json_encode(['success' => false, 'message' => 'No data received']); exit; } // 解析JSON payload为关联数组 $payload = json_decode($data, true); if (json_last_error() !== JSON_ERROR_NONE) { error_log('Invalid JSON payload received: ' . $data); echo json_encode(['success' => false, 'message' => 'Invalid JSON format']); exit; } // 提取事件类型,兼容字段不存在的情况 $eventType = $payload['event_type'] ?? ''; // 定义允许的事件类型列表 $validEventTypes = ['activate', 'deactivate', 'purchase']; // 验证事件类型合法性 if (!in_array($eventType, $validEventTypes)) { error_log('Unsupported event type received: ' . $eventType); echo json_encode(['success' => false, 'message' => 'Unsupported event type']); exit; } // 将Webhook数据追加写入日志文件 $logFile = fopen('appsumo-webhook-data.txt', "a"); if ($logFile) { fwrite($logFile, $data . PHP_EOL . PHP_EOL); fclose($logFile); } else { error_log('Failed to open log file: appsume-webhook-data.txt'); } // 返回AppSumo验证要求的JSON响应 echo json_encode([ 'success' => true, 'event_type' => $eventType ]); ?>
关键说明
- 响应头设置:必须优先设置
Content-Type: application/json,否则AppSumo无法识别返回的JSON内容 - 事件类型校验:严格检查
event_type字段是否属于允许的三类,避免处理非法事件请求 - 错误处理:针对空数据、无效JSON、非法事件类型分别返回错误响应,并记录到错误日志,便于后续排查
- 数据记录:保留原有日志功能,同时增加文件打开失败的错误日志,确保数据记录环节的可靠性
- 状态码:明确返回200 OK,完全满足AppSumo的Webhook验证要求
内容的提问来源于stack exchange,提问作者anjanesh
相关产品推荐
相关产品推荐

