我正在使用最新的wordpress版本为Woocommerce创建自定义支付网关插件。
一旦使用了下订单的点击,就会调用'process_payment'函数,然后我会打开一个弹出窗口供用户访问我们的付款网关。 弹出窗口关闭后,无论是成功还是失败,我都会在前端的javascript函数中获得付款状态。
通过此JavaScript,我需要在我的插件类中调用PHP函数或某些woocommerce操作,以更新订单状态并将用户重定向至失败或成功的谢谢页面。
我也有IPN,但是以后会再打http呼叫,我们需要先处理此前端状态。
简而言之::前端结帐页面在javascript中具有付款状态,需要将其发送到php函数以更新订单并将用户重定向至“谢谢”页面。
答案 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' ) );