【PHP】双方接口通信校验服务

embedded/2025/1/20 6:55:09/

请求方 使用

php">ApiAuthService::buildUrl($domain, ['terminal' => 1, 'ts' => time()]);
//http://域名/adminapi/login/platformLogin?sign=F7FE8A150DEC18BE8A71C5059742C81A&terminal=1&ts=1736904841

接收方

php"> $getParams = $this->request->get();$validate = ApiAuthService::check($getParams);if (!$validate) {return $this->fail('签名验证失败');}
php"><?phpnamespace app\adminapi\service;/*** 服务*/
class ApiAuthService
{const SECRET = '加密KEY';/*** 验证请求的合法性** 该方法主要用于验证来自第三方的请求是否合法通过对比请求参数中的签名和服务器生成的签名是否一致* 同时,它还会检查请求的时间戳以确保请求在允许的时间范围内发出,以防止过期请求被接受** @param array $params 包含请求参数的数组,应包括签名(sign)和时间戳(ts)* @return bool 如果签名验证通过且时间戳在有效范围内,则返回true;否则返回false* @author Harvey* @date 2025/1/14 11:23*/public static function check($params){// 提取签名$sign = $params['sign'] ?? '';// 移除签名参数,以便在后续步骤中重新计算签名unset($params['sign']);// 检查参数中是否包含时间戳if (!array_key_exists('ts', $params)) {return false;}// 获取当前时间戳$ts = time();// 检查时间戳是否在允许的范围内(当前时间前后300秒内)if ($ts < $params['ts'] || $ts - 300 > $params['ts']) {return false;}// 使用剩余参数和密钥生成MD5签名$md5_str = self::getSign($params, self::SECRET);// 记录调试信息trace('我方生成的sign值');trace($md5_str);// 比较生成的签名和接收到的签名是否一致return strcmp($md5_str, $sign) == 0 ? true : false;}/*** 生成签名字符串* * - 对参数进行数组排序* * - 将secret放到数组最前面* * - 将数组进行url编码* * - 将url编码后的字符串进行md5加密* * - 将md5加密后的字符串进行大写* @param $params* @param $code* @return string* @author Harvey* @date 2025/1/14 10:56*/public static function getSign($params, $code){ksort($params);$params = array_merge(['secret' => $code], $params);$params_str = http_build_query($params);return strtoupper(md5($params_str));}/*** 构建URL** 该方法用于将给定的域名、参数和密钥组合成一个带有查询字符串的URL* 它首先将密钥添加到参数数组中,然后将所有参数转换为查询字符串格式,* 并将其附加到域名后面** @param string $url 接口,例如 'http://example.com'* @param array $params 查询参数数组,例如 ['key1' => 'value1', 'key2' => 'value2']* @param string $secret 默认使用类常量SECRET作为密钥,可以通过传递不同的密钥来覆盖默认值** @return string 返回构建好的完整URL,例如 'http://example.com?key1=value1&key2=value2&secret=your_secret'** @author Harvey* @date 2023-10-05 14:30:00*/public static function buildUrl($url, $params, $secret = self::SECRET){// 将密钥与参数数组合并,确保密钥作为第一个参数$sign = self::getSign($params, $secret);$params = array_merge(['sign' => $sign], $params);// 将参数数组转换为查询字符串,并将其附加到域名后面return $url . '?' . http_build_query($params);}/*   public function test(){$sign = PlatformService::getSign(['u' => 1,'a' => 1,'ts' => time(),], PlatformService::SECRET);dump($sign);dump(PlatformService::check(['u' => 1,'a' => 1,'ts' => time(),'sign' => $sign,]));}*/
}

http://www.ppmy.cn/embedded/155412.html

相关文章

信贷业务术语详解:深入理解金融领域的核心概念

信贷&#xff0c;作为金融领域的重要组成部分&#xff0c;是指金融机构&#xff08;如银行、信用合作社等&#xff09;向个人、企业或政府提供资金的过程。这一过程中&#xff0c;金融机构作为资金提供者&#xff0c;借款人则承诺在未来按约定的条件和利率偿还借款。合同明确了…

金融项目实战 07|Python实现接口自动化——连接数据库和数据清洗、测试报告、持续集成

目录 一、投资模块&#xff08;投资接口投资业务&#xff09; 二、连接数据库封装 和 清洗数据 1、连接数据库 2、数据清洗 4、调用 三、批量执行测试用例 并 生成测试报告 四、持续集成 1、代码上传gitee 2、Jenkin持续集成 一、投资模块&#xff08;投资接口投资业务…

2025.1.16——五、LoveSQL1 sqlmap文件类|万能密码

题目来源&#xff1a;BUUCTF [极客大挑战 2019]LoveSQL 1 目录 一、打开靶机&#xff0c;分析信息 二、sqlmap解题——文件类 step 1&#xff1a;通过url进行爆破 step 2&#xff1a;抓包并将信息保存为文件进行爆破数据库 step 3&#xff1a;爆表 step 4&#xff1a;爆…

MATLAB中regexptranslate函数用法

目录 语法 说明 示例 转换特殊字符 对替代文本中的特殊字符进行转义 转换通配符 使用正则表达式替换文本 regexptranslate函数的功能是将文本转换为正则表达式。 语法 newStr regexptranslate(op,str) 说明 newStr regexptranslate(op,str) 会将 str 转换为正则表达…

费解的开关

费解的开关 你玩过“拉灯”游戏吗&#xff1f; 25 盏灯排成一个 55 的方形。 每一个灯都有一个开关&#xff0c;游戏者可以改变它的状态。 每一步&#xff0c;游戏者可以改变某一个灯的状态。 游戏者改变一个灯的状态会产生连锁反应&#xff1a;和这个灯上下左右相邻的灯也…

HTML-BFC+SEO+标签应用实例

文章目录 BFC语义化标签和SEO语义化标签实例页面结构类文本内容类列表类多媒体类特殊功能类 以下是<figure>和<figcaption>标签的一些应用实例&#xff1a;图片展示图表展示代码示例展示引述或诗歌展示数学公式展示多媒体内容展示 以下是<details>和<summ…

element-ui制作多颜色选择器

将颜色存储到一个数组中去。 <template><div class"color-picker-container" style"margin-top: 10px;"><!-- 显示已选颜色 --><div class"color-selection"><divv-for"(color, index) in selectedColors"…

4.若依 BaseController

若依的BaseController是其他所有Controller的基类&#xff0c;一起来看下BaseController定义了什么 1. 定义请求返回内容的格式 code/msg/data 返回数据格式不是必须是AjaxResult&#xff0c;开发者可以自定义返回格式&#xff0c;注意与前端取值方式一致即可。 2. 获取调用…