Elaborare il checkout utilizzando l'API REST di WC
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.

Per elaborare il pagamento di un ordine WooCommerce, il flusso di lavoro è il seguente:
- Creare un ordine WooCommerce
- Elaborare il pagamento per questo ordine, utilizzando uno dei WC_Payment_Gateways
- 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:
- Utilizzare una libreria front-end per tokenizzare le informazioni di pagamento, utilizzando framework come Stripe o PayPal.
- Passare il token di pagamento al backend WordPress utilizzando l'API REST di WP
- 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.

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.

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

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

@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
