php 实现自动收货
PHP 实现自动收货功能
自动收货功能通常用于电商平台,当用户未主动确认收货时,系统在订单发货后一定天数自动完成收货操作。以下是实现方案:
数据库设计
订单表需包含以下关键字段:

order_id:订单唯一标识shipping_time:发货时间戳confirm_time:确认收货时间戳status:订单状态(如1待发货,2已发货,3已完成)
ALTER TABLE `orders` ADD COLUMN `shipping_time` INT DEFAULT 0;
ALTER TABLE `orders` ADD COLUMN `confirm_time` INT DEFAULT 0;
定时任务实现
通过Linux crontab设置每天执行的PHP脚本:

// auto_confirm.php
$days = 7; // 自动收货天数
$timestamp = time() - ($days * 86400);
$orders = $db->query("SELECT order_id FROM orders
WHERE status = 2
AND shipping_time > 0
AND shipping_time < $timestamp
AND confirm_time = 0");
foreach ($orders as $order) {
$db->update('orders', [
'status' => 3,
'confirm_time' => time()
], ['order_id' => $order['order_id']]);
// 可添加日志记录或通知
}
安全验证
在执行自动收货前应验证:
- 订单是否存在物流签收记录
- 用户是否有退款申请
- 订单是否已超过申诉期
$order = $db->getRow("SELECT * FROM orders WHERE order_id = ?", [$order_id]);
if ($order['refund_status'] != 0) {
continue; // 跳过有退款申请的订单
}
日志记录
建议记录自动收货操作:
$db->insert('order_logs', [
'order_id' => $order['order_id'],
'action' => 'system_confirm',
'log_time' => time(),
'remark' => '系统自动确认收货'
]);
注意事项
- 自动收货天数应根据业务需求设置,通常7-15天
- 正式环境需先测试定时任务的执行权限
- 高并发场景建议使用消息队列处理
- 法律合规性需确认,部分地区可能不允许自动收货
完整示例代码
<?php
require 'db_config.php';
function autoConfirmOrders() {
global $db;
$days = getSystemSetting('auto_confirm_days') ?? 7;
$deadline = time() - ($days * 86400);
try {
$db->beginTransaction();
$orders = $db->query("SELECT o.order_id
FROM orders o
LEFT JOIN refunds r ON o.order_id = r.order_id
WHERE o.status = 2
AND o.shipping_time > 0
AND o.shipping_time < ?
AND o.confirm_time = 0
AND r.refund_id IS NULL", [$deadline]);
foreach ($orders as $order) {
$db->update('orders', [
'status' => 3,
'confirm_time' => time()
], ['order_id' => $order['order_id']]);
addOrderLog($order['order_id'], 'auto_confirm');
}
$db->commit();
return count($orders);
} catch (Exception $e) {
$db->rollBack();
error_log($e->getMessage());
return false;
}
}
function addOrderLog($orderId, $action) {
global $db;
$db->insert('order_logs', [
'order_id' => $orderId,
'action' => $action,
'log_time' => time()
]);
}
该方案通过定时任务检查达到自动收货条件的订单,更新订单状态并记录日志。实际应用中应根据具体业务需求调整逻辑。






