You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord交互端点设置遇验证失败问题求助

Discord交互端点验证失败问题排查

问题详情

我正在配置Discord交互端点,但始终无法通过验证。当前使用的Django代码如下:

@csrf_exempt
def discord_endpoint(request):
     return JsonResponse({'type':1})

收到的验证错误提示:

Validation errors:
interactions_endpoint_url: The specified interactions endpoint url could not be verified.

Discord发送到我的Django应用的POST请求内容(已转译转义字符):

{"application_id":"...","entitlements":[],"id":"...","token":"...","type":1,"user":{"avatar":"...","avatar_decoration":null,"discriminator":"0","global_name":"...","id":"...","public_flags":0,"username":"nickname"},"version":1}

解决步骤

  • 确认请求解析与响应格式
    Discord发送的是JSON格式POST请求,Django默认不会自动解析这类请求体,需要手动读取并解析。同时要确保响应的Content-Type是application/json(Django的JsonResponse会自动设置,但要确认没有被中间件修改)。修改后的基础代码:

    import json
    from django.http import JsonResponse
    from django.views.decorators.csrf import csrf_exempt
    
    @csrf_exempt
    def discord_endpoint(request):
        if request.method == 'POST':
            try:
                data = json.loads(request.body)
                if data.get('type') == 1:
                    return JsonResponse({'type': 1})
            except json.JSONDecodeError:
                pass
        return JsonResponse({'error': 'Invalid request'}, status=400)
    
  • 必须验证Discord请求签名
    这是验证失败的核心原因之一,Discord要求端点必须验证请求签名才能通过审核。需要安装pynacl库处理签名验证,代码示例:

    import json
    import nacl.signing
    import nacl.encoding
    from django.http import JsonResponse, HttpResponseForbidden
    from django.views.decorators.csrf import csrf_exempt
    
    # 替换为你的Discord应用公钥,在开发者后台获取
    DISCORD_PUBLIC_KEY = "你的应用公钥"
    
    @csrf_exempt
    def discord_endpoint(request):
        # 提取签名相关头信息
        signature = request.headers.get('X-Signature-Ed25519')
        timestamp = request.headers.get('X-Signature-Timestamp')
        body = request.body.decode('utf-8')
    
        if not signature or not timestamp:
            return HttpResponseForbidden()
    
        # 验证签名
        try:
            verify_key = nacl.signing.VerifyKey(DISCORD_PUBLIC_KEY, encoder=nacl.encoding.HexEncoder)
            verify_key.verify(f"{timestamp}{body}".encode('utf-8'), signature=signature, encoder=nacl.encoding.HexEncoder)
        except nacl.exceptions.BadSignatureError:
            return HttpResponseForbidden()
    
        # 处理PING请求
        data = json.loads(body)
        if data.get('type') == 1:
            return JsonResponse({'type': 1})
        
        return JsonResponse({'error': 'Unsupported request type'}, status=400)
    
  • 检查端点公网可达性
    Discord的验证请求需要能访问到你的端点,确保服务部署在公网服务器,或者用工具(如ngrok)临时暴露本地服务,同时确认端口、路由没有被防火墙或反向代理拦截。

  • 确认CSRF豁免生效
    确保@csrf_exempt装饰器直接应用在视图函数上方,没有缩进错误;如果是基于类的视图,需要装饰dispatch方法。

内容的提问来源于stack exchange,提问作者laxmymow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:33:18