请求将C# SHA1签名生成代码转换为PHP实现
问题分析与正确实现
首先,你的PHP代码里最核心的错误是字符串拼接方式完全不对——你把C#的String.Format格式字符串和参数直接用逗号连在一起了,这在PHP里不会自动解析占位符,导致你计算哈希的原始字符串完全不符合要求。我们先拆解原C#代码的逻辑,再对应写出正确的PHP代码。
原C#代码逻辑拆解
原C#代码的步骤是:
- 按照格式拼接原始字符串:
String.Format("key|{a}|{b}{c}", "post", userid, pin, password)——这里应该是笔误,C#的String.Format如果用命名占位符需要对应对象,但更可能是你想写的是位置占位符,最终拼接出的字符串是key|post|{userid}{pin}{password}(比如你例子中的key|post|21234admin)。 - 计算该字符串的SHA1哈希值(二进制形式)。
- 将哈希值转为Base64编码。
- 做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
相关产品推荐
相关产品推荐

