Как вернуть ошибки из пакетной операции MailChimp API v3.0

Я борюсь с новым API MailChimp и пакетной функциональностью, в частности, с тем, как вернуть любые ошибки из базовых операций, которые были пакетированы, а не самой пакетной операции.

Мой код ниже и работает для добавления двух тестовых подписчиков. Ответ показывает только успех для всей партии:

[errored_operations] => 0

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

[errored_operations] => 2

Кроме этого, нет никаких указаний относительно того, что не удалось или почему. В этом случае мы знаем, что это потому, что пользователи уже подписаны. Если я пытаюсь добавить одного пользователя без пакетного вызова, используя POST /lists/{list_id}/membersЯ получаю ответ, который подробно описывает, что именно не удалось.

stdClass Object
(
    [type] => http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/
    [title] => Member Exists
    [status] => 400
    [detail] => mary@jackson.net is already a list member. Use PUT to insert or update list members.
    [instance] => 
)

Как я могу зафиксировать отдельные ошибки при добавлении (или обновлении или удалении) сотен подписчиков?

Я пробовал просто проходить через пользователей, совершать несколько отдельных звонков, и это работает: он добавляет пользователей и / или предоставляет подробные отчеты об ошибках. Но кажется, что глупо делать 500 вызовов, когда API настроен для обработки этого за один вызов. Спасибо за любые идеи!

Вот мой код:

$list_id = 'xyz123';
$subscribers = array(
    array(
        'email'     => 'jeff@jackson.net',
        'status'    => 'subscribed',
        'firstname' => 'Jeff',
        'lastname'  => 'Jackson'
    ),
    array(
        'email'     => 'mary@jackson.net',
        'status'    => 'subscribed',
        'firstname' => 'Mary',
        'lastname'  => 'Jackson'
    )
);

$add_subs_batch = add_subs_batch($list_id, $subscribers);
echo '<pre>add_subs_batch: ';
print_r($add_subs_batch);
echo '</pre>';

function add_subs_batch($list_id, $data) {
    $method = 'POST'; 
    $batch_path = 'lists/' . $list_id . '/members';
    $result = mc_request_batch($method, $batch_path, $data);
    if($result && $result->id) {
        $batch_id = $result->id;
        $batch_status = get_batch_status($batch_id);
        return $batch_status;
    }
    else {
        return $result;
    }
}
function get_batch_status($batch_id, $i=1) {
    $method = 'GET'; 
    $target = 'batches/'.$batch_id;
    $result = mc_request($method, $target, $data);
    sleep(1); // wait 1 second and try
    if($result->status == 'finished' ) {
        return $result;
    }
    else {
        return get_batch_status($batch_id, $i+1);
    }
}
function mc_request_batch( $method, $batch_path, $data = false ) {
    $api_key = '12345-us1';
    $dataCenter = substr($api_key,strpos($api_key,'-')+1);
    $url = 'https://' . $dataCenter . '.api.mailchimp.com/3.0/';
    $target = 'batches';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url . $target );
    curl_setopt($ch, CURLOPT_USERPWD, 'user:' . $api_key);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST' );
    curl_setopt($ch, CURLOPT_TIMEOUT, 10 );
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt($ch, CURLOPT_USERAGENT, 'YOUR-USER-AGENT' );
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

    if( $data ) {
        $batch_data = new stdClass();
        $batch_data->operations = array();
            foreach ($data as $item) {
                $batch = new stdClass();
                $batch->method = $method;
                $batch->path = $batch_path;
                $batch->body = json_encode( array(
                    'email_address' => $item['email'],
                    'status'        => $item['status'],
                    'merge_fields'  => array( 
                        'FNAME' => $item['firstname'],
                        'LNAME' => $item['lastname']
                    )
                ) );
                $batch_data->operations[] = $batch;
            }

        $batch_data = json_encode($batch_data);
        curl_setopt($ch, CURLOPT_POSTFIELDS,  $batch_data  );
        $response = curl_exec( $ch );
    }
    curl_close( $ch );
    return json_decode($response);
}

1 ответ

Вы получите id в ответ на пакетную операцию. Это "Batch ID", который является строкой, которая однозначно идентифицирует пакетный запрос.

Чтобы получить статус пакетного запроса, вы должны вызвать запрос GET на URL, /batches/{batch_id},

Из ответа вы можете найти URL в response_body_url поле, содержащее архив с архивом результатов всех операций в пакетном вызове.

Ссылка:

Заметка

По соображениям безопасности response_body_url действителен только в течение 10 минут. Через 10 минут сгенерируйте еще один вызов GET для /3.0/batches/ndombatch_id}.

После того, как вы сделаете запрос на пакетную операцию, результаты будут доступны в течение 7 дней.

Другие вопросы по тегам