WooCommerce 'woocommerce_payment_complete' 未在 PayPal 沙盒付款上运行
Posted
技术标签:
【中文标题】WooCommerce \'woocommerce_payment_complete\' 未在 PayPal 沙盒付款上运行【英文标题】:WooCommerce 'woocommerce_payment_complete' not running on PayPal Sandbox paymentsWooCommerce 'woocommerce_payment_complete' 未在 PayPal 沙盒付款上运行 【发布时间】:2017-12-10 23:34:32 【问题描述】:我正在为客户创建一个自定义系统。他已经安装了带有 WooCommerce 的 Wordpress 来销售他的产品。我知道它确实有效。他的销售、运输、跟踪,一切都很好。
我正在尝试做的是捕获每一次有效、成功的销售并将数据传递给第 3 方 API(我在 Yii2 框架上创建的)。我的系统需要“告知”每笔已完成的销售。我不关心待处理,只关心完成。
在找到其他关于此的 SO 线程后,我使用了 woocommerce_payment_complete
动作挂钩。看起来合法:)
但是,当我使用它时,它只适用于免费结账(当贝宝因 100% 优惠券而被绕过时)。它将数据发送到我的第 3 方 API 就好了。然后我使用 PayPal 沙盒交易进行了测试。两者都充满电,还有 99% 的优惠券(在测试期间不会耗尽沙盒资金)。使用 PayPal 时,从用户端看起来一切正常(返回商家,成功收款页面),但没有数据传递给我的 3rd 方 API。很奇怪,因为免费购买(绕过贝宝的 100% 优惠券)效果很好。
也许这个动作钩子不能正常工作。也许 WooCommerce 现在有一个新的,而我正在使用旧的?我应该使用哪个动作挂钩?
也许当 WooCommerce 使用 PayPal 沙箱时,此操作挂钩无法正常工作?我还没有用真钱测试过真正的交易,这就是沙盒的意义,用大声笑来测试!据我所知,它可以在实时测试期间工作。
也许这个动作钩子不适用于 PayPal?
希望有更多 Wordpress 和 WooCommerce 经验的人可以帮助我缩小范围。
这里是我的自定义插件的胆量,用于捕获动作钩子。我的自定义插件只有一个简单的 1 选项页面来输入 API url,因此可以从 WP 管理仪表板轻松更改(截断为 SO)。
<?php
if ( ! defined( 'ABSPATH' ) )
die('Access Denied!');
define('WCO_ROOT_DIR', __DIR__);
function init()
add_action( 'woocommerce_payment_complete', 'wco_payment_complete' );
function wco_payment_complete( $order_id )
$order = wc_get_order( $order_id );
$billingEmail = $order->billing_email;
$products = $order->get_items();
$items = [];
foreach($products as $prod)
$items[$prod['product_id']] = $prod['name'];
// gets the API url from database
$url = get_option('wco_api_url');
$response = wp_remote_post( $url, array(
'method' => 'POST',
'timeout' => 45,
'redirection' => 5,
'httpversion' => '1.0',
'blocking' => true,
'headers' => array(),
'body' => array( 'billingemail' => $billingEmail, 'items' => $items ),
'cookies' => array()
)
);
if ( is_wp_error( $response ) )
$error_message = $response->get_error_message();
file_put_contents(ABSPATH . '/wco-orders.log', '[WooCompletedOrders] Error: ' . $error_message, FILE_APPEND | LOCK_EX);
else
$logData = '--------------------' . PHP_EOL;
$logData .= '[WooCompletedOrders] Success: Posted data to API: ' . PHP_EOL;
$logData .= print_r($order, true);
$logData .= '--------------------' . PHP_EOL;
file_put_contents(ABSPATH . '/wco-orders.log', $logData, FILE_APPEND | LOCK_EX);
init();
【问题讨论】:
通过PayPal重定向支付的订单的订单状态如何?它们是更新为“已完成”还是被保留为“处理中”? @AndrewAngell 他们处于“等待状态”。当它免费时,绕过贝宝,并且钩子有效(传递给我的第 3 方 api),它们列为“处理中”。 【参考方案1】:我明白了!
问题是我没有更新WooCommerce -> Settings -> Checkout (tab) -> PayPal (sub-link)
下的Advanced options: Receiver email
地址。对于您的 PayPal 电子邮件地址,这也应该在其正上方匹配。请记住,这是沙盒,所以它应该在您的电子邮件末尾加上-facilitator
,在@
之前。我实际上创建了-seller
和-buyer
以使事情更容易记住。此外,请确保您已选中沙箱选项。在购买之前,请确保 paypal url 是sandbox.paypal.com
,否则你会花真钱哈哈。
如果您单击订单号(在订单列表下)并查看右侧的注释,则表明该电子邮件地址与 IPN 的电子邮件地址不匹配。因此,一旦我执行了上述操作,并且两封电子邮件都匹配(我的 PP 沙盒卖家电子邮件),繁荣,他们工作了 :) 它实际上是在黄色的“处理”下,然后刷新页面,它是绿色的“完成”。所以PP发送IPN需要几秒钟。给它 30 秒,刷新您的订单列表,它应该会显示已完成。
解决之后,woocommerce_payment_complete
钩子被触发,我的第 3 方 API 记录了数据!
如何让 WooCommerce PayPal 沙盒工作。
我在使用 Google Chrome 与 PayPal 的开发者和沙盒部分时遇到了问题。我记得很久以前和他们打过交道,并且遇到过同样的问题!所以 PayPal 的开发和沙盒部分,简直糟透了。不过,我改用了 FireFox,效果好多了!
所以使用 FireFox,它会为您省去一些令人沮丧的问题。我试图创建沙盒帐户,但它们都未能创建。切换到FF,他们立即工作。
创建新的沙盒帐户(在您的 developer.paypal.com 帐户中)。它将使用您的真实电子邮件,只需将-something
附加到它。所以我创建了myemail-seller@gmail.com
和myemail-buyer@gmail.com
。然后删除或不使用预先创建的,如facilitator
。 -seller
和 -buyer
更有意义,更容易记住和输入...
创建买家账户时,给自己一大笔钱,比如 99999。以后不能编辑资金!因此,您无需创建新的买家测试帐户。
确保 WooCommerce 处于沙盒模式。
确保贝宝电子邮件使用沙盒电子邮件 (you-seller@somewhere.com),无论您使用哪个作为您的卖家沙盒帐户,都必须与 PayPal 设置页面上的相同。它将确保 IPN 与卖家帐户电子邮件匹配,如果不匹配则失败。当 woo 认为这是一次虚假/欺诈尝试时,它会将其标记为“搁置”。
因此,如果您的订单处于“暂停”状态,请仔细检查您的 Woo PayPal 设置,特别是您使用的电子邮件地址。
IPN URL:在sandbox.paypal.com
登录您的卖家沙盒帐户 (you-seller@somewhere.com)。转到Profile > My Selling Tools
,然后点击Instant payment notifications
的链接。
输入此 URL,但将占位符替换为您自己的域和路径:
http://[YOURSITE.COM]?wc-api=WC_Gateway_Paypal
因此,如果您的 wordpress 是 joesblog.com
,它将是 http://joesblog.com?wc-api=WC_Gateway_Paypal
在这种情况下,我在开发子域和博客文件夹中有 wordpress。因此,如果是您,那么这里是该 IPN URL 的示例:
http://dev.mysite.com/blog/?wc-api=WC_Gateway_Paypal
我希望这对某人有帮助 :) 祝你好运!
【讨论】:
我试过了,但它仍然不适合我,但我确实通过使用支付数据传输(身份令牌)让它工作。另请注意 - 确保在 IPN 网址的yoursite.com
部分之后有一个/
(因此示例应为http://joesblog.com/?wc-api=WC_Gateway_Paypal
)。以上是关于WooCommerce 'woocommerce_payment_complete' 未在 PayPal 沙盒付款上运行的主要内容,如果未能解决你的问题,请参考以下文章
php facetwp woocommerce _product_attributes