我实际上正在编写一个自定义插件来将支付网关连接到 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。
某些插件会造成问题吗?
提前感谢您的帮助;)。
我遇到了同样的问题,这适用于 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/
再次阅读我的 cde 后,我发现我错过了一些在回调函数上正确声明我的 add_action() 的内容。现在看起来像这样:
add_action('woocommerce_api_'.strtolower(get_class($this)), array($this,'woogatewaypro_payment_callback'));
但是还没有起作用。
我会尝试安装一个新的WordPress来在新的环境上进行测试,因为我真的不明白为什么它不起作用。
希望有“Woo'pro”路过这里来帮助我一点:)。
我仍然在解决我的问题(我要疯了......)。
我使用 WP Cerber Security 来保护我的网站,没有任何问题:WP Cerber Security 允许发布到 wc-api/WC_Gateway_Pro/,并且请求处于 200 状态。
事实是回调函数没有执行:我没有收到任何邮件。我尝试在 WordPress 的 debug.log 文件中保存一个字符串(debug 设置为 true),但没有保存任何日志。
我已经阅读并重读了为 Woocommerce 构建自定义支付网关的所有主题,但我不明白我的代码有什么问题:代码构造中的一切似乎都很好,但无法执行回调。
WC_API 正确执行我的类的 cancel、ko 和 ok 函数,但不能正确执行回调函数(为什么?)。
我必须激活 Woocommerce 上的任何设置吗?
如果有人遇到同样的问题或有解决这个问题的想法,我将非常感激:)
非常感谢您的回复;)
我有同样的问题,我最后用了这个:
add_action(
'init',
array( $this, 'successfull_callback' )
);
然后在回调中检查 URI 并继续...