基于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)
问题分析与修复方案
核心问题
- 错误的请求转发:代码里向自身URL发送POST请求,再直接返回requests的Response对象给Django的HttpResponse,完全不符合USSD网关的交互逻辑——网关需要你直接返回构造好的菜单响应,而非转发请求的结果。
- 响应格式错误:
HttpResponse(response)会把requests的Response对象转换成字符串,导致返回内容不是网关期望的JSON格式,触发"invalid(empty) response"报错。 - 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
相关产品推荐
相关产品推荐

