Search code examples
jsondjangopython-3.xvonage

voice call ends right away, nexmo hangs up within a second


I have created an application in the Nexmo dashboard with an event url and answer url. I run the following code I got from Nexmo´s GitHub:

client = nexmo.Client(key=api_key, secret=api_secret, application_id=application_key, private_key=private_key)

response = client.create_call({
  'to': [{'type': 'phone', 'number': 'call_to_number'}],
  'from': {'type': 'phone', 'number': 'call_from_number'},
  'answer_url': ['http://my_event_url']
})

And the phonenumber is called, but nexmo hangs up right away (within a second without saying anything).

On my server I see Nexmo calls the answer url (with the ncco)

what I do when the answer url is called:

import nexmo
import json
from django.http import JsonResponse

@csrf_exempt
def answer(request):

    ncco = [{
      "action": "talk",
      "voiceName": "Amy",
      "text": "Thank you for calling Nexmo. Please leave your message after the tone."
    }]

    d = json.dumps(ncco)
    j = is_json(d)
    if j:
        MyObject.objects.create(message="valid")
    else:
        MyObject.objects.create(message=user_ip + "json error")

    return JsonResponse(d, status=200, safe=False)


def is_json(myjson):
    try:
        json_object = json.loads(myjson)
    except ValueError:
        return False
    return True

This is what I do when my event_url is called:

@csrf_exempt
def event(request):

    d = json.dumps(request.POST)
    DataReceived.objects.create(answer=d)

    data = {"ok": True}

    return JsonResponse(data, status=200)

The event url is called 5 times by Nexmo but the dictionaries are always empty.


Solution

  • `I think you might be "double JSON dumping" your NCCO,

    you create the ncco as a python dict, then turn that into a json string with d = json.dumps(ncco) and then you are calling JsonResponse on it, try passing the ncco object to JsonResponse

    return JsonResponse(ncco, status=200, safe=False)