thinkphp 5.1 取消待支付订单时,用当前用户 id、订单 id 和原状态作为更新条件。此例用于没有并行付款流程的本地订单,取消只修改本地状态。
将取消挂到已保护的 POST 接口
已有登录与 CSRF 检查的控制器,从认证会话获取用户 ID,并校验路由中的订单 ID。下例示意业务方法的调用。
$changed = $this->cancelPendingOrder($authenticatedUserId, $orderId);
return $changed
? json(['status' => 'cancelled'])
: json(['message' => '订单不存在或不可取消'], 409);
调用前应确认订单业务允许本地直接取消。存在支付渠道时,需要先设计支付与取消的协调规则。
只更新本人的待支付订单
假定 orders 表含 id、user_id、status 和 cancelled_at。
立即学习“PHP免费学习笔记(深入)”;
private function cancelPendingOrder(int $userId, int $orderId): bool
{
return \think\Db::name('orders')
->where('id', $orderId)
->where('user_id', $userId)
->where('status', 'pending_payment')
->update([
'status' => 'cancelled',
'cancelled_at' => date('Y-m-d H:i:s'),
]) === 1;
}
条件更新避免第二次请求再次写入取消时间,也防止操作其他用户的订单。
验证取消只影响允许的订单
在测试库用同一个账号提交以下操作。
自己的待支付订单 -> 200,状态为 cancelled 再次取消同一订单 -> 409,取消时间不变 其他人的订单 -> 409,状态不变 自己的已支付订单 -> 409,状态不变
如果订单有关联的库存、优惠券或支付记录,应使用项目的完整取消流程及对应事务规则。



















