Отправка массовых сообщений в API Twillo Notify через CURL (php) - PullRequest
0 голосов
/ 23 октября 2019
$data = [];
    $data['ToBinding'] =  json_encode(array("binding_type"=>"sms", "address"=>"+19991112222"));
    $data['Body'] ="test";
    $ch = curl_init("https://notify.twilio.com/v1/Services/ISXXXXXXXXXXXXXXXXXX/Notifications");
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");    
    curl_setopt($ch, CURLOPT_USERPWD,'XXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXX');
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded')); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $resultData = curl_exec($ch);

Этот код был скопирован из другого поста. Я могу заставить это работать нормально, используя реальные цифры, конечно. Однако я не могу заполнить $ data ['ToBinding'] несколькими числами, что является единственной целью использования Twilio Notify . Я пробовал много разных комбинаций кода, и он взрывается, чаще всего с «Не удается преобразовать входящие параметры в объект уведомления: параметр« ToBinding »недопустим».

Мне удалось получить его по крайней меревыполнить без ошибок, используя этот код (действительные числа, конечно):

$data['ToBinding'] =  json_encode(array("binding_type"=>"sms", "address"=>"+19991112222","binding_type"=>"sms", "address"=>"+19993334444"));

Но он отправляет только первый номер в массиве. Будем благодарны за любую помощь в заполнении массива для отправки на несколько номеров (или, возможно, другим способом с использованием cURL).

==== ПОЛНЫЙ КОД ====

$query = array("ToBinding" => array(
json_encode(array("binding_type"=>"sms", "address"=>"+19991112222")),
json_encode(array("binding_type"=>"sms", "address"=>"+19993334444"))
));
$data = http_build_query($query);
$data = preg_replace('/%5B[0-9]+%5D/simU', '', $data);
echo $data;
$data['Body'] ="Notify cURL API test";
$ch = curl_init("https://notify.twilio.com/v1/Services/<NOTIFY ID HERE >/Notifications");
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");    
curl_setopt($ch, CURLOPT_USERPWD,'<ACCT ID HERE>:<TOKEN HERE >');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded')); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$resultData = curl_exec($ch);

===== ЗАКЛЮЧИТЕЛЬНЫЙ РАБОЧИЙ КОД =====

$data['Body'] ="Notify cURL API test";
$data['ToBinding'] = array(
   json_encode(array("binding_type"=>"sms","address"=>"+19191112222")),
   json_encode(array("binding_type"=>"sms","address"=>"+19193334444"))
);

$query = http_build_query($data);
$string = preg_replace('/%5B(?:[0-9]|[1-9][0-9]+)%5D=/', '=', $query);
$ch = curl_init("https://notify.twilio.com/v1/Services/ISxxxxxxxxxx/Notifications");
curl_setopt($ch, CURLOPT_POSTFIELDS, $string);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");    
curl_setopt($ch, CURLOPT_USERPWD,'ACxxxxxxxxxx:xxxxxxxxxxxxxxxxx');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded')); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$resultData = curl_exec($ch);

echo "curl Response=".$resultData."<br>";
$responseHttp = curl_getinfo($ch, CURLINFO_HTTP_CODE);

1 Ответ

0 голосов
/ 25 октября 2019

Twanio developer evangelist здесь.

Параметр ToBinding представляет собой массив объектов привязки. Notify реализует поддержку для этого путем декодирования нескольких ToBinding параметров из запроса.

Пример curl из документации Notify выглядит следующим образом:

curl -X POST https://notify.twilio.com/v1/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Notifications \
    --data-urlencode 'ToBinding={"binding_type":"sms", "address":"+15555555555"}' \
    --data-urlencode 'ToBinding={"binding_type":"facebook-messenger", "address":"123456789123"}' \
    -d 'Body=Hello Bob' \
    -u 'your_account_sid:your_auth_token'

Как выМожно видеть, что в данные включены два ToBinding параметра.

Насколько я могу судить, PHP не поддерживает построение такого тела. http_build_query представляется полезным, но создает массивы данных, используя форму name[index], которая нам не нужна. Вы можете удалить [index] с помощью чего-то вроде следующего:

$query = array("ToBinding" => array(
  json_encode(array("binding_type"=>"sms", "address"=>"+19991112222")),
  json_encode(array("binding_type"=>"sms", "address"=>"+19993334444"))
));
$data = http_build_query($query);
$data = preg_replace('/%5B[0-9]+%5D/simU', '', $data);
echo $data;
# => ToBinding=%7B%22binding_type%22%3A%22sms%22%2C%22address%22%3A%22%2B19991112222%22%7D&ToBinding=%7B%22binding_type%22%3A%22sms%22%2C%22address%22%3A%22%2B19993334444%22%7D

Дайте мне знать, если это вообще поможет.

...