TL;运行具有相同名称的类的DR WooCommerce回调网址已损坏。就像我可以通过转到
valitorcallback
来访问我的http://mywebsite.com/wc-api/valitorcallback
课程一样,是否可以启用该网址或以某种方式访问此课程?
我开发了一个WooCommerce支付网关插件,可以连接像Valitor公司这样的冰岛Paypal。
付款流程很简单:
插件唯一的作用是第2步和第4步。在第4步中,如果订单有效,则插件会降低库存并更改订单状态,表示付款已完成。
问题出在2个月前WooCommerce更新后,回调网址破坏,可能是出于安全原因。我无法找到再次启用此URL或解决此问题的代码。它认为可以使用add_action方法或一些钩子来完成,但我无法让它工作。
以下是我认为关键的指南,但我做错了:http://docs.woothemes.com/document/payment-gateway-api/#section-4
Code插件结构如下:
<?php
function initWooCommerceValitorGatewayPlugin()
{
class WooCommerceValitorGateway extends WC_Payment_Gateway
{
public function __construct()
{
// ...Varible code...
// Actions
add_action('woocommerce_update_options_payment_gateways_'.$this->id, array($this, 'process_admin_options'));
}
public function init_form_fields()
{
// ...Define settings code...
}
public function process_payment($orderId)
{
// ...Magic code...
// Redirect to Valitor with all necessary data
return array(
'result' => 'success',
'redirect' => add_query_arg($valitorData, $gatewayUrl)
);
}
// ...Helper functions code (like sending an email)...
}
}
class valitorcallback
{
public function __construct()
{
$this->verifyPayment();
}
public function verifyPayment()
{
// ...Verification code...
}
// ...Helper functions code (like sending an email)...
}
// Add plugin to wordpress/woocommerce
add_action('plugins_loaded', 'initWooCommerceValitorGatewayPlugin');
function addValitorGateway($methods)
{
$methods[] = 'WooCommerceValitorGateway';
return $methods;
}
// Add gateway method to woocommerce
add_filter('woocommerce_payment_gateways', 'addValitorGateway');
?>
现在你看到了函数名称,也许可以告诉我add_action应放在哪里。
我知道mywebsite.com/wc-api/v3 / ... REST API,但我希望我能再次启用该网址,所以我不必再对该部分进行编码而且我不是确定如何从另一个文件中获取该插件设置。
谢谢,Sigurður
编辑:添加TL; DR部分位于顶部,粗体表示问题。
答案 0 :(得分:2)
我发现它,不知道为什么我没有找到它,除了我没有在谷歌上使用正确的搜索词。
但是就是这样:WooCommerce Custom Payment Gateway
我不知道为什么文档中没有提到这个,但这是你需要的动作钩子:
// Payment listener/API hook
add_action('woocommerce_api_wc_valitor_gateway', array($this, 'valitorcallback'));
我需要将sum函数从第二个类移动到第一个类,然后使用该行为的正确名称来使其工作。它仍然返回-1
但正确的代码是使用url中的所有GET变量执行的。
此外,我将类名更改为WC_Valitor_Gateway
,插件结构如下:
<?php
function initWooCommerceValitorGatewayPlugin()
{
class WC_Valitor_Gateway extends WC_Payment_Gateway
{
public function __construct()
{
// ...Varible code...
// Actions
add_action('woocommerce_update_options_payment_gateways_'.$this->id, array($this, 'process_admin_options'));
// Payment listener/API hook
add_action('woocommerce_api_wc_valitor_gateway', array($this, 'valitorcallback'));
}
public function init_form_fields()
{
// ...Define settings code...
}
public function process_payment($orderId)
{
// ...Magic code...
}
public function valitorcallback()
{
// ...Verification code...
}
// ...Helper functions code (like sending an email)...
}
}
// Add plugin to wordpress/woocommerce
add_action('plugins_loaded', 'initWooCommerceValitorGatewayPlugin', 0);
function addValitorGateway($methods)
{
$methods[] = 'WC_Valitor_Gateway';
return $methods;
}
// Add gateway method to woocommerce
add_filter('woocommerce_payment_gateways', 'addValitorGateway');
?>