Problema con wp_remote_post enviando datos a una API externa en el registro de usuarios

17 feb 2019, 19:07:40
Vistas: 25.9K
Votos: 5

Estoy intentando crear un plugin básico para enviar detalles del usuario a un CRM cuando un usuario se registra en el sitio WordPress como suscriptor básico.

He llegado a un punto muerto, he tratado de interpretar los detalles de la API lo mejor que puedo, pero no estoy seguro si estoy formateando mis datos del body correctamente ya que simplemente no funciona.

Puedo hacer que el POST funcione usando Postman, sin embargo, eso es a través de json/javascript y en el sitio estoy tratando de lograr el mismo resultado usando wp_remote_post.

Cualquier sugerencia u observación sería apreciada.

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
Comentarios

¿Y qué resultado obtienes? ¿Qué verás si registras la variable $request al final de esta función?

Krzysiek Dróżdż Krzysiek Dróżdż
17 feb 2019 19:32:38
Todas las respuestas a la pregunta 2
3

Recomiendo configurar solo los argumentos que realmente necesites cambiar de los valores predeterminados, para eliminar posibles problemas durante las pruebas. Lo mejor es agregar argumentos adicionales solo cuando sean necesarios.

Todos los argumentos se pueden encontrar aquí: https://developer.wordpress.org/reference/classes/WP_Http/request/

Si es posible, también elimina la autenticación requerida al principio para probar solo el POST antes de agregar seguridad/autenticación.

Tampoco necesitas cerrar una función con un punto y coma ;

Recomiendo buscar cómo configurar xdebug para depurar tu código localmente. Si no puedes hacer eso, entonces recomiendo usar error_log para registrar en el registro de errores de tu proveedor de alojamiento, para que puedas ver cuál es la respuesta.

También configuraste blocking en false, ¿no deseas una respuesta del servidor?

// Si este archivo es llamado directamente, abortar.
if ( ! defined( 'WPINC' ) ) {
    die;
}

// Encontrar los detalles de un nuevo usuario

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;

    // obtener todos los metadatos del usuario recién registrado
    $new_user_data = get_user_meta($user_id);

    // obtener el nombre del usuario como una cadena
    $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( '¡No se puede obtener userdata!' );
        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 feb 2019 19:41:36
Comentarios

Gracias sMyles, ahora he logrado activar el registro de errores, lo que significa que puedo depurar mejor. Todavía no funciona, pero al menos está imprimiendo la respuesta, lo que me permite analizarla. Parece que intentar crear el 'party' está impidiendo el envío.

Dan Sutherland Dan Sutherland
18 feb 2019 20:37:50

He logrado enviar los datos si paso información absoluta. Ahora que estoy intentando recuperar y enviar datos dinámicos, mi registro de errores se está llenando con '¡No se pueden obtener los datos del usuario!', por lo que obviamente la declaración if está fallando. ¿Necesito hacer algo más aparte de lo que está en el código del plugin que aparece abajo para recuperar los datos del objeto $user después de que se crea un nuevo usuario? **He actualizado el bloque de código original en la pregunta, pero está siendo revisado por pares

Dan Sutherland Dan Sutherland
19 feb 2019 19:11:13

@DanSutherland puedes intentar cambiar get_userdata por get_user_by( 'id', $user_id ); (ya que get_userdata es solo un envoltorio) ... pero también es una función pluggable, así que dependiendo de lo que tengas en tu sitio, es posible que algo esté sobrescribiendo esa llamada a la función --- si estás viendo Unable to get userdata significa que esa función está devolviendo false en lugar de los datos del usuario

sMyles sMyles
20 feb 2019 00:08:31
0

¿Puedes probar esto? Esto debería funcionar:

$args = array(
    'headers' => array(
            'Authorization' => 'Bearer {¡aquí va el token privado!}',
            'Content-Type' => 'application/json'
        ),
   'body' => json_encode($body)
);

$request = wp_remote_post($url, $args);
8 nov 2022 05:51:07