Problemi con wp_remote_post nell'invio dati a un'API esterna durante la registrazione utente

17 feb 2019, 19:07:40
Visualizzazioni: 25.9K
Voti: 5

Sto cercando di creare un plugin base per inviare i dettagli dell'utente a un CRM quando un utente si registra sul sito WordPress come semplice subscriber.

Sono arrivato a un punto critico: ho cercato di interpretare al meglio i dettagli dell'API, ma non sono sicuro se sto formattando correttamente i dati del body poiché semplicemente non funziona.

Riesco a far funzionare la richiesta POST usando Postman, tuttavia quella è via json/javascript mentre sul sito sto cercando di ottenere lo stesso risultato usando wp_remote_post.

Qualsiasi suggerimento od osservazione sarebbe apprezzato.

// Aggiungi azione quando un nuovo utente si registra
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
Commenti

E quale risultato ottieni? Cosa vedrai se logghi la variabile $request alla fine di questa funzione?

Krzysiek Dróżdż Krzysiek Dróżdż
17 feb 2019 19:32:38
Tutte le risposte alla domanda 2
3

Consiglio di impostare solo gli argomenti che è assolutamente necessario modificare rispetto ai valori predefiniti, per evitare potenziali problemi durante i test. È meglio aggiungere ulteriori argomenti solo quando sono necessari.

Tutti gli argomenti possono essere trovati qui: https://developer.wordpress.org/reference/classes/WP_Http/request/

Se possibile, rimuovi anche l'autenticazione richiesta inizialmente per testare solo il POST prima di aggiungere la sicurezza/autenticazione.

Inoltre, non è necessario chiudere una funzione con un punto e virgola ;

Consiglio di cercare come configurare xdebug per poter eseguire il debug del codice localmente. Se non puoi farlo, allora consiglio di usare error_log per registrare nel log degli errori del tuo provider di hosting, così puoi vedere qual è la risposta.

Hai anche impostato blocking su false, non vuoi una risposta dal server?

// Se il file viene chiamato direttamente, interrompi.
if ( ! defined( 'WPINC' ) ) {
    die;
}

// Trova i dettagli di un nuovo utente

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;

    // ottieni tutti i metadati del nuovo utente registrato
    $new_user_data = get_user_meta($user_id);

    // ottieni il nome dell'utente come stringa
    $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( 'Impossibile ottenere i dati utente!' );
        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
Commenti

Grazie sMyles, ora sono riuscito ad attivare la registrazione degli errori, il che mi permette di debugare meglio. Ancora non funziona, ma almeno stampa la risposta che posso analizzare. Sembra che il tentativo di creare il 'party' stia bloccando l'invio.

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

Sono riuscito a far passare i dati se inserisco valori assoluti. Ora che sto provando a recuperare e inviare dati dinamici, il mio log degli errori si riempie con 'Unable to get userdata!' quindi chiaramente l'istruzione if sta fallendo. Devo fare qualcosa oltre a quanto presente nel codice del plugin qui sotto per recuperare i dati dell'oggetto $user dopo la creazione di un nuovo utente **Ho aggiornato il blocco di codice originale nella domanda ma è in fase di revisione tra pari

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

@DanSutherland puoi provare a cambiare get_userdata con get_user_by( 'id', $user_id ); (poiché get_userdata è solo un wrapper) ... ma è anche una funzione pluggable, quindi a seconda di cosa hai sul tuo sito è possibile che qualcosa stia sovrascrivendo quella chiamata di funzione --- se vedi Unable to get userdata significa che la funzione sta restituendo false invece dei dati utente

sMyles sMyles
20 feb 2019 00:08:31
0

Puoi provare questo? Dovrebbe funzionare:

$args = array(
    'headers' => array(
            'Authorization' => 'Bearer {inserisci qui il tuo token privato!!!!}',
            'Content-Type' => 'application/json'
        ),
   'body' => json_encode($body)
);

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

8 nov 2022 05:51:07