自定义支付网关的 Woocommerce WC API 回调对我不起作用

问题描述 投票:0回答:4

我实际上正在编写一个自定义插件来将支付网关连接到 Woocommerce,并且我已经被一个问题困扰了几个小时:

我无法收到付款处理的回调。

我用谷歌搜索了很多来找到问题,但还没有成功。

环境如下:

  • 专用服务器上的站点 - Ubuntu 12.04;

  • PHP 7.1;

  • WordPress 5.3.2;

  • Woocommerce 3.8.1;

  • 还加载了很多插件;

我的班级是这样的:

    add_filter('woocommerce_payment_gateways', 'woogatewaypro_add_gateway_class');
    function woogatewaypro_add_gateway_class($gateways){
        $gateways[] = 'WC_Gateway_Pro';
        return $gateways;
    }

    add_action('plugins_loaded', 'woogatewaypro_init_gateway_class');

    function woogatewaypro_init_gateway_class(){

        class WC_Gateway_Pro extends WC_Payment_Gateway{

            public function __construct(){

                global $wpdb;

                global $woocommerce;

                $this->id                   = 'woogatewaypro';
                $this->icon                 = '';
                $this->has_fields           = true;
                $this->method_title         = 'Gateway Pro payment gateway';
                $this->method_description   = __('Allow payment from Gateway Pro gateway.','woogatewaypro');

                $this->supports = array(
            'products',
                    'subscriptions',
                    'subscription_cancellation',
                    'subscription_suspension',
                    'subscription_reactivation',
                    'subscription_amount_changes',
                    'subscription_date_changes',
                    'subscription_payment_method_change',
                    'subscription_payment_method_change_customer',
                    'subscription_payment_method_change_admin',
                    'multiple_subscriptions'
                );

                $this->init_form_fields();

                $this->init_settings();
                $this->title            = $this->get_option('title');
                $this->description      = $this->get_option('description');
                $this->enabled          = $this->get_option('enabled');
                $this->testmode         = 'yes' === $this->get_option('testmode');
                $this->private_key      = $this->testmode ? $this->get_option('test_private_key') : $this->get_option('private_key');
                $this->publishable_key  = $this->testmode ? $this->get_option('test_publishable_key') : $this->get_option('publishable_key');

                /* some code... */

                add_action('woocommerce_api_'.strtolower(get_class($this)), 'woogatewaypro_payment_callback');

                add_action('woocommerce_api_woogatewaypro_cancel_payment', array($this, 'woogatewaypro_cancel_payment'));

                add_action('woocommerce_api_woogatewaypro_payment_ko', array($this, 'woogatewaypro_payment_ko'));

                add_action('woocommerce_api_woogatewaypro_payment_ok', array($this, 'woogatewaypro_payment_ok'));

                add_action('woocommerce_update_options_payment_gateways_'.$this->id, array($this, 'process_admin_options'));

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

                /* some code... */

            }

            public function init_form_fields(){

                /* some code... */

            }

            public function payment_scripts(){

                /* some code... */


            }

            public function process_payment($order_id){

                /* some code... */

            }

            public function woogatewaypro_cancel_payment(){

                wp_redirect(get_permalink(get_option('woocommerce_checkout_page_id')).'?woogatewaypro=cancelled-payment');

            }

            public function woogatewaypro_payment_ko(){

                wp_redirect(get_permalink(get_option('woocommerce_checkout_page_id')).'?woogatewaypro=payment-ko');

            }

            public function woogatewaypro_payment_ok(){

                /* some code... */

                wp_redirect(get_permalink(get_option('woocommerce_checkout_page_id')).'?woogatewaypro=payment-ok');

            }

        }

    }

    function add_wc_gateway_pro_gateway($methods){

        $methods[] = 'WC_Gateway_Pro';

        return $methods;

    }

    add_filter('woocommerce_payment_gateways', 'add_wc_gateway_pro_gateway');

    function woogatewaypro_payment_callback(){

        mail('[email protected]','Check callback','Enter func');

        // wp_die();
        exit;

    }

我做错了什么?

我尝试将 woogatewaypro_ payment_callback 函数放置在我的类中,但它不起作用。

我的回调网址是这样的:

    if('' == get_option('permalink_structure')){
        $callback = site_url().'/?wc-api=WC_Gateway_Pro';
    }else{
        $callback = site_url().'/wc-api/WC_Gateway_Pro/';
    }

我查看服务器上的日志,数据似乎已发布:我通过 POST 获得 200 状态。

当我尝试通过 GET 访问该函数时,我在空白页上仍然有一个 1。

某些插件会造成问题吗?

提前感谢您的帮助;)。

wordpress woocommerce callback gateway
4个回答
2
投票

我遇到了同样的问题,这适用于 WooCommerce 2.0+

 //register the callback hooks which we will use to receive the payment response from the gateway
add_action( 'woocommerce_api_custom_gateway', array( $this, 'payment_callback'));

回调链接可以通过以下方式访问: http://yoursite.com/wc-api/custom_gateway/


1
投票

再次阅读我的 cde 后,我发现我错过了一些在回调函数上正确声明我的 add_action() 的内容。现在看起来像这样:

    add_action('woocommerce_api_'.strtolower(get_class($this)), array($this,'woogatewaypro_payment_callback'));

但是还没有起作用。

我会尝试安装一个新的WordPress来在新的环境上进行测试,因为我真的不明白为什么它不起作用。

希望有“Woo'pro”路过这里来帮助我一点:)。


0
投票

我仍然在解决我的问题(我要疯了......)。

我使用 WP Cerber Security 来保护我的网站,没有任何问题:WP Cerber Security 允许发布到 wc-api/WC_Gateway_Pro/,并且请求处于 200 状态。

事实是回调函数没有执行:我没有收到任何邮件。我尝试在 WordPress 的 debug.log 文件中保存一个字符串(debug 设置为 true),但没有保存任何日志。

我已经阅读并重读了为 Woocommerce 构建自定义支付网关的所有主题,但我不明白我的代码有什么问题:代码构造中的一切似乎都很好,但无法执行回调。

WC_API 正确执行我的类的 cancel、ko 和 ok 函数,但不能正确执行回调函数(为什么?)。

我必须激活 Woocommerce 上的任何设置吗?

如果有人遇到同样的问题或有解决这个问题的想法,我将非常感激:)

非常感谢您的回复;)


0
投票

我有同样的问题,我最后用了这个:

add_action(
    'init',
    array( $this, 'successfull_callback' )
);

然后在回调中检查 URI 并继续...

© www.soinside.com 2019 - 2024. All rights reserved.