代码怎么更新订单的支付方式和支付状态?

在 WooCommerce 中,你可以通过代码来更新订单的 支付方式支付状态,一般使用 WC_Order 类的方法来操作。


✅ 示例:通过 PHP 更新订单的支付方式和支付状态

php复制编辑$order = wc_get_order($order_id);

if ($order) {
    // 设置支付方式(如:wechat, alipay, cod, bacs, etc.)
    $order->set_payment_method('wechat'); // 设置支付方式 slug
    $order->set_payment_method_title('微信支付'); // 设置支付方式名称(可选)

    // 设置订单状态(如:pending, processing, completed, on-hold, cancelled, refunded, failed)
    $order->update_status('processing', '已完成微信支付');

    // 保存订单
    $order->save();
}

🧾 常用的支付状态值(status)

状态值含义
pending等待付款
processing已付款,正在处理
completed已完成
on-hold等待付款(已下单)
cancelled已取消
refunded已退款
failed付款失败

✅ 示例:完整函数封装

php复制编辑function update_order_payment($order_id, $method_slug, $method_title = '', $status = 'processing') {
    $order = wc_get_order($order_id);

    if (!$order) {
        return new WP_Error('order_not_found', '订单不存在');
    }

    // 设置支付方式
    $order->set_payment_method($method_slug);
    if ($method_title) {
        $order->set_payment_method_title($method_title);
    }

    // 更新订单状态
    $order->update_status($status, '支付成功,更新订单状态');

    // 保存订单
    $order->save();

    return true;
}

✅ 用法示例:

php复制编辑update_order_payment(1234, 'wechat', '微信支付', 'processing');

在 WooCommerce 中,支付完成时记录支付时间 的做法是调用 $order->payment_complete(),该方法会自动:

  1. 设置支付状态为 processing(或虚拟产品为 completed
  2. 记录支付时间(_paid_date
  3. 触发相关钩子(如 woocommerce_payment_complete

推荐做法:记录支付时间并更新状态

php复制编辑$order = wc_get_order($order_id);

if ($order) {
    // 设置支付方式
    $order->set_payment_method('wechat');
    $order->set_payment_method_title('微信支付');

    // 记录支付完成(自动设置状态+支付时间)
    $order->payment_complete(); // ✅ 推荐方法:自动记录 _paid_date

    // 可选:添加备注
    $order->add_order_note('微信支付完成,自动记录支付时间');
}

⏰ 如果你想“手动”设置支付时间:

虽然 payment_complete() 已自动处理,但你也可以手动设置:

php复制编辑$order->set_date_paid(current_time('timestamp')); // 设置为当前时间
$order->save();

⚠️ 建议只在你自定义支付网关、或 payment_complete() 不满足时才手动设置。


🔍 查询支付时间

你可以通过:

php复制编辑$paid_date = $order->get_date_paid(); // 返回 WC_DateTime 对象

转为格式化字符串:

php复制编辑echo $paid_date ? $paid_date->date('Y-m-d H:i:s') : '未支付';
Scroll to Top