付款网关后如何调用自定义PHP函数

时间:2020-05-29 09:58:30

标签: wordpress woocommerce hook-woocommerce

我正在使用最新的wordpress版本为Woocommerce创建自定义支付网关插件。

一旦使用了下订单的点击,就会调用'process_payment'函数,然后我会打开一个弹出窗口供用户访问我们的付款网关。 弹出窗口关闭后,无论是成功还是失败,我都会在前端的javascript函数中获得付款状态。

通过此JavaScript,我需要在我的插件类中调用PHP函数或某些woocommerce操作,以更新订单状态并将用户重定向至失败或成功的谢谢页面。

我也有IPN,但是以后会再打http呼叫,我们需要先处理此前端状态。

简而言之::前端结帐页面在javascript中具有付款状态,需要将其发送到php函数以更新订单并将用户重定向至“谢谢”页面。

1 个答案:

答案 0 :(得分:0)

第 1 步:第一步是编写一个 php,您可以在弹出窗口关闭后重定向状态:

public function process_frontend_response() {
        if ( isset( $_GET['status'] ) ) {

            $status   = $_GET['status'];
            // LOGIC FOR YOUR STATUS

        //After logic, redirect to success
        $thanks_link = $this->get_return_url( $order );
        wp_redirect( $thanks_link );

        //OR, FAILURE PAGE
        wp_redirect( $order->get_cancel_endpoint() );
}

现在在你的构造函数中注册这个函数:

add_action( 'process_response', array( $this, 'process_frontend_response' ) );

第 2 步:我们注册一个端点来调用这个函数:

add_action( 'init', 'register_custom_redirect' );
function register_custom_redirect() {
    if ( isset( $_GET['post-popup-redirect'] ) ) {
        do_action( 'process_response' );
    }
}

第 3 步:我们需要注入一个自定义的 javascript,以便在弹出窗口关闭后页面重定向到我们上面的 URL(post-popup-redirect)。

这里我们调用我们的弹出窗口并重定向到上面的 php 函数:

public function custom_scripts() {
        $this->frontend_redirect_url = add_query_arg( 'post-popup-redirect', 'status', $this->get_return_url() );
        // Javascript for listening or hash change (it occurs after popup closes), once hash change detected, it will invoke showpopup and
        // on popup close, it will redirect to base url with status
        add_action( 'wp_head', function () {
            echo '<script>' . PHP_EOL;
            echo 'function locationHashChanged() {' . PHP_EOL;
            echo '    if (location.hash.includes(\'#open-popup\')) {' . PHP_EOL;
            echo '        somescript.openPopup().then(status => {' . PHP_EOL;
            echo '        console.log(status);' . PHP_EOL;
            echo '        window.location =\'' . $this->frontend_redirect_url . '&status=\'+status' . PHP_EOL;
            echo '        })' . PHP_EOL;
            echo '        .catch(err => {' . PHP_EOL;
            echo '        window.location =\'' . $this->frontend_redirect_url . '&status=failed\'' . PHP_EOL;
            echo '        })' . PHP_EOL;
            echo '    }' . PHP_EOL;
            echo '}' . PHP_EOL;
            echo 'window.onhashchange = locationHashChanged;' . PHP_EOL;
            echo '</script>' . PHP_EOL;
        } );
}

也在构造函数中注册这个函数:

add_action( 'wp_enqueue_scripts', array( $this, 'custom_scripts' ) );