@anton99zel
29а класс средней школы №7

Как правильно составить запрос CURL POST?

Этот код должен добавить новый контакт в адресную книгу sendpulse
// $tokenset - ранее полученный токен
$emails = array(
    array(
        'email' => 'subscriber@example.com',
        'variables' => array(
            'phone' => '+12345678900',
            'name' => 'User Name',
        )
    )
);
$headers = array('Authorization: Bearer ' . $tokenset);
if( $curl = curl_init() ) {
    curl_setopt($curl, CURLOPT_URL, 'https://api.sendpulse.com/addressbooks/22608888/emails');
    curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $emails);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    $out = curl_exec($curl);
    echo $out;
    curl_close($curl);
  }

В ответ получаю:
{"error_code":303,"message":"No emails"}
Что делаю не так, не пойму?

Из доков:
Добавление email адресов в книгу

Нужно сделать POST запрос в виде ссылки

https://api.sendpulse.com/addressbooks/{id}/emails
Параметры запроса:

id	идентификатор книги
emails	сериализованный массив контактов (пример ["example@gmail.com", "example@outlook.com"])

если же нужно передать не только емейл, но и переменные, то используется следующая структура передачи значений:
email	 емейл адрес подписчика
variables (необязательный параметр)	
сериализованный массив переменных ("имя переменной":"значение переменной").
Для добавления номера телефона необходимо использовать системную переменную "Phone". 
Пример структуры массива email адресов
[
  {
    "email": "test@test.com",
    "variables": {
      "Имя": "Елизавета",
      "Phone": "380632727700"
    }
  },
  {
    "email": "test2@test.com",
    "variables": {
      "имя переменной": "значение",
      "имя переменной": "значение"
    }
  }
]
В случае успеха вернет JSON строку с result = true


Подозреваю, что допускаю ошибку в правильности написания в этой части:
$emails = array(
    array(
        'email' => 'subscriber@example.com',
        'variables' => array(
            'phone' => '+12345678900',
            'name' => 'User Name',
        )
    )
);
  • Вопрос задан
  • 1641 просмотр
Пригласить эксперта
Ответы на вопрос 3
romanko_vn
@romanko_vn
мне кажется тут нелады

$headers = array('Authorization: Bearer ' . $tokenset);

Может надо указать Content-Type еще, например application/json
Ответ написан
Комментировать
Allepta
@Allepta
Мне кажется, что POSTFIELDS не принимает массив в том формате в котором вы его передаете.
<?php

/* http://localhost/upload.php:
print_r($_POST);
print_r($_FILES);
*/

$ch = curl_init();

$data = array('name' => 'Foo', 'file' => '@/home/user/test.png');

curl_setopt($ch, CURLOPT_URL, 'http://localhost/upload.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); // требуется с PHP 5.6.0
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

curl_exec($ch);
?>


Обратите внимание на строку в примере:
$data = array('name' => 'Foo', 'file' => '@/home/user/test.png');


И на свой код:
$emails = array(
    array(
        'email' => 'subscriber@example.com',
        'variables' => array(
            'phone' => '+12345678900',
            'name' => 'User Name',
        )
    )
);


Оставлю еще ссылку, на всякий случай линк
Ответ написан
Комментировать
@seopublic
можете этот код попробовать, он рабочий:

require '../../vendor/autoload.php';

  use Sendpulse\RestApi\ApiClient;
  use Sendpulse\RestApi\Storage\FileStorage;

   define( 'API_USER_ID', $_GET['client-id'] );
   define( 'API_SECRET', $_GET['secret-id'] );
   define( 'TOKEN_STORAGE', 'file' );

   $SPApiProxy = new ApiClient( API_USER_ID, API_SECRET, new FileStorage() );

$emails = array(
            array(
              'email' => $_GET['email'],
              'variables' => array(
                  'Phone' => $_GET['phone'],
                  'Name' => $_GET['name'],
                )
                ),
             );
$bookID = $_GET['bookID'];
$result = $SPApiProxy->addEmails($bookID,$emails);
$json_result = json_encode($result);
$json_beautified = str_replace(array("{", "}", ","), array("{<br />&nbsp;&nbsp;&nbsp;&nbsp;", "<br />}", ",<br />&nbsp;&nbsp;&nbsp;&nbsp;"), $json_result);
print_r($json_beautified);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы