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

请求方 使用

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

接收方

 $getParams = $this->request->get();$validate = ApiAuthService::check($getParams);if (!$validate) {return $this->fail('签名验证失败');}
<?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.mzph.cn/pingmian/67513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式】 单例模式(单例模式哪几种实现,如何保证线程安全,反射破坏单例模式)

单例模式 作用&#xff1a;单例模式的核心是保证一个类只有一个实例&#xff0c;并且提供一个访问实例的全局访问点。 实现方式优缺点饿汉式线程安全&#xff0c;调用效率高 &#xff0c;但是不能延迟加载懒汉式线程安全&#xff0c;调用效率不高&#xff0c;能延迟加载双重检…

无公网IP 实现外网访问本地 Docker 部署 Navidrome

Navidrome 是一款可以在 macOS、Linux、Windows以及 Docker 等平台上运行的跨平台开源音乐服务器应用&#xff0c;它支持传输常见的 MP3、FLAC、WAV等音频格式。允许用户通过 Web 界面或 API 进行音乐库的管理和访问。本文就介绍如何快速在 Linux 系统使用 Docker 进行本地部署…

从零开始,掌握Django Web开发

1. Django简介 Django是一个强大的Python Web框架,它使开发人员能够快速构建安全、可扩展的Web应用程序。让我们深入了解Django的特性和优势。 1.1 什么是Django? Django是一个高级Python Web框架,于2005年首次发布。它由新闻网站的开发人员创建,旨在处理快节奏的新闻编辑室…

解决conda create速度过慢的问题

问题 构建了docker容器 想在容器中创建conda环境&#xff0c;但是conda create的时候速度一直很慢 解决办法 宿主机安装的是anaconda 能正常conda create,容器里安装的是miniforge conda create的时候速度一直很慢&#xff0c;因为容器和宿主机共享网络了&#xff0c;宿主机…

【Hive】新增字段(column)后,旧分区无法更新数据问题

TOC 【一】问题描述 Hive修改数据表结构的需求&#xff0c;比如&#xff1a;增加一个新字段。 如果使用如下语句新增列&#xff0c;可以成功添加列col1。但如果数据表tb已经有旧的分区&#xff08;例如&#xff1a;dt20190101&#xff09;&#xff0c;则该旧分区中的col1将为…

【Python】Selenium根据网页页面长度,模拟向下滚动鼠标,直到网页底部的操作

最近在弄selenium的爬取的过程中&#xff0c;我发现一些网站上的表格&#xff0c;是需要手动拉到底部才能加载完成的。 如果没有拉到底部&#xff0c;那么在获取网页表格的时候&#xff0c;表格就会只有显示的一部分&#xff0c;页面就不完整。 所以我就整理了一些模拟滚动鼠…

openharmony电源管理子系统

电源管理子系统 简介目录使用说明相关仓 简介 电源管理子系统提供如下功能&#xff1a; 重启服务&#xff1a;系统重启和下电。系统电源管理服务&#xff1a;系统电源状态管理和休眠运行锁管理。显示相关的能耗调节&#xff1a;包括根据环境光调节背光亮度&#xff0c;和根…

esg信息披露是什么,有什么意义

ESG信息披露是指企业将其在运营中涉及的环境&#xff08;Environment&#xff09;、社会&#xff08;Social&#xff09;及治理&#xff08;Governance&#xff09;因素&#xff0c;向投资者、消费者等利益相关者公开揭示的过程。以下是对ESG信息披露及其意义的详细解释&#x…

Power Automate 实现字符串分割、替换、换行显示

在 Power Automate 中&#xff0c;有时从 Forms 过来的数据是多选列表&#xff0c;导致选项内容是 ["AAAA","BBBB"] 这样的格式&#xff08;注意是字符串而不是列表&#xff09;&#xff0c;往往需要转换为换行显示的形式易于阅读&#xff1a; 方法 使用表…

麒麟操作系统服务架构保姆级教程(十一)https配置

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 在运维工作中&#xff0c;加密和安全的作用是十分重要的&#xff0c;如果仅仅用http协议来对外展示我们的网站&#xff0c;过一段时间就会发现网站首页被人奇奇怪怪的篡改了&#xff0c;本来好好的博…

无人机(Unmanned Aerial Vehicle, UAV)路径规划介绍

无人机&#xff08;Unmanned Aerial Vehicle, UAV&#xff09;是无人驾驶飞行器的简称。凭借其体积小巧、操作简便、生存能力强等诸多优势&#xff0c;无人机在军事、电力巡检、航空航天与科学研究等诸多领域得到了广泛应用。在执行任务时&#xff0c;无人机可搭载多种传感器设…

RabbitMQ---消息确认和持久化

&#xff08;一&#xff09;消息确认 1.概念 生产者发送消息后&#xff0c;到达消费端会有以下情况&#xff1a; 1.消息处理成功 2.消息处理异常 如果RabbitMQ把消息发送给消费者后就把消息删除&#xff0c;那么就可能会导致&#xff0c;消息处理异常想要再获取这条消息的时…

Linux:System V - 共享内存

1.System V共享内存的原理 通过为用户提供系统调用接口&#xff0c;让用户可以申请一块空间&#xff0c;进程A/B也可以通过系统调用接口将创建好的内存通过页表映射进进程的地址空间。完成让不同的两个进程看见同一份资源的目的。如果未来不想继续通信&#xff0c;取消进程和内…

SpringBoot错误码国际化

先看测试效果&#xff1a; 1. 设置中文 2.设置英文 文件结构 1.中文和英文的错误消息配置 package com.ldj.mybatisflex.common;import lombok.Getter;/*** User: ldj* Date: 2025/1/12* Time: 17:50* Description: 异常消息枚举*/ Getter public enum ExceptionEnum {//…

道旅科技借助云消息队列 Kafka 版加速旅游大数据创新发展

作者&#xff1a;寒空、横槊、娜米、公仪 道旅科技&#xff1a;科技驱动&#xff0c;引领全球旅游分销服务 道旅科技 &#xff08;https://www.didatravel.com/home&#xff09; 成立于 2012 年&#xff0c;总部位于中国深圳&#xff0c;是一家以科技驱动的全球酒店资源批发商…

Solidity01 Solidity极简入门

一、Solidity 简介 Solidity 是一种用于编写以太坊虚拟机&#xff08;EVM&#xff09;智能合约的编程语言。我认为掌握 Solidity 是参与链上项目的必备技能&#xff1a;区块链项目大部分是开源的&#xff0c;如果你能读懂代码&#xff0c;就可以规避很多亏钱项目。 Solidity …

如何使用WPS的JS宏实现Word表格的自动编号

如何使用WPS的JS宏实现Word表格的自动编号&#xff1f;如下图&#xff0c;想要给表格的编号列中添加序号。 使用WPS的JS宏可以实现自动编号&#xff0c;代码如下&#xff1a; n Selection.Tables.Item(1).Rows.Count;for(i 2;i<n;i){Selection.Tables.Item(1).Cell(i,1).…

2025年1月17日(点亮一个 LED)

系统信息&#xff1a; Raspberry Pi Zero 2W 系统版本&#xff1a; 2024-10-22-raspios-bullseye-armhf Python 版本&#xff1a;Python 3.9.2 已安装 pip3 支持拍摄 1080p 30 (1092*1080), 720p 60 (1280*720), 60/90 (640*480) 已安装 vim 已安装 git 学习目标&#xff1a;…

Python在多个Excel文件中找出缺失数据行数多的文件

本文介绍基于Python语言&#xff0c;针对一个文件夹下大量的Excel表格文件&#xff0c;基于其中每一个文件内、某一列数据的特征&#xff0c;对其加以筛选&#xff0c;并将符合要求与不符合要求的文件分别复制到另外两个新的文件夹中的方法。 首先&#xff0c;我们来明确一下本…

【Linux】应用层自定义协议与序列化

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; 应用层 &#x1f98b; 再谈 "协议"&#x1f98b; 网络版计算器&#x1f98b; 序列化 和 反序列化 二&#xff1a;&#x1f525; 重新理解 read、…