我已经用Wordpress 5.0.3和最新的WC和WC Eway插件(WooCommerce eWAY Gateway)设置了一个新的docker容器。
创建了一个包含一些产品的商店,连接了我的Eway沙箱环境,启用了“保存卡”(这将启用令牌)并创建了一个订单。
在我的数据库中检查了post_meta的顺序后,我没有看到_eway_token_customer_id
字段。以客户身份登录时,我再次尝试了新订单,但仍然没有获得令牌。
进行此测试的原因是,我在真实的新网站中遇到了这种奇怪的行为,在该网站中,新客户的第一笔订单未产生令牌。
但是,当我在登录时创建第二个订单时,确实在_eway_token_customer_id
中得到了一个order_meta
值。
对我来说,必须首先获得该令牌,因为在此之后,我将使用tokenpayy选项自动更新产品。
调试此问题很麻烦,我感到非常不安的是,在全新的WP安装中,我根本没有任何令牌。
有没有个好主意?
**更新
在Eway插件中进行了一些挖掘之后,我发现我第一次下订单时,类request_access_code()
中的函数WC_Gateway_EWAY
正在检查该用户的数据库中是否有令牌。
功能主体:
protected function request_access_code( $order ) {
$token_payment = $this->get_token_customer_id( $order );
if ( $token_payment && 'new' === $token_payment ) {
$result = json_decode( $this->get_api()->request_access_code( $order, 'TokenPayment', 'Recurring' ) );
} elseif ( 0 === $order->get_total() && 'shop_subscription' === ( version_compare( WC_VERSION, '3.0', '<' ) ? $order->order_type : $order->get_type() ) ) {
$result = json_decode( $this->get_api()->request_access_code( $order, 'CreateTokenCustomer', 'Recurring' ) );
} else {
$result = json_decode( $this->get_api()->request_access_code( $order ) );
}
if ( isset( $result->Errors ) && ! is_null( $result->Errors ) ) {
throw new Exception( $this->response_message_lookup( $result->Errors ) );
}
return $result;
}
该函数处理三种可能的结果:
1) new customer: results in calling `$this->get_api()->request_access_code( $order, 'TokenPayment', 'Recurring' )` <-- this is the one we are after!
2) shop_subscription: calls `$this->get_api()->request_access_code( $order, 'CreateTokenCustomer', 'Recurring' )`
3) else..: calls `$this->get_api()->request_access_code( $order )`
在调试过程中发生的事情是,$token_payment
变量具有新客户而不是new
的空字符串值。
因此,我将尝试通过过滤器/动作钩子来解决此问题,或者找出发生这种情况的原因。
当我强制该函数始终使用第一个if
块时,我得到了令牌。 :)
**更新2:
我使用现有的用户帐户进行了测试,创建了新订单。
当我查看post_meta
表时:
瞧,new
值存在。
但是,当我没有登录并创建帐户时,new
值不会添加,这就是问题所在。
一个临时解决方法是使用一个钩子并将new
值添加到顺序中,以便在调用get_token_customer_id
时它检索一个new
值而不是一个空字符串。 / p>
我认为这是一个错误,因为应该添加此值。它解释了为什么第二笔交易获得令牌但为什么没有第一笔。
如果只有Woocommerce Eway插件具有git存储库...。我可以标记问题或将其分叉。
***没有黑客的解决方案 将此添加到我的插件(如果需要,也可以添加到functions.php):
add_action( 'woocommerce_checkout_order_processed', function( $order_id, $posted_data, $order ) {
update_post_meta( $order_id, '_eway_token_customer_id', 'new' );
}, 10, 3);
当您以不存在的用户结帐时,这将添加新值。 在添加了我的信用卡详细信息之后,令牌被很好地添加了。
事实上,插件仍然存在一个错误,您可以解决该问题。