PHP火山引擎API签名方法

devtools/2025/3/15 5:52:51/
一、前置准备

在开始签名之前,需要准备以下信息:

  1. Access Key ID(AK):请求火山引擎OpenAPI的安全凭证之一。
  2. Secret Access Key(SK):与AK成对使用,用于签名计算。
  3. 请求参数:包括HTTP请求方法、URI、查询参数、请求头等。
二、签名流程(文档地址)

火山引擎API签名流程大致分为以下几个步骤:

  1. 创建规范请求:将请求参数进行规范化处理,形成CanonicalRequest。
  2. 创建待签名字符串:基于CanonicalRequest和其他元数据信息,构建StringToSign。
  3. 派生签名密钥:从SK派生出签名密钥(signing key)。
  4. 计算签名:使用HMAC-SHA256算法和签名密钥,计算StringToSign的签名。
  5. 构建Authorization头:将签名和其他必要信息添加到请求头中。
三、具体实现

以下是一个PHP示例代码,火山引擎API请求生成签名:

/**** Author:刘星麟* @param $ak   Access Key ID* @param $sk   Secret Access Key* @param $region   服务Region* @param $service  服务名称* @param $body     请求参数 没有给空* @param $query    接口请求参数* @param $method   请求方法  GET|POST* @param $path     服务路径* @param $headers  服务请求header  签名必要  https://www.volcengine.com/docs/6369/67268#_2-%E7%AD%BE%E5%90%8D%E5%8F%82%E6%95%B0* @return mixed*/
function signv4($ak, $sk, $region, $service, $body, $query, $method, $path, $headers)
{if ($path === '') {$path = '/';}$ldt = gmdate('Ymd\THis\Z');$sdt = substr($ldt, 0, 8);$headers['X-Date'] = $ldt;$bodyHash = hash('sha256', $body);$headers['X-Content-Sha256'] = $bodyHash;$credentialScope = "$sdt/$region/$service/request";$signedHeaders = [];foreach ($headers as $key => $value) {if ($key == "Host" || $key == "Content-Md5" || $key == "Content-Type" || substr($key, 0, 2) == "X-") {$key = strtolower($key);$signedHeaders[$key] = $value;}}ksort($signedHeaders);$signed_str = '';foreach ($signedHeaders as $k => $v) {$signed_str .= $k . ':' . $v . "\n";}$signedHeadersString = implode(';', array_keys($signedHeaders));$canon = implode("\n", array($method, $path, $query, $signed_str, $signedHeadersString, $bodyHash));$hash = hash('sha256', $canon);$toSign = implode("\n", array("HMAC-SHA256", $ldt, $credentialScope, $hash));$signingKey = getSigningKey($sdt, $region, $service, $sk);$signature = hash_hmac('sha256', $toSign, $signingKey);$credential = $ak . '/' . $credentialScope;$headers['Authorization'] = "HMAC-SHA256 Credential={$credential}, SignedHeaders={$signedHeadersString}, Signature={$signature}";return $headers;
}function getSigningKey($date, $region, $service, $sk)
{$dateKey = hash_hmac('sha256', $date, $sk, true);$regionKey = hash_hmac('sha256', $region, $dateKey, true);$serviceKey = hash_hmac('sha256', $service, $regionKey, true);return hash_hmac('sha256', 'request', $serviceKey, true);
}
 四:演示:获取余额
function curl_data($url, $header = [])
{//初始化$ch = curl_init();// 请求头,可以传数组curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HTTPHEADER, $header);curl_setopt($ch, CURLOPT_HEADER, false);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_TIMEOUT, 10);           //最大相应超时时间curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 不从证书中检查SSL加密算法是否存在$output = curl_exec($ch);curl_close($ch);return $output;
}$host = 'open.volcengineapi.com';
$service = 'billing';          // 服务名称
$region = 'cn-beijing';        // 区域
$version = '2022-01-01';       // API版本
$action = 'QueryBalanceAcct';  // 操作名称
$path = '/';
$method = 'GET';
$httpBody = '';                 //请求的参数$ak = 'AKLTM***************************TI';
$sk = 'TV*************************************bE9XVQ==';//查询参数
$query = http_build_query(['Action' => $action,'Version' => $version
]);$url = 'https://' . $host . $path . ($query ? "?{$query}" : ''); //组装请求的地址//请求header
$headers = ['Host' => $host
];$headerArr = signv4($ak, $sk, $region, $service, $httpBody, $query, $method, $path, $headers);
$header = [];
foreach ($headerArr as $k => $v) {$header[] = $k . ":" . $v;
}$resString = curl_data($url, $header);

正常数据返回格式

{"ResponseMetadata": {"RequestId": "202308231151163C400BE8545DED89B87D","Action": "QueryBalanceAcct","Version": "2022-01-01","Service": "billing"},"Result": {"AccountID": 210xxxxxxx,"ArrearsBalance": "1.01","AvailableBalance": "77.01","CashBalance": "83.01","CreditLimit": "0.01","FreezeAmount": "5.01",}
}
五、注意事项
  1. 时间戳:X-Date头必须使用UTC时间,并遵循ISO 8601标准格式。
  2. 请求头排序:参与签名的请求头必须按照ASCII码顺序排序。
  3. 密钥安全:SK是敏感信息,必须妥善保管,避免泄露。
  4. 签名算法火山引擎目前仅支持HMAC-SHA256算法进行签名。
  5. $body:请求参数 没有一定要给空

http://www.ppmy.cn/devtools/167215.html

相关文章

基于ssm的一家运动鞋店的产品推广网站的设计

项目简介 一家运动鞋店实现了以下功能: 实现了用户在线选择试题并完成答题,在线查看考核分数。管理员管理收货地址管理、购物车管理、字典管理、留言版管理、新闻信息管理、产品管理、产品收藏管理、产品评价管理、产品订单管理、单页数据管理、用户管…

宽度优先遍历扩展

一个格子 向周围逐层扩散,适合于求最短路 按层扩散 或者一次一次扩散,按层就是要记下每次距离 (单点弹出,整层弹出) 使用特征为任意节点距离都相同 有单源也有多源 多源扩展典型 1162. 地图分析 - 力扣(LeetCode) class Solution { public:int mo…

Java 集合框架大师课:集合框架的暗黑料理(六)

🔮Java 集合框架大师课:集合框架的暗黑料理(六)——弱引用与幽灵队列 第一章 弱引用:Java世界的塑料兄弟情 💔 四大引用类型生死簿 // 四类引用生死实验 Object strongObj new Object(); …

数据结构——双向链表dlist

前言:大家好😍,本文主要介绍了数据结构——双向链表dlist 一 双向链表定义 1. 双向链表的节点结构 二 双向链表操作 2.1 定义 2.2 初始化 2.3 插入 2.3.1 头插 2.3.2 尾插 2.3.3 按位置插 2.4 删除 2.4.1 头删 2.4.2 尾删 2.4.3 按…

06kafka及异步通知文章上下架

1)自媒体文章上下架 需求分析 之前只是自媒体文章上下架,但是我要通知给文章 用feign会产生系统的耦合,用mq最好 2)kafka概述 消息中间件对比 特性ActiveMQRabbitMQRocketMQKafka开发语言javaerlangjavascala单机吞吐量万级万级10万级100万级时效性m…

机器学习(吴恩达)

一, 机器学习 机器学习定义: 计算机能够在没有明确的编程情况下学习 特征: 特征是描述样本的属性或变量,是模型用来学习和预测的基础。如: 房屋面积, 地理位置 标签: 监督学习中需要预测的目标变量,是模型的输出目标。如: 房屋价格 样本: 如: {面积100㎡…

《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(35)山河社稷图展开 - 编辑距离(字符串DP)

《灵珠觉醒:从零到算法金仙的C++修炼》卷三天劫试炼(35)山河社稷图展开 - 编辑距离(字符串DP) 哪吒在数据修仙界中继续他的修炼之旅。这一次,他来到了一片神秘的山河社稷图,图中有一卷古老的山河社稷图,图面闪烁着神秘的光芒。图前有一块巨大的石碑,上面刻着一行文字…

【C++标准库类型】深入理解C++中的using声明:从基础到实践

目录 一、using声明基础 1.1 基本语法形式 1.2 典型应用场景 1.3 作用域规则 二、关键注意事项 2.1 命名冲突处理 2.2 头文件使用规范 2.3 与typedef的对比 三、面向对象中的应用 3.1. 解除派生类名称隐藏(核心应用) 3.2. 构造函数继承&#…