Elaborare il checkout utilizzando l'API REST di WC

26 nov 2017, 18:18:41
Visualizzazioni: 14.5K
Voti: 3

Con un sito principale che utilizza WordPress/WooCommerce e un sito remoto che gestisce il frontend; è possibile elaborare il modulo di checkout utilizzando l'API REST di WooCommerce e ricevere un URL di reindirizzamento al gateway di pagamento selezionato?

Ho provato a creare una funzione AJAX personalizzata, ma sembra che richieda un campo nonce nel modulo inviato, e questo è problematico poiché il frontend non si trova sullo stesso server.

0
Tutte le risposte alla domanda 1
4

Per elaborare il pagamento di un ordine WooCommerce, il flusso di lavoro è il seguente:

  1. Creare un ordine WooCommerce
  2. Elaborare il pagamento per questo ordine, utilizzando uno dei WC_Payment_Gateways
  3. Modificare lo stato dell'ordine (il default è in attesa->in elaborazione, o completato se l'ordine è vuoto)

Secondo la mia opinione, il secondo passaggio può essere implementato come segue:

  1. Utilizzare una libreria front-end per tokenizzare le informazioni di pagamento, utilizzando framework come Stripe o PayPal.
  2. Passare il token di pagamento al backend WordPress utilizzando l'API REST di WP
  3. Lasciare che WordPress e WooCommerce elaborino il pagamento come al solito.

Puoi creare un endpoint API REST personalizzato per elaborare i pagamenti per il tuo sito WooCommerce, aggiungi il seguente codice al tuo codice.

add_action( 'rest_api_init', 'wc_rest_payment_endpoints' );
function wc_rest_payment_endpoints() {
    /**
     * Gestisce la richiesta del metodo di pagamento.
     */
    register_rest_route( 'wc/v2', 'payment', array(
        'methods'  => 'POST',
        'callback' => 'wc_rest_payment_endpoint_handler',
    ) );
}
function wc_rest_payment_endpoint_handler( $request = null ) {
    $response       = array();
    $parameters     = $request->get_json_params();
    $payment_method = sanitize_text_field( $parameters['payment_method'] );
    $order_id       = sanitize_text_field( $parameters['order_id'] );
    $payment_token  = sanitize_text_field( $parameters['payment_token'] );
    $error          = new WP_Error();

    if ( $payment_method === "stripe" ) {
        $wc_gateway_stripe                = new WC_Gateway_Stripe();
        $_POST['stripe_token']            = $payment_token;
        $payment_result               = $wc_gateway_stripe->process_payment( $order_id );
        if ( $payment_result['result'] === "success" ) {
            $response['code']    = 200;
            $response['message'] = __( "Il tuo pagamento è stato completato con successo", "wc-rest-payment" );
        } else {
            return new WP_REST_Response( array("c"), 123 );
            $response['code']    = 401;
            $response['message'] = __( "Inserisci dettagli della carta validi", "wc-rest-payment" );
        }
    }  else {
        $response['code'] = 405;
        $response['message'] = __( "Seleziona un metodo di pagamento disponibile. I metodi di pagamento supportati sono disponibili su https://wordpress.org/plugins/wc-rest-payment/#description", "wc-rest-payment" );
    }

    return new WP_REST_Response( $response, 123 );
}

Se cerchi un modo semplice per farlo, puoi provare il nostro plugin WC REST Payment.

Supporta i gateway WooCommerce inclusi Stripe, PayPal Express, PayPal Standard, Bonifico Bancario, Assegno, Pagamento alla consegna.

24 gen 2018 23:09:54
Commenti

grazie per la guida approfondita, ma ho optato per chiamare process_checkout utilizzando ajax qualche tempo fa. Questo sito utilizza un gateway di pagamento meno conosciuto, quindi è tutto o niente quando lo chiamo sul front-end (nessuna tokenizzazione). Ma dato che non l'ho menzionato nella domanda, sto contrassegnando questa come risposta.

steakoverflow steakoverflow
26 gen 2018 09:17:44

come fai a sapere quali sono i codici di rifiuto da stripe, non vedo come potresti gestirli qui...

Spencer Bigum Spencer Bigum
8 mar 2019 01:33:29

Non puoi, se stai utilizzando il WooCommerce Stripe Gateway. Ho analizzato il loro codice sorgente, non restituiscono l'errore. Tuttavia, se abiliti il log di debug, puoi vedere l'errore da WooCommerce -> Stato -> Log

Jack Song Jack Song
8 mar 2019 02:00:55

@JackSong questo funziona bene per Stripe, grazie mille. Che architettura suggeriresti per implementare PayPal? Ho trovato delle librerie React per i pulsanti PayPal che sembrano funzionare bene, dovrei fare una chiamata separata a WordPress per confermare l'ordine con status: confirmed? Mi sembra un po' insicuro ed è per questo che chiedo

Timothy Dalton Timothy Dalton
6 mag 2020 15:56:04