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

基于Django开发USSD应用遇invalid(empty) response错误求助

问题:Django开发USSD应用返回invalid(empty) response,无法显示菜单

我用Django结合指定API开发USSD应用,已获取API响应并初始化待处理数据,但无法在用户手机上显示菜单(MSG参数),报错为invalid(empty) response。

参数说明

  • USERID:NALO提供给客户端的ID
  • MSISDN:用户的手机号码
  • MSG:需显示在用户手机上的必填消息参数
  • MSGTYPE:标识会话是否继续(True/false)

我的代码实现

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
import json
import requests

@csrf_exempt
def ussd(request):
    if request.method == 'GET':
        html = "<html><body>Nothing here baby!</body></html>"
        return HttpResponse(html)
    elif request.method == 'POST':
        url = "https://99c9-102-176-94-213.ngrok.io/ussd"
        response_data = json.loads(request.body)
        code_id   = response_data["USERID"]
        serviceCode  = response_data["MSISDN"]
        type = response_data["MSGTYPE"]
        session_id = response_data["SESSIONID"]
        text         = response_data["USERDATA"]
        msg = ""
        if text == "":
            msg = "Welcome To TEST Dev"
        elif text == "1":
            msg = "This is Test Two"
        payload ={
                "USERID": code_id,
                "MSISDN": serviceCode,
                "MSGTYPE": type,
                "USERDATA": text,
                "SESSIONID": session_id,
                "MSG": msg,
            }
        headers = {
            'Content-Type': 'application/json'
        }
        response = requests.request("POST", url, headers=headers, data=json.dumps(payload))
        return HttpResponse(response, status=200)

问题分析与修复方案

核心问题

  1. 错误的请求转发:代码里向自身URL发送POST请求,再直接返回requests的Response对象给Django的HttpResponse,完全不符合USSD网关的交互逻辑——网关需要你直接返回构造好的菜单响应,而非转发请求的结果。
  2. 响应格式错误:HttpResponse(response)会把requests的Response对象转换成字符串,导致返回内容不是网关期望的JSON格式,触发"invalid(empty) response"报错。
  3. MSGTYPE参数未正确处理:直接复用请求中的type值,没有根据业务逻辑设置会话是否继续,可能导致菜单无法正常交互。

修复后的代码

from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json

@csrf_exempt
def ussd(request):
    if request.method == 'GET':
        return HttpResponse("<html><body>Nothing here baby!</body></html>")
    elif request.method == 'POST':
        response_data = json.loads(request.body)
        code_id = response_data["USERID"]
        msisdn = response_data["MSISDN"]
        session_id = response_data["SESSIONID"]
        text = response_data["USERDATA"]
        
        msg = ""
        # 根据用户输入设置菜单消息和会话状态
        if text == "":
            msg = "Welcome To TEST Dev\n1. 测试选项"
            msg_type = True  # 会话继续,等待用户输入
        elif text == "1":
            msg = "This is Test Two\n0. 返回主菜单"
            msg_type = True
        # 可添加更多分支,比如结束会话的逻辑
        elif text == "99":
            msg = "感谢使用,再见!"
            msg_type = False  # 结束会话
        
        # 构造符合要求的响应 payload
        payload = {
            "USERID": code_id,
            "MSISDN": msisdn,
            "MSGTYPE": msg_type,
            "USERDATA": text,
            "SESSIONID": session_id,
            "MSG": msg,
        }
        # 使用JsonResponse直接返回JSON格式响应,自动处理Content-Type
        return JsonResponse(payload)

关键修复点

  • 移除了不必要的requests请求,直接构造响应返回给USSD网关。
  • 使用JsonResponse替代HttpResponse,自动完成JSON序列化并设置正确的Content-Type: application/json头,确保网关能解析响应。
  • 根据业务逻辑主动设置MSGTYPE的值,明确标识会话是否继续,保证菜单交互流程正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:19:04