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 -&gt; Settings -&gt; Checkout (tab) -&gt; 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.commyemail-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 &gt; 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 沙盒付款上运行的主要内容,如果未能解决你的问题,请参考以下文章

Woocommerce 价格之间的差异

php facetwp woocommerce _product_attributes

Woocommerce 订阅自定义费用添加到经常性总额中

在WooCommerce产品选项编辑页面中,在SKU之前显示自定义字段

WooCommerce:还在购物车项目上显示产品变体描述

从 WooCommerce 订单中获取优惠券数据