当前位置:首页 > PHP

PHP接口防重推荐实现

2026-04-03 12:45:00PHP

防重机制的必要性

在API开发中,防止重复请求是保证数据一致性和系统稳定性的关键。重复请求可能导致重复扣款、重复提交订单等问题。

基于Token的防重方案

客户端在请求前先获取一个唯一Token(如UUID),服务端将该Token存入Redis并设置过期时间。
客户端携带Token发起请求,服务端校验Token是否存在:存在则处理请求并删除Token;不存在则拒绝请求。

PHP接口防重推荐实现

// 生成Token并存储
$token = uniqid('api_', true);
$redis->setex("api_token:$token", 300, 1); // 5分钟有效期

// 验证Token
if (!$redis->exists("api_token:".$_POST['token'])) {
    die(json_encode(['code' => 400, 'msg' => '重复请求']));
}
$redis->del("api_token:".$_POST['token']);

基于时间戳+签名的防重

请求参数包含时间戳(timestamp)和签名(sign)。服务端校验时间戳是否在有效期内(如5分钟内),并重新计算签名是否匹配。

PHP接口防重推荐实现

$secretKey = 'your_secret';
$timestamp = $_POST['timestamp'];
$sign = $_POST['sign'];

// 时间有效性校验
if (time() - $timestamp > 300) {
    die('请求已过期');
}

// 签名校验
$expectedSign = md5($timestamp . $secretKey);
if ($sign !== $expectedSign) {
    die('签名无效');
}

基于幂等性设计的防重

对写操作接口设计幂等性,如订单创建接口使用唯一业务ID(如订单号)。服务端先查询该ID是否存在,存在则直接返回结果。

$orderId = $_POST['order_id'];
if ($db->query("SELECT id FROM orders WHERE order_id = '$orderId'")) {
    die('订单已存在');
}
// 处理订单创建逻辑

基于限流的防重

使用Redis计数器限制单位时间内同一用户的请求次数。例如每分钟允许5次请求:

$userId = $_SESSION['user_id'];
$key = "api_limit:$userId:" . date('YmdHi');
$count = $redis->incr($key);
$redis->expire($key, 60);

if ($count > 5) {
    die('请求过于频繁');
}

混合策略建议

  • 关键业务(如支付)建议组合Token+幂等性设计
  • 高频接口采用限流+时间戳签名
  • Redis存储需考虑集群部署时的数据一致性

标签: 接口PHP
分享给朋友:

相关文章

vue实现接口测试

vue实现接口测试

Vue 实现接口测试的方法 在 Vue 项目中实现接口测试,可以通过多种方式完成。以下是几种常见的方法: 使用 Axios 进行接口测试 Axios 是 Vue 中常用的 HTTP 客户端库,适合…

vue实现接口配置

vue实现接口配置

Vue 中实现接口配置的方法 在 Vue 项目中配置接口通常涉及以下几个关键步骤: 创建 API 配置文件 新建一个 api 目录,创建 index.js 文件作为接口配置入口。可以将接口按模块分类…

vue怎么实现接口

vue怎么实现接口

Vue 实现接口请求的方法 Vue 中实现接口请求通常使用 axios 或 fetch,以下是具体实现方式。 使用 axios 发送请求 安装 axios: npm install axios 在…

react如何访问本地接口

react如何访问本地接口

访问本地接口的方法 在React中访问本地接口通常涉及开发环境配置和跨域问题处理。本地接口可能运行在本地开发服务器(如localhost:3000)或其他端口(如后端服务的localhost:8080…

react如何在model层写函数调接口

react如何在model层写函数调接口

React 中 Model 层函数调用接口的实现 在 React 应用中,Model 层通常负责数据管理和接口调用。可以通过以下方式组织代码: 创建独立的 API 服务模块 将接口调用封装在单独的…

PHP实现图文聊天

PHP实现图文聊天

PHP实现图文聊天的方法 数据库设计 创建数据库表存储聊天消息,包含字段如消息ID、发送者ID、接收者ID、消息内容、消息类型(文本/图片)、发送时间等。使用MySQL或其他数据库管理系统。 CRE…