Проблема с wp_remote_post при отправке данных во внешний API при регистрации пользователя

17 февр. 2019 г., 19:07:40
Просмотры: 25.9K
Голосов: 5

Я пытаюсь создать простой плагин для отправки данных пользователя в CRM, когда пользователь регистрируется на WordPress сайте как обычный подписчик.

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

Я могу добиться работы POST-запроса используя Postman, однако это через json/javascript, а на сайте я пытаюсь достичь того же результата, используя wp_remote_post.

Буду признателен за любые подсказки или замечания.

add_action( 'user_register', 'send_new_user', 10, 1 );

function send_new_user($user_id) {

    // Получаем данные нового пользователя
    $new_user = get_userdata($user_id);
    $useremail = $new_user -> user_email;

    $url = 'https://api.capsulecrm.com/api/v2/parties';
    $body = array(
        'firstName' => 'WhyWontYouWork',
        'email' => $useremail
    );

    $args = array(
        'method' => 'POST',
        'timeout' => 45,
        'redirection' => 5,
        'httpversion' => '1.0',
        'sslverify' => false,
        'blocking' => false,
        'headers' => array(
            'Authorization' => 'Bearer {private token goes here!!!!}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ),
        'body' => json_encode($body),
        'cookies' => array()
    );

    $request = wp_remote_post ($url, $args);
};
1
Комментарии

И какой результат вы получаете? Что вы увидите, если выведете переменную $request в конце этой функции?

Krzysiek Dróżdż Krzysiek Dróżdż
17 февр. 2019 г. 19:32:38
Все ответы на вопрос 2
3

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

Все аргументы можно найти здесь: https://developer.wordpress.org/reference/classes/WP_Http/request/

По возможности также сначала удалите обязательную аутентификацию, чтобы просто протестировать POST перед добавлением безопасности/аутентификации.

Также не нужно закрывать функцию точкой с запятой ;

Рекомендую изучить, как настроить xdebug для локальной отладки кода. Если это невозможно, советую использовать error_log для записи в лог ошибок вашего хостинг-провайдера, чтобы видеть ответ сервера.

Вы также установили blocking в false - разве вам не нужен ответ от сервера?

// Если файл вызван напрямую, прерываем выполнение
if ( ! defined( 'WPINC' ) ) {
    die;
}

// Находим данные нового пользователя

add_action('user_register', 'send_doqaru_user', 10, 1);

function send_doqaru_user ($user_id){

    $new_doqaru_user = get_userdata($user_id);
    $doqaru_user_email = $new_doqaru_user -> user_email;

    // получаем все метаданные нового зарегистрированного пользователя
    $new_user_data = get_user_meta($user_id);

    // получаем имя пользователя в виде строки
    $doqaru_user_firstname = get_user_meta( $user_id, 'first_name', true );
    $doqaru_user_lastname = get_user_meta( $user_id, 'last_name', true );


    if( ! $new_user ){
        error_log( 'Не удалось получить данные пользователя!' );
        return;
    }

    $url  = 'https://api.capsulecrm.com/api/v2/parties';
    $body = array(
        'type' => 'person',
        'firstName' => $doqaru_user_firstname,
        'lastName' => $doqaru_user_lastname,
        'emailAddresses'     => array(
            'type' => 'Work',
            'address' => $new_user->user_email

    ));

    $args = array(
        'method'      => 'POST',
        'timeout'     => 45,
        'sslverify'   => false,
        'headers'     => array(
            'Authorization' => 'Bearer {token goes here}',
            'Content-Type'  => 'application/json',
        ),
        'body'        => json_encode($body),
    );

    $request = wp_remote_post( $url, $args );

    if ( is_wp_error( $request ) || wp_remote_retrieve_response_code( $request ) != 200 ) {
        error_log( print_r( $request, true ) );
    }

    $response = wp_remote_retrieve_body( $request );
}
17 февр. 2019 г. 19:41:36
Комментарии

Спасибо, sMyles! Теперь мне удалось настроить логирование ошибок, что позволяет лучше отлаживать код. Пока что всё ещё не работает, но по крайней мере выводится ответ, который я могу разобрать. Похоже, что попытка создать 'party' мешает отправке данных.

Dan Sutherland Dan Sutherland
18 февр. 2019 г. 20:37:50

Мне удалось передать данные, если я использую абсолютные значения. Теперь, когда я пытаюсь получить и отправить динамические данные, в логе ошибок появляется сообщение 'Unable to get userdata!', так что условие if явно не выполняется. Нужно ли мне делать что-то ещё, кроме того, что есть в коде плагина ниже, чтобы получить данные объекта $user после создания нового пользователя? **Я обновил исходный блок кода в вопросе, но он проходит проверку сообществом.

Dan Sutherland Dan Sutherland
19 февр. 2019 г. 19:11:13

@DanSutherland, попробуйте заменить get_userdata на get_user_by( 'id', $user_id ); (поскольку get_userdata — это просто обёртка) ... но это также плагируемая функция, поэтому в зависимости от того, что есть на вашем сайте, возможно, что-то переопределяет этот вызов функции --- если вы видите Unable to get userdata, это означает, что функция возвращает false вместо данных пользователя.

sMyles sMyles
20 февр. 2019 г. 00:08:31
0

Попробуйте это. Должно работать:

$args = array(
    'headers' => array(
            'Authorization' => 'Bearer {сюда вставьте ваш приватный токен!!!!}',
            'Content-Type' => 'application/json'
        ),
   'body' => json_encode($body)
);

$request = wp_remote_post($url, $args);

8 нояб. 2022 г. 05:51:07