Woocommerce wird an das Zahlungsgateway gesendet

Lesezeit: 3 Minuten

Benutzer-Avatar
Gandra404

Ich entwickle ein WordPress-Plugin für Woocommerce-Zahlungen. Wie ich sehe muss ich verlängern WC_Payment_Gateway und Methode implementieren “Zahlungsvorgang“. Ich habe mir einige Beispiele angesehen und festgestellt, dass diese Methode so etwas zurückgeben sollte:

array(
    'result'   => 'success',
    'redirect' => $redirectUrl
);

und dann wird die Steuerung zurückgegeben WC_Kasse die zur angegebenen URL umleiten.
Das Problem ist, dass unser Zahlungsanbieter dies verlangt einreichen Form zu seiner Seite statt umleiten. In Anbetracht dieser API-Einschränkung frage ich, wie ich mich am besten mit meinem Zahlungsanbieter verbinden kann.
Gibt es eine Möglichkeit, das Formular anstelle der Weiterleitung zu senden?

Sie können dies wie unten dargestellt und kommentiert erreichen, indem Sie den WooCommerce erweitern WC_Payment_Gateway Klasse mit folgenden Methoden:

public function __construct() {
    $this->id                   = 'my-payment-gateway';
    $this->icon                 = plugins_url( '/path/to/image.extension', __FILE__ );
    $this->has_fields           = true;
    $this->method_title         = __( 'My Payment Gateway', 'txdomain' );
    $this->method_description   = __( 'Add some descriptions here.', 'txdomain' );
    $this->init_form_fields();
    $this->init_settings();
    $this->title                = $this->get_option( 'title' );
    $this->description          = $this->get_option( 'description' );

    add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array(
        $this,
        'process_admin_options'
    ) );
    // below is the hook you need for that purpose
    add_action( 'woocommerce_receipt_' . $this->id, array(
        $this,
        'pay_for_order'
    ) );
}

// here, your process payment method, returning the pay for order page
// where you will can submit the form to your payment gateway providers' page
public function process_payment( $order_id ) {
    $order = new WC_Order( $order_id );

    return array(
        'result' => 'success',
        'redirect' => $order->get_checkout_payment_url( true )
    );
}

// here, prepare your form and submit it to the required URL
public function pay_for_order( $order_id ) {
    $order = new WC_Order( $order_id );
    echo '<p>' . __( 'Redirecting to payment provider.', 'txtdomain' ) . '</p>';
    // add a note to show order has been placed and the user redirected
    $order->add_order_note( __( 'Order placed and user redirected.', 'txtdomain' ) );
    // update the status of the order should need be
    $order->update_status( 'on-hold', __( 'Awaiting payment.', 'txtdomain' ) );
    // remember to empty the cart of the user
    WC()->cart->empty_cart();

    // perform a click action on the submit button of the form you are going to return
    wc_enqueue_js( 'jQuery( "#submit-form" ).click();' );

    // return your form with the needed parameters
    return '<form action="' . 'https://example.com' . '" method="post" target="_top">
        <input type="hidden" name="merchant_key" value="">
        <input type="hidden" name="success_url" value="">
        <input type="hidden" name="cancelled_url" value="">
        <input type="hidden" name="deferred_url" value="">
        <input type="hidden" name="invoice_id" value="">
        <input type="hidden" name="total" value="">
        <div class="btn-submit-payment" style="display: none;">
            <button type="submit" id="submit-form"></button>
        </div>
    </form>';
}

  • pay_for_order sollte das Formular drucken, nicht den Wert zurückgeben.

    – Hai Phan Nguyen

    4. Oktober 2021 um 4:50 Uhr

  • @HaiPhanNguyen: Das Ziel des OP besteht nicht darin, das Formular auszudrucken, sondern die erforderlichen Details zu erhalten und an ein Remote-Zahlungsgateway zu senden. Das pay_for_order() Methode in der obigen Antwort erfüllt diese Anforderung.

    – nyedidikeke

    4. Oktober 2021 um 10:43 Uhr

1143310cookie-checkWoocommerce wird an das Zahlungsgateway gesendet

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy