Blocat cu wp_remote_post la trimiterea datelor către un API extern la înregistrarea utilizatorului

17 feb. 2019, 19:07:40
Vizualizări: 25.9K
Voturi: 5

Încerc să creez un plugin simplu pentru a trimite detaliile utilizatorului către un CRM atunci când un utilizator se înregistrează pe site-ul WordPress ca abonat de bază.

Am ajuns într-un punct blocat, am încercat să interpretez detaliile API-ului cât mai bine posibil, dar nu sunt sigur dacă formatez corect datele din body, deoarece pur și simplu nu funcționează.

Pot face POST-ul să funcționeze folosind Postman, totuși asta este prin json/javascript și pe site încerc să obțin același rezultat folosind wp_remote_post.

Orice sugestii sau observații ar fi apreciate.

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

function send_new_user($user_id) {

    // Obține datele noului utilizator
    $new_user = get_userdata($user_id);
    $useremail = $new_user -> user_email;

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

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

    $request = wp_remote_post ($url, $args);
};
1
Comentarii

Și ce rezultat obții? Ce vei vedea dacă loghezi variabila $request la sfârșitul acestei funcții?

Krzysiek Dróżdż Krzysiek Dróżdż
17 feb. 2019 19:32:38
Toate răspunsurile la întrebare 2
3

Recomand să setezi doar argumentele pe care chiar trebuie să le schimbi din valorile implicite, pentru a elimina potențiale probleme în timpul testării. Cel mai bine este să adaugi argumente suplimentare doar atunci când sunt necesare.

Toate argumentele pot fi găsite aici: https://developer.wordpress.org/reference/classes/WP_Http/request/

Dacă este posibil, elimină și autentificarea obligatorie la început pentru a testa doar POST-ul înainte de a adăuga securitate/autentificare.

De asemenea, nu este nevoie să închizi o funcție cu punct și virgulă ;

Recomand să investighezi cum să configurezi xdebug pentru a putea depana codul local, iar dacă nu poți face asta, atunci recomand să folosești error_log pentru a înregistra în jurnalul de erori al furnizorului de hosting, astfel încât să poți vedea care este răspunsul.

De asemenea, ai setat blocking pe false, nu vrei un răspuns de la server?

// Dacă acest fișier este accesat direct, întrerupe execuția.
if ( ! defined( 'WPINC' ) ) {
    die;
}

// Găsește detaliile unui utilizator nou

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;

    // obține toate metadatele utilizatorului nou înregistrat
    $new_user_data = get_user_meta($user_id);

    // obține prenumele utilizatorului ca șir de caractere
    $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( 'Nu s-a putut obține 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
Comentarii

Mulțumesc sMyles, acum am reușit să activez jurnalizarea erorilor, ceea ce înseamnă că pot depana mai bine. Încă nu funcționează, dar măcar afișează răspunsul pe care îl pot analiza. Se pare că încercarea de a crea 'party' împiedică trimiterea.

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

Am reușit să transmit datele dacă folosesc date absolute. Acum, când încerc să preiau și să trimit date dinamice, jurnalul de erori se umple cu mesajul 'Unable to get userdata!' deci condiția if eșuează în mod evident. Trebuie să fac ceva în plus față de codul din plugin-ul de mai jos pentru a prelua datele obiectului $user după crearea unui utilizator nou **Am actualizat blocul de cod original în întrebare, dar este în curs de verificare

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

@DanSutherland poți încerca să înlocuiești get_userdata cu get_user_by( 'id', $user_id ); (deoarece get_userdata este doar un wrapper) ... dar este și o funcție pluggable, deci în funcție de ce ai pe site, e posibil ca ceva să suprascrie acel apel de funcție --- dacă vezi mesajul Unable to get userdata înseamnă că funcția returnează false în loc de datele utilizatorului

sMyles sMyles
20 feb. 2019 00:08:31
0

Poți încerca asta? Ar trebui să funcționeze:

$args = array(
    'headers' => array(
            'Authorization' => 'Bearer {tokenul privat merge aici!!!!}',
            'Content-Type' => 'application/json'
        ),
   'body' => json_encode($body)
);

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

8 nov. 2022 05:51:07