Solved

Problem with Twilio StatusCallback. Logs show a POST but something is amiss

Posted on 2012-12-23
3
1,390 Views
Last Modified: 2012-12-23
Hi
I've been trying to see what is wrong for literally hours and still can't figure out why its not working.
I'm hoping if I post my complete code, perhaps someone will see something I've missed:

1) I am receiving a Statuscallback when checking my logs. Here is the latest I've tried (so I see my callback is working/this is direct from my logs):

23.23.3.152 - - [22/Dec/2012:13:16:01 -0400] "POST /app/assets/phone/contests/text_complete.php?contestid=307&account_id=17&callername=NS+Wireless+Call&callercity=HALIFAX&callerstate=NS HTTP/1.1" 200 160 "-" "TwilioProxy/0.7"

2) The total code for text_complete.php code is this:
<?php

	$callsid = $_REQUEST['SmsSid'];
	$callstatus=$_REQUEST['SmsStatus'];
	$to=$_REQUEST['To'];
	$contestid=$_REQUEST['contestid'];
	$account_id=$_REQUEST['account_id'];
	$body = $_REQUEST['Body'];
	$callername=$_REQUEST['callername'];
	$callercity=$_REQUEST['callercity'];
	$callerstate=$_REQUEST['callerstate'];
	$fromcaller=$_REQUEST['From'];	
	
	include '../../db/config.php';
	include '../../db/functions.php';
	

	
//make pretty looking phone number for table display using function
	$fromcallerdisplay = FromCallerDisplay($fromcaller);
	$tocallerdisplay = ToCallerDisplay($to);

//adjust time for incoming calls from timezone using function
$newtime =  GetRightTime($account_id);


$result = mysql_query("SELECT PhoneRate, account_id FROM numbers WHERE PhoneNumber = '$fromcaller' AND PhoneType = 2 LIMIT 1");
while ($row = mysql_fetch_array($result)) {
$phonerate = $row["PhoneRate"];
$account_id = $row["account_id"];
}
mysql_free_result($result);


$sql="INSERT INTO callers (account_id, CallType, CallDirection, ContestId, CallTo, ToCallerDisplay, CallSid, CallerName, CallerCity, CallerState, FromCaller, FromCallerDisplay, Body, CallStatus, CallDate, CallDuration, CallCost, SubscribeStatus)VALUES('$account_id','1','Outgoing','$contestid','$to','$tocallerdisplay','$callsid','$callername','$callercity','$callerstate','$fromcaller','$fromcallerdisplay','$body','$callstatus','$newtime','1','$phonerate','Pending')";
$result=mysql_query($sql);
       	
?>

Open in new window

When I go through the steps in my application, I see no errors in my logs and I see the statuscallback executed in the logs as shown at the top of the page.

If I simply try this url with the bare minimum of a variable attached: http://mydomain.com/app/assets/phone/contests/text_complete.php?account_id=17

The query will work and it will insert into my database the bare minimum. (I was doing this to double-check my query can insert OK). So it seems if even just the account_id is passed, I'll get an insert into my db.

When I plug in the test url above as my statuscallback url with just the required account_id... it doesn't work.

I can see the now shortened statuscallback in my logs show up... but for some reason it won't insert a record.

I simply can't figure out why it isn't inserting a record, even when I do the bare minimum url as my Statuscallback.

Is there some kind of permissions thing perhaps? Where you can visit the url and it will insert, but a callback won't insert?? Just trying to find some new direction to investigate.

Just in case, this is what my StatusCallback code looks like (maybe in case there is something wrong with the way its being formed?)
$subscribestatusmessage = "Hello from $company_name in $city! To subscribe, reply back with the word 'GO' and you are in.";

			/* Include the Twilio PHP library */
			require "../api/Twilio.php";

			/* Set our AccountSid and AuthToken */
			$AccountSid = "mysid";
			$AuthToken = "mytoken";
	
			$client = new Services_Twilio($AccountSid, $AuthToken);
   			
   			$options = array("StatusCallback" => "http://mydomain.com/app/assets/phone/contests/text_complete.php?contestid=".urlencode($contestid)."&account_id=".urlencode($account_id)."&callername=".urlencode($callername)."&callercity=".urlencode($callercity)."&callerstate=".urlencode($callerstate));

   			$sms = $client->account->sms_messages->create(
   			$textcalldisplay,
   			$fromcaller,
   			$subscribestatusmessage,
   			$options
   			);

Open in new window

0
Comment
Question by:tjyoung
  • 2
3 Comments
 
LVL 108

Accepted Solution

by:
Ray Paseur earned 500 total points
Comment Utility
Scanning down from the top...

...HALIFAX&callerstate=NS HTTP/1.1 This looks slightly suspect.  Is that supposed to be a blank in a URL?

In text_complete.php you might want to add these two lines at the top:

ob_start();
error_reporting(E_ALL);

and then somewhere near the bottom add something like this:

$buf = ob_get_clean();
mail('you@your.org', 'text_complete.php', $buf);

The effect of this will be to capture all the messages inside that script and send them to you via email.  You may find something interesting in there!

Lines of code like this are a sure recipe for catastrophe:

$result = mysql_query(...
while ($row = mysql_fetch_array($result))

The mysql_query() function produces a return value, and your script must test the return value for success or failure!  MySQL is not a black box; it can and will fail for reasons that are outside of your control, and your programming must catch these failures and handle them somehow, even if handling only means sending you the error message.  Reconstruct your data base calls using a pattern like this, so you can see the query and the failure at the same time.

$sql = "SELECT PhoneRate, account_id ...
$res = mysql_query(...
if (!$res) die("FAIL: $sql BECAUSE OF: " . mysql_error());
while ($row = mysql_fetch_assocr($res))...

A similar test needs to be made for the INSERT queries - as written they can fail silently and you'll not get a clue as to what went wrong.

Hope that gives you some ideas to start the investigation, ~Ray
0
 
LVL 1

Author Closing Comment

by:tjyoung
Comment Utility
Thanks gives me plenty to work with.
0
 
LVL 108

Expert Comment

by:Ray Paseur
Comment Utility
Thanks for the points and thanks for using EE.  And Merry Christmas! ~Ray
0

Featured Post

Free Gift Card with Acronis Backup Purchase!

Backup any data in any location: local and remote systems, physical and virtual servers, private and public clouds, Macs and PCs, tablets and mobile devices, & more! For limited time only, buy any Acronis backup products and get a FREE Amazon/Best Buy gift card worth up to $200!

Join & Write a Comment

Does the idea of dealing with bits scare or confuse you? Does it seem like a waste of time in an age where we all have terabytes of storage? If so, you're missing out on one of the core tools in every professional programmer's toolbox. Learn how to …
Creating and Managing Databases with phpMyAdmin in cPanel.
Learn how to match and substitute tagged data using PHP regular expressions. Demonstrated on Windows 7, but also applies to other operating systems. Demonstrated technique applies to PHP (all versions) and Firefox, but very similar techniques will w…
The viewer will learn how to look for a specific file type in a local or remote server directory using PHP.

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

5 Experts available now in Live!

Get 1:1 Help Now