You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求将C# SHA1签名生成代码转换为PHP实现

问题分析与正确实现

首先,你的PHP代码里最核心的错误是字符串拼接方式完全不对——你把C#的String.Format格式字符串和参数直接用逗号连在一起了,这在PHP里不会自动解析占位符,导致你计算哈希的原始字符串完全不符合要求。我们先拆解原C#代码的逻辑,再对应写出正确的PHP代码。

原C#代码逻辑拆解

原C#代码的步骤是:

  1. 按照格式拼接原始字符串:String.Format("key|{a}|{b}{c}", "post", userid, pin, password)——这里应该是笔误,C#的String.Format如果用命名占位符需要对应对象,但更可能是你想写的是位置占位符,最终拼接出的字符串是 key|post|{userid}{pin}{password}(比如你例子中的key|post|21234admin)。
  2. 计算该字符串的SHA1哈希值(二进制形式)。
  3. 将哈希值转为Base64编码。
  4. 做Base64Url转换:去掉末尾的所有=,把+替换为-,/替换为_。

正确的PHP实现

// 先定义你的变量
$type = "post";
$userid = 2;
$pin = "1234";
$password = "admin";

// 1. 拼接正确的原始字符串(对应C#的String.Format部分)
$rawString = sprintf("key|%s|%s%s%s", $type, $userid, $pin, $password);
// 或者用字符串插值(PHP 5.4+支持):$rawString = "key|{$type}|{$userid}{$pin}{$password}";

// 2. 计算SHA1二进制哈希(对应C#的ComputeSHA1)
$sha1Binary = sha1($rawString, true); // 第二个参数true返回二进制数据,而非十六进制字符串

// 3. Base64编码 + Base64Url转换
$base64 = base64_encode($sha1Binary);
$sign = rtrim(str_replace(['+', '/'], ['-', '_'], $base64), '=');

// 输出结果
echo $sign;

为什么你的原代码失败?

你的原代码中,sha1("key|{a}|{b}{c},post,2,1234,admin",true) 这部分的字符串是key|{a}|{b}{c},post,2,1234,admin,和C#要计算的key|post|21234admin完全不同,哈希自然不匹配。只要修正字符串拼接的步骤,就能得到正确的签名。

内容的提问来源于stack exchange,提问作者Goroka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:59:56