- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在为客户创建自定义系统。他已经安装了带有 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(子链接)下的
。对于您的 PayPal 电子邮件地址,这也应该与它的正上方相匹配。请记住,这是沙箱,因此它应该在电子邮件末尾 Advanced options: Receiver email
地址@
之前有 -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.com
和 myemail-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/
我需要在订单完成时执行操作。 我已经试过了: function mysite_woocommerce_payment_complete( $order_id ) { error_log("callba
add_action( 'woocommerce_payment_complete', 'payment_complete_func' ); function payment_complete_fun
我正在为客户创建自定义系统。他已经安装了带有 WooCommerce 的 Wordpress 来销售他的产品。我知道它确实有效。他的销售、运输、跟踪,一切正常。 我正在尝试做的是捕获每一次有效、成功的
“woocommerce_ payment_complete”是当 WooCommerce 中的支付网关将付款标记为接受时触发的 Hook 。 这是一个非常有用的钩子(Hook),因为一旦付款通过,您
我是一名优秀的程序员,十分优秀!