php - WooCommerce 'woocommerce_payment_complete' 未在 PayPal 沙盒付款上运行

标签 php wordpress paypal woocommerce hook-woocommerce

我正在为客户创建自定义系统。他已经安装了带有 WooCommerce 的 Wordpress 来销售他的产品。我知道它确实有效。他的销售、运输、跟踪,一切正常。

我正在尝试做的是捕获每一次有效、成功的销售并将数据传递给第 3 方 API(我在 Yii2 框架上创建的)。每次完成的销售都需要“告知”我的系统。我不关心 pending,只关心 completed。

在找到与此相关的其他 SO 线程后,我使用了 woocommerce_payment_complete 操作 Hook 。看起来合法 :)

但是,当我使用它时,它只适用于免费结账(当 paypal 由于 100% 折扣优惠券而被绕过时)。它将数据发送到我的第 3 方 API 就好了。然后,我使用 PayPal 沙盒交易进行了测试。两者均充满电,并提供 99% 的优惠券(以免在测试期间耗尽沙盒资金)。当使用 PayPal 时,从用户端看一切都很好(返回商家,成功接收页面),但没有数据传递到我的第 3 方 API。很奇怪,因为在免费购买时(100% 的优惠券绕过 paypal)效果很好。

也许这个 Action Hook 不能正常工作。也许 WooCommerce 现在有一个新的,而我正在使用一个旧的?我应该使用哪个 Action Hook ?

当 WooCommerce 使用 PayPal 沙箱时,这个操作 Hook 可能无法正常工作?我还没有用真钱测试过真正的交易,这就是沙盒的意义所在,用大声笑来测试!据我所知,它可以在现场测试期间工作。

也许这个操作 Hook 不适用于 PayPal?

希望有更多 Wordpress 和 WooCommerce 经验的人可以帮助我缩小范围。

这是我的自定义插件的内容,用于捕获 Action Hook 。我的自定义插件只有一个简单的 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();

最佳答案

我明白了!

问题是我没有更新 WooCommerce -> Settings -> Checkout(选项卡)-> PayPal(子链接)下的 Advanced options: Receiver email 地址。对于您的 PayPal 电子邮件地址,这也应该与它的正上方相匹配。请记住,这是沙箱,因此它应该在电子邮件末尾 @ 之前有 -facilitator。实际上,我创建了 -seller-buyer 来让事情更容易记住。另外,请确保选中了沙箱选项。购买前,请确保 Paypal 网址为 sandbox.paypal.com,否则您将花费​​真钱 lol。

如果您单击订单号(在订单列表下方)并查看右侧的注释,会发现电子邮件地址与 IPN 不匹配。因此,一旦我执行了上述操作,并且两封电子邮件都匹配(我的 PP 沙盒卖家电子邮件),繁荣,他们工作了:) 它实际上是在黄色“处理中”下进入的,然后刷新页面,它是绿色的“完成”。所以 PP 发送 IPN 需要几秒钟。给它 30 秒,刷新您的订单列表,它应该显示已完成。

解决这个问题后,触发了 woocommerce_payment_complete Hook ,我的第 3 方 API 记录了数据!


如何让 WooCommerce PayPal 沙盒工作。

我在 PayPal 的开发者和沙盒部分使用谷歌浏览器时遇到了问题。我记得很久以前和他们打过交道,也有同样的问题!所以 PayPal 的开发和沙盒部分非常糟糕。不过,我切换到 FireFox,效果好多了!

所以使用 FireFox,它将为您省去一些令人沮丧的问题。我试图创建沙盒帐户,但它们都无法创建。切换到 FF,他们立即工作。

创建新的沙盒帐户(从您的 developer.paypal.com 帐户中)。它将使用您的真实电子邮件,仅附加 -something 到它。所以我创建了 myemail-seller@gmail.commyemail-buyer@gmail.com。然后删除或干脆不使用预先创建的那些,例如 facilitator-seller-buyer 更有意义,更容易记住和输入...

创建买家账户时,给自己很多钱,比如99999。以后不能编辑资金!因此,您无需创建新的买家测试帐户。

确保 WooCommerce 处于沙盒模式。

确保 Paypal 电子邮件使用沙盒电子邮件 (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

在这种情况下,我在 dev 子域和博客文件夹中有 wordpress。因此,如果是您,那么这里是该 IPN URL 的示例:

http://dev.mysite.com/blog/?wc-api=WC_Gateway_Paypal

我希望这对某人有所帮助 :) 祝你好运!

关于php - WooCommerce 'woocommerce_payment_complete' 未在 PayPal 沙盒付款上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44957738/

相关文章:

php - 如何从 MySQL 列中提取图像以显示在 Web 应用程序上

php - 根据表单包含的输入数量自动执行 VALUE

javascript - AJAX 页面转换后 Woocommerce 功能被禁止

php - 如何在 WooCommerce 中通过产品 ID 订购相关产品?

asp.net - 无法使用 PayPal 立即购买按钮在 ASP.NET 中的单个页面上工作

javascript - 使用 PHP 'Include' 将多个页面链接到单个 index.php 页面

php - 如何使用 Facebook Graph API 将照片上传到相册

php - 控制帖子图像大小移动

ios - 如何在 ios 中使用 Paypal 退款?

paypal - 我是否需要成为 Paypal 认证开发人员才能在我的网站上实现 Paypal?