我正在为客户创建一个自定义系统。他已经通过WooCommerce设置Wordpress来销售他的产品。我知道它确实有效。他的销售,运输,跟踪,所有这些都很好。
我要做的是捕获每一个有效的成功销售并将数据传递给第三方API(我在Yii2框架上创建的)。我的系统需要被告知"每个完成的销售。我不在乎待处理,只是完成了。
在找到关于此问题的其他SO主题之后,我使用了woocommerce_payment_complete
动作挂钩。看起来合法:))
然而,当我使用它时,它只适用于免费结账(当由于100%折扣优惠券而被绕过贝宝时)。它将数据发送到我的第三方API就好了。然后,我使用PayPal沙盒交易进行了测试。两者都是完全充电,以及99%的优惠券(在测试期间不吹沙箱资金)。当使用PayPal时,从用户端看起来都很好(返回到商家,成功的收据页面),但没有数据传递给我的第三方API。很奇怪,因为在免费购买(绕过paypal的优惠券100%折扣),它完美无缺。
也许这个动作钩子不能正常工作。也许WooCommerce现在有一个新的,我使用旧的?我应该使用哪个动作钩?
当WooCommerce使用PayPal沙箱时,也许这个动作钩子不能正常工作?我还没有用真钱测试一个真正的交易,这是沙盒的重点,用lol测试!据我所知,它可以在实时测试中发挥作用。
也许这个动作钩子不能与PayPal一起使用?
希望有更多Wordpress和WooCommerce经验的人可以帮助我缩小范围。
以下是我的自定义插件的内容,用于捕获动作挂钩。我的自定义插件只有一个简单的1选项页面来输入API网址,因此可以从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();
答案 0 :(得分:0)
我明白了!
问题是我没有更新Advanced options: Receiver email
下的WooCommerce -> Settings -> Checkout (tab) -> PayPal (sub-link)
地址。对于您的PayPal电子邮件地址,这也应该在其上方匹配。请记住,这是沙箱,因此在您的电子邮件末尾-facilitator
之前应该@
。-seller
。实际上,我创建了-buyer
和sandbox.paypal.com
,以便更容易记住。此外,请确保已选中沙箱选项。在进行购买之前,请确保PayPal网址为woocommerce_payment_complete
,否则您将花费真钱lol。
如果您点击订单号(在订单列表下)并查看右侧的注释,则表示该电子邮件地址与IPN的电子邮件地址不匹配。所以,一旦我做了上述,两个电子邮件匹配(我的PP沙盒卖家电子邮件),繁荣,他们工作:)它实际上是黄色“处理”,然后刷新页面,它是绿色“完成”。因此PP发送IPN需要几秒钟。给它30秒,刷新你的订单列表,它应该显示已完成。
在解决之后,-something
挂钩被触发,我的第三方API记录了数据!
如何让WooCommerce PayPal Sandbox正常工作。
我在使用Google Chrome与PayPal的开发者和沙盒部分时遇到了问题。我记得很久以前与他们打交道,并遇到了同样的问题!所以PayPal的开发和沙盒部分都很糟糕。我改用了FireFox,事情变得更好了!
因此使用FireFox,它将为您节省一些令人沮丧的问题。我试图创建沙盒帐户,但他们都无法创建。切换到FF,他们立即工作。
创建新的沙盒帐户(来自您的developer.paypal.com帐户)。它会使用您的真实电子邮件,只会附加myemail-seller@gmail.com
。所以我创建了myemail-buyer@gmail.com
和facilitator
。然后删除或不使用预先创建的内容,例如-seller
。 -buyer
和sandbox.paypal.com
只是更有意义,更容易记住和输入...
创建买家帐户时,给自己很多钱,比如99999.您以后不能编辑资金!因此,它将使您免于创建新的买方测试帐户。
确保WooCommerce处于沙盒模式。
确保PayPal电子邮件正在使用沙盒电子邮件(you-seller@somewhere.com),无论您使用哪个沙盒帐户,它都必须在PayPal设置页面上相同。它将确保IPN与卖家帐户电子邮件匹配,如果不匹配则失败。当woo认为这是假冒/欺诈企图时,它会将其标记为“暂停”。
因此,如果您的订单处于“暂停”状态,请仔细检查您的Woo PayPal设置,特别是您使用的电子邮件地址。
IPN网址:以Profile > My Selling Tools
的身份登录您的卖家沙盒帐户(you-seller@somewhere.com)。转到Instant payment notifications
,然后点击http://[YOURSITE.COM]?wc-api=WC_Gateway_Paypal
。
输入此网址,但将占位符替换为您自己的域和路径:
joesblog.com
因此,如果您的wordpress是http://joesblog.com?wc-api=WC_Gateway_Paypal
,那么它将是http://dev.mysite.com/blog/?wc-api=WC_Gateway_Paypal
在这个例子中,我在开发子域和在博客文件夹中有wordpress。所以,如果是你,那么这是IPN网址的一个例子:
onrendered: function () {
this.api.ygrids([
{value: this.data.targets[0].values[0].value, text:'data 1 value'},
]);
},
我希望这有助于某人:)祝你好运!