Search code examples
c#jsonunity-game-enginetwiliotwilio-api

I'm using UnityWebRequest with C# to send messages through twilio, but keep getting the error "A 'to' phone number is required."


I've tested my Twilio number and personal number using Twilios website API so I know the problem isn't with either of them. Using the below method and any phone number I try as recipientPhoneNumber in the '+1xxxxxxxxxx' format returns the error:

Twilio API Response Text: {"code": 21604, "message": "A 'To' phone number is required.", "more_info": "https://www.twilio.com/docs/errors/21604", "status": 400}
Twilio API request error: HTTP/1.1 400 Bad Request
Twilio API Request Method: POST

I assumed I should be able to use any phone number, but to be safe I even verified my number as a 'Caller ID' within Twilio. I've encountered errors related to my account SID and Auth, and resolved them so I know they aren't the problem.

public IEnumerator SendMessage(string recipientPhoneNumber, string message)
{
    // Create the JSON payload for the request
    Debug.Log("The recipient phone number is: " + recipientPhoneNumber);
    string jsonPayload = JsonUtility.ToJson(new
    {
        from = twilioPhoneNumber,
        to = recipientPhoneNumber,
        body = message
    });

    // Create the UnityWebRequest object
    UnityWebRequest request = UnityWebRequest.Post(twilioMessagesApiUrlFormatted, 
    jsonPayload);

    // Set the authorization header with your Account SID and Auth Token
    string auth = accountSid + ":" + authToken;
    string base64Auth = 
    System.Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(auth));
    string authorizationHeader = "Basic " + base64Auth;
    request.SetRequestHeader("Authorization", authorizationHeader);
    request.SetRequestHeader("Content-Type", "application/json");

    // Send the HTTP request
    request.uploadHandler = new 
    UploadHandlerRaw(System.Text.Encoding.UTF8.GetBytes(jsonPayload));
    request.downloadHandler = new DownloadHandlerBuffer();
    yield return request.SendWebRequest();
   
    
}

I recently created my Twilio account and don't have strong experience with it so let me know if I need to make some configurations in the console or if something in my code is causing the recipient phone number to be misread or not sent correctly.

I call the method with

StartCoroutine(twilioSMS.SendMessage("+1xxxxxxxxxx", "This is a test message"));

Within the method I've even printed the 'from', 'to', 'body' so I know the method is receiving them.

Any guidance here would be of great help. Thanks


Solution

  • Sending an outgoing message in Twilio requires use of x-www-form-urlencoded format. The SendMessage method now uses a dictionary (formData) to hold the form data, and the UnityWebRequest.Post method is used to send the request with the form data.

    public IEnumerator SendMessage(string recipientPhoneNumber, string message)
    {
        // Create a dictionary to hold the form data
        Dictionary<string, string> formData = new Dictionary<string, string>
        {
            { "From", twilioPhoneNumber },
            { "To", recipientPhoneNumber },
            { "Body", message }
        };
    
        // Create the UnityWebRequest object
        UnityWebRequest request = UnityWebRequest.Post(twilioMessagesApiUrlFormatted, formData);
    
        // Set the authorization header with your Account SID and Auth Token
        string auth = accountSid + ":" + authToken;
        string base64Auth = System.Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(auth));
        string authorizationHeader = "Basic " + base64Auth;
        request.SetRequestHeader("Authorization", authorizationHeader);
    
        // Send the HTTP request
        yield return request.SendWebRequest();
    
    }