# 调试指南⭐

<div class="qiwe-hero" style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 28px 32px; margin-bottom: 24px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
 <h1 style="margin: 0 0 10px 0; font-size: 26px; font-weight: 600; color: inherit; border: none; padding-bottom: 0;">Webhook 调试指南</h1>
 <p style="margin: 0 0 16px 0; font-size: 15px; color: inherit; line-height: 1.6;">
 Webhook 用于接收平台推送的实时事件（登录状态、好友变化、群消息等）。事件发生时，系统向配置的回调地址发送 HTTP POST 请求，数据格式为 JSON。
 </p>
 <div style="display: flex; flex-wrap: wrap; gap: 8px; font-size: 13px;">
 <span class="qiwe-tag" style="background: rgba(255, 247, 230, 0.55); border: 1px solid rgba(255, 213, 145, 0.65); border-radius: 4px; padding: 2px 10px; color: #AD6800; font-weight: 500;">Webhook</span>
 <span class="qiwe-tag" style="background: rgba(255, 247, 230, 0.55); border: 1px solid rgba(255, 213, 145, 0.65); border-radius: 4px; padding: 2px 10px; color: #AD6800; font-weight: 500;">本地调试</span>
 <span class="qiwe-tag" style="background: rgba(255, 247, 230, 0.55); border: 1px solid rgba(255, 213, 145, 0.65); border-radius: 4px; padding: 2px 10px; color: #AD6800; font-weight: 500;">ngrok 穿透</span>
 <span class="qiwe-tag" style="background: rgba(255, 247, 230, 0.55); border: 1px solid rgba(255, 213, 145, 0.65); border-radius: 4px; padding: 2px 10px; color: #AD6800; font-weight: 500;">HTTP 200</span>
 </div>
</div><div style="margin-bottom: 28px;">
 <h2 style="margin: 0 0 14px 0; font-size: 18px; font-weight: 600; color: inherit; border: none; padding-bottom: 0; border-left: 3px solid #FA8C16; padding-left: 12px;">接入流程</h2>
 
<div style="background: rgba(255, 247, 230, 0.2); border: 1px solid rgba(255, 236, 202, 0.65); border-radius: 8px; padding: 20px 24px;">
 <ol style="margin: 0; padding-left: 20px; font-size: 14px; color: inherit; line-height: 1.8;">
 <li style="margin-bottom: 6px;">在控制台配置 Webhook 回调地址</li>
 <li style="margin-bottom: 6px;">启动设备并保持在线</li>
 <li style="margin-bottom: 6px;">触发相关事件（扫码登录、加好友、发送消息等）</li>
 <li>服务端接收回调并解析 JSON 数据</li>
 </ol>
</div>

</div><div style="margin-bottom: 28px;">
 <h2 style="margin: 0 0 14px 0; font-size: 18px; font-weight: 600; color: inherit; border: none; padding-bottom: 0; border-left: 3px solid #FA8C16; padding-left: 12px;">回调请求说明</h2>
 
<div style="background: rgba(255, 247, 230, 0.2); border: 1px solid rgba(255, 236, 202, 0.65); border-radius: 8px; padding: 20px 24px;">
 <p style="margin: 0; font-size: 14px; color: inherit; line-height: 1.7; margin-bottom: 12px;">请求方式</p>
```js
POST
Content-Type: application/json
```

 <p style="margin: 0; font-size: 14px; color: inherit; line-height: 1.7; margin: 16px 0 12px 0;">回调示例</p>
```json
{
 "data": [{
 "cmd": 15500,
 "msgServerId": 1017723,
 "msgType": 2131,
 "msgUniqueIdentifier": "9FcHZl98QZK_AlX",
 "senderId": 10030,
 "seq": 9409929,
 "timestamp": 1682676419
 }],
 "error": 0,
 "msg": "成功"
}
```
</div>

</div><div style="margin-bottom: 28px;">
 <h2 style="margin: 0 0 14px 0; font-size: 18px; font-weight: 600; color: inherit; border: none; padding-bottom: 0; border-left: 3px solid #FA8C16; padding-left: 12px;">调试方法</h2>
 
<div style="background: rgba(255, 247, 230, 0.2); border: 1px solid rgba(255, 236, 202, 0.65); border-radius: 8px; padding: 20px 24px;">
 <h3 style="margin: 0 0 8px 0; font-size: 15px; font-weight: 600; color: inherit;">本地调试</h3>
 <p style="margin: 0; font-size: 14px; color: inherit; line-height: 1.7; margin-bottom: 16px;">本地服务可使用 ngrok 等内网穿透工具暴露为公网地址，再填入 Webhook URL。</p>

 <h3 style="margin: 0 0 8px 0; font-size: 15px; font-weight: 600; color: inherit;">校验要点</h3>
 <ul style="margin: 0 0 16px; padding-left: 20px; font-size: 14px; color: inherit; line-height: 1.8;">
 <li>回调接口须返回 HTTP 200</li>
 <li>地址须公网可访问</li>
 <li>按 JSON 格式正确解析数据</li>
 </ul>

 <h3 style="margin: 0 0 8px 0; font-size: 15px; font-weight: 600; color: inherit;">常见调试问题</h3>
 <div style="width:100%; border:1px solid rgba(255, 236, 202, 0.65); border-radius:6px; overflow:hidden; font-size:13px; margin-top: 8px;">
 <div style="display:flex; width:100%; background:rgba(255, 247, 230, 0.35);">
 <div style="width:120px; flex-shrink:0; padding:10px 12px; border-right:1px solid rgba(255, 236, 202, 0.65); border-bottom:1px solid rgba(255, 236, 202, 0.65); font-weight:600;">问题</div>
 <div style="width:140px; flex-shrink:0; padding:10px 12px; border-right:1px solid rgba(255, 236, 202, 0.65); border-bottom:1px solid rgba(255, 236, 202, 0.65); font-weight:600;">可能原因</div>
 <div style="flex:1; min-width:0; padding:10px 12px; border-bottom:1px solid rgba(255, 236, 202, 0.65); font-weight:600;">解决方案</div>
 </div>
 <div style="display:flex; width:100%;">
 <div style="width:120px; flex-shrink:0; padding:8px 12px; border-right:1px solid rgba(255, 236, 202, 0.65); border-bottom:1px solid rgba(255, 236, 202, 0.65); opacity:0.85;">收不到回调</div>
 <div style="width:140px; flex-shrink:0; padding:8px 12px; border-right:1px solid rgba(255, 236, 202, 0.65); border-bottom:1px solid rgba(255, 236, 202, 0.65); opacity:0.85;">URL 不可公网访问</div>
 <div style="flex:1; min-width:0; padding:8px 12px; border-bottom:1px solid rgba(255, 236, 202, 0.65); opacity:0.85;">检查防火墙/安全组，确保端口开放</div>
 </div>
 <div style="display:flex; width:100%;">
 <div style="width:120px; flex-shrink:0; padding:8px 12px; border-right:1px solid rgba(255, 236, 202, 0.65); border-bottom:1px solid rgba(255, 236, 202, 0.65); opacity:0.85;">收不到回调</div>
 <div style="width:140px; flex-shrink:0; padding:8px 12px; border-right:1px solid rgba(255, 236, 202, 0.65); border-bottom:1px solid rgba(255, 236, 202, 0.65); opacity:0.85;">地址未正确设置</div>
 <div style="flex:1; min-width:0; padding:8px 12px; border-bottom:1px solid rgba(255, 236, 202, 0.65); opacity:0.85;">重新调用 <code style="color: inherit; background: rgba(82, 196, 26, 0.08); border: 1px solid rgba(82, 196, 26, 0.1); padding: 2px 4px; border-radius: 3px;">设置回调地址</code> 接口</div>
 </div>
 <div style="display:flex; width:100%;">
 <div style="width:120px; flex-shrink:0; padding:8px 12px; border-right:1px solid rgba(255, 236, 202, 0.65); border-bottom:1px solid rgba(255, 236, 202, 0.65); opacity:0.85;">数据异常</div>
 <div style="width:140px; flex-shrink:0; padding:8px 12px; border-right:1px solid rgba(255, 236, 202, 0.65); border-bottom:1px solid rgba(255, 236, 202, 0.65); opacity:0.85;">解析逻辑错误</div>
 <div style="flex:1; min-width:0; padding:8px 12px; border-bottom:1px solid rgba(255, 236, 202, 0.65); opacity:0.85;">检查 JSON 结构，确认 <code style="color: inherit; background: rgba(82, 196, 26, 0.08); border: 1px solid rgba(82, 196, 26, 0.1); padding: 2px 4px; border-radius: 3px;">cmd</code> 字段</div>
 </div>
 <div style="display:flex; width:100%;">
 <div style="width:120px; flex-shrink:0; padding:8px 12px; border-right:1px solid rgba(255, 236, 202, 0.65); border-bottom:1px solid rgba(255, 236, 202, 0.65); opacity:0.85;">回调超时</div>
 <div style="width:140px; flex-shrink:0; padding:8px 12px; border-right:1px solid rgba(255, 236, 202, 0.65); border-bottom:1px solid rgba(255, 236, 202, 0.65); opacity:0.85;">处理过慢</div>
 <div style="flex:1; min-width:0; padding:8px 12px; border-bottom:1px solid rgba(255, 236, 202, 0.65); opacity:0.85;">先返回 200，再异步处理业务</div>
 </div>
 <div style="display:flex; width:100%;">
 <div style="width:120px; flex-shrink:0; padding:8px 12px; border-right:1px solid rgba(255, 236, 202, 0.65); opacity:0.85;">鉴权失败</div>
 <div style="width:140px; flex-shrink:0; padding:8px 12px; border-right:1px solid rgba(255, 236, 202, 0.65); opacity:0.85;">密钥不匹配</div>
 <div style="flex:1; min-width:0; padding:8px 12px; opacity:0.85;">检查 <code style="color: inherit; background: rgba(82, 196, 26, 0.08); border: 1px solid rgba(82, 196, 26, 0.1); padding: 2px 4px; border-radius: 3px;">authSecret</code> 配置</div>
 </div>
 </div>

 <div style="background: rgba(255, 247, 230, 0.35); border-left: 3px solid #FA8C16; border-radius: 0 6px 6px 0; padding: 12px 16px; margin-top: 14px;">
 <p style="margin: 0; font-size: 13px; color: inherit; line-height: 1.7; opacity: 0.85;">建议回调处理函数先快速返回 HTTP 200，再进行耗时业务处理，避免因超时导致推送失败。</p>
 </div>
</div>

</div>
