Tengo una pasarela de pago de terceros que funciona bien en la página de pago. Cuando el usuario hace clic en el botón Pagar, en realidad devuelve un comando de Javascript como redirección, que luego abre un iframe modal a mi pasarela de pago, así:
public function process_payment( $order_id ): array {
include_once dirname( __FILE__ ) . '/includes/flywire-payment-gateway-request.php';
$FW_request = new WC_Gateway_Flywire_Request( $this, $order_id );
try {
$config= $FW_request->get_config();
} catch ( Exception $e ) {
wc_add_notice( $e->getMessage(), 'error' );
return array(
'result' => 'failure',
'redirect' => ''
);
}
// TODO: add optional call to Google Tag action
$return_array = array(
'result' => 'success',
'redirect' => 'javascript:window.flywire.WooCommerce.show(' . json_encode($config) . ')'
);
$logger = wc_get_logger();
$context = array( 'source' => 'flywire' );
$log = "Initializing Checkout with JSON:n" . json_encode($return_array) . "n";
$logger->info( $log, $context );
return $return_array;
}
2022-02-17T11:16:19+00:00 INFORMACIÓN Inicialización de Checkout con JSON: {“resultado”:”éxito”,”redireccionamiento”:”javascript:window.flywire.WooCommerce.show(“{“proveedor” :”woocommerce”,”env”:”demo”,”locale”:”en”,”recipient”:””,”cantidad”:1800, “return_url”:”http:\/\/localhost:8888\/checkout\/order-received\/58\/?key=wc_order_2jw2UT4xADHU3″, “callback_id”:58,”callback_url”:”http:\/\/localhost:8888\/wc-api\/WC_Gateway_Flywire\/”,”sender_country “:”US”,”sender_first_name”:”Test”,”sender_last_name”:”Probando”,”sender_address1″:”1 Test”,”sender_phone “:”000000000″,”sender_city”:”Town”,”sender_zip”:”94043″,”sender_email”:”admin@example.com”,” nombre_del_estudiante”:”Prueba”,”apellido_del_estudiante”:”Prueba”,”email_del_estudiante”:”admin@example.com”}”)”}
En el punto final de pago del pedido, hacer clic en el botón Pagar genera exactamente el mismo botón, pero el JS no activa ni activa el punto de interrupción que puse en él. Si trato de llamar manualmente al JS desde la Consola de herramientas de desarrollo, como se muestra a continuación, activa el punto de interrupción:
window.flywire.WooCommerce.show('foo')
Entonces, sé que el script JS se ha puesto en cola correctamente y está incluido en la página. también sé que el process_payment
la función está devolviendo el valor de redirección correcto. Y sin embargo, no pasa nada.
Por lo que puedo decir, la función process_order_payment
en class-wc-checkout.php es lo que realmente toma el valor de retorno de mi puerta de enlace process_payment
funciona y hace su magia. También agregué el registro allí y puedo verlo disparar cuando hago clic en Pagar desde la página de pago. Pero, no pasa nada desde la página de pago del pedido.
ACTUALIZAR: Aún no hay solución, pero encontré más información. process_payment
se llama en dos lugares. Para el pago, se llama por class-wc-checkout.php
. Para la página de pago del pedido, se llama por class-wc-form-handler.php
. El código está en ambos lugares es casi lo mismo.
código en class-wc-checkout.php
:
// Process Payment.
$result = $available_gateways[ $payment_method ]->process_payment( $order_id );
// Redirect to success/confirmation/payment page.
if ( isset( $result['result'] ) && 'success' === $result['result'] ) {
$result['order_id'] = $order_id;
$result = apply_filters( 'woocommerce_payment_successful_result', $result, $order_id );
if ( ! wp_doing_ajax() ) {
// phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect
wp_redirect( $result['redirect'] );
exit;
}
wp_send_json( $result );
}
código en class-wc-form-handler.php
:
$result = $payment_method->process_payment( $order_id );
// Redirect to success/confirmation/payment page.
if ( isset( $result['result'] ) && 'success' === $result['result'] ) {
$result['order_id'] = $order_id;
$result = apply_filters( 'woocommerce_payment_successful_result', $result, $order_id );
wp_redirect( $result['redirect'] ); //phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect
exit;
}
En la versión checkout (que funciona), no llama wp_redirect()
si WP está haciendo AJAX y en su lugar envía el JSON a AJAX. En la versión de la página de pago del pedido, siempre solo redirige con wp_redirect()
. Es el wp_send_json()
eso permite que funcione el protocolo “Javascript:”, pero no entiendo por qué el pago desde la página de pago funciona de manera diferente a la página de pago del pedido.
.