Подключение к Twilio SMS через прокси в PHP

Я тестирую Twilio для использования в качестве нашего решения для SMS, однако у меня возникают проблемы с его работой за нашим прокси-сервером.

Я пробовал:

$twiliohttp = new Services_Twilio_TinyHttp(
        "https://api.twilio.com",
        array("curlopts" => array(
    CURLOPT_USERAGENT => self::USER_AGENT,
    CURLOPT_HTTPHEADER => array('Accept-Charset: utf-8'),
    CURLOPT_CAINFO => dirname(__FILE__) . '/cacert.pem',
    CURLOPT_PROXY => '3.X.X.X:9400',
    ))
);
$client = new Services_Twilio($account_sid, $auth_token, null, $twiliohttp );


$message = $client->account->messages->sendMessage(
  '+441432XXXX31', // From a Twilio number in your account
  '+44776XXXX712', // Text any number
  "Hello monkey!"
);

Затем я получаю сообщение об ошибке: Неустранимая ошибка: невозможно получить доступ к self:: когда область класса не активна в /var/www/twiliosms.php в строке 16.

Поэтому я изменил файл Twilio.php, изменив массив curlopts, добавив:

CURLOPT_PROXY => '3.X.X.X:9400',

и вызов Twilio с помощью:

$client = new Services_Twilio($account_sid, $auth_token );
$message = $client->account->messages->sendMessage(
  '+4414XXXXXXX1', // From a Twilio number in your account
  '+4477XXXXXXX2', // Text any number
  "Hello monkey!"
);

Но затем я получаю сообщение об ошибке:

Fatal error: Uncaught exception 'Services_Twilio_RestException' with message 'Could not decode response body as JSON. This likely indicates a 500 server error' in /var/www/GE/includes/SMS/Twilio.php:288
Stack trace:
#0 /var/www/GE/includes/SMS/Twilio.php(181): Base_Services_Twilio->_processResponse(Array)
#1 /var/www/GE/includes/SMS/Twilio/ListResource.php(92): Base_Services_Twilio->createData('/2010-04-01/Acc...', Array)
#2 /var/www/GE/includes/SMS/Twilio/Rest/Messages.php(24): Services_Twilio_ListResource->_create(Array)
#3 /var/www/GE/includes/SMS/Twilio/Rest/Messages.php(71): Services_Twilio_Rest_Messages->create(Array)
#4 /var/www/GE/twiliosms.php(35): Services_Twilio_Rest_Messages->sendMessage('+441432233131', '+447766205712', 'Hello monkey!')
#5 {main}
  thrown in /var/www/GE/includes/SMS/Twilio.php on line 288

Любые идеи, как заставить это решение работать через прокси-сервер, который не разрешает входящие подключения?

Заранее спасибо.


person trevrobwhite    schedule 20.10.2015    source источник


Ответы (2)


Рики из Twilio здесь.

Хотя я не смог протестировать вашу точную настройку прокси, я думаю, что первое решение, которое вы попробовали, будет работать, если вы жестко запрограммируете пользовательский агент. Например:

$twiliohttp = new Services_Twilio_TinyHttp(
        "https://api.twilio.com",
        array("curlopts" => array(
    CURLOPT_USERAGENT => "Twilio Proxy/1.0",
    CURLOPT_HTTPHEADER => array('Accept-Charset: utf-8'),
    CURLOPT_CAINFO => dirname(__FILE__) . '/cacert.pem',
    CURLOPT_PROXY => '3.X.X.X:9400',
    ))
);

Вам также может потребоваться внести изменения в библиотеку TinyHttp, показанную здесь.

person rickyrobinett    schedule 20.10.2015
comment
Теперь я получаю: Неустранимая ошибка: необработанное исключение «Services_Twilio_RestException» с сообщением «Не удалось декодировать тело ответа как JSON. Вероятно, это указывает на ошибку сервера 500 в /var/www/GE/includes/SMS/Twilio.php:288. - person trevrobwhite; 20.10.2015
comment
В Twilio.php в строке 288 вы пытаетесь сбросить полученный ответ. Глядя на этот ответ, вы можете лучше понять, почему мы не можем проанализировать запрос как json: private function _processResponse($response) { var_dump($response); - person rickyrobinett; 20.10.2015
comment
Он возвращает ошибку 404, однако я могу без проблем подключиться к этому прокси, есть ли шанс, что вы сможете провести сеанс поддержки? Наш прокси разрешает https только в том случае, если это строка проблемы (581) HTTP/1.1 404 NOT FOUND Access-Control-Allow-Credentials: true Access-Control-Allow-Headers: Accept, Authorization, Content-Type, If-Match, If -Modified-Since, If-None-Match, If-Unmodified-Since Access-Control-Allow-Methods: GET, POST, DELETE, OPTIONS Access-Control-Allow-Origin: * - person trevrobwhite; 20.10.2015
comment
Определенно похоже, что это может быть легче отлаживать вместе. Хочешь, напиши мне по электронной почте, и мы что-нибудь придумаем — [email protected]? - person rickyrobinett; 20.10.2015

Большое спасибо RickyRobinett за то, как решить проблему, я публикую этот ответ с полным решением, чтобы людям не приходилось копаться в плохо отформатированных комментариях.

Обновите TinyHttp в соответствии с: https://github.com/camuthig/twilio-php/commit/20d4f3c4479c93894866f498e89a0f13cf16d6bf

$twiliohttp = new Services_Twilio_TinyHttp(
        "https://api.twilio.com",
        array("curlopts" => array(
    CURLOPT_USERAGENT => "Twilio Proxy/1.0",
    CURLOPT_HTTPHEADER => array('Accept-Charset: utf-8'),
    CURLOPT_CAINFO => 'includes/SMS/cacert.pem',
    CURLOPT_PROXY => 'X.X.X.X:9400',
    ))
);

$client = new Services_Twilio($account_sid, $auth_token, null, $twiliohttp );

Если у вас нет cacert.pem, ознакомьтесь с этим сообщением https://stackoverflow.com/a/31297747/1697288

person trevrobwhite    schedule 20.10.2015