PHP支付系统转ASP.NET VB时SHA1签名Base64结果不一致求助
解决PHP转VB.NET时SHA1签名转Base64结果不一致的问题
嘿,我之前也踩过PHP和.NET之间编码转换的坑,刚好能帮你搞定这个问题!先理清楚你PHP代码的核心逻辑,再给你对应的VB.NET正确实现:
先拆解你的PHP代码逻辑
你的PHP代码做了两步关键操作:
pack("H*", $sha1Signature):把40位的十六进制SHA1签名字符串解析成原始字节数组(每两个十六进制字符对应一个字节,40位刚好是20字节)base64_encode(...):将这个原始字节数组编码为Base64字符串
正确的VB.NET实现代码
Function Sha1HexToBase64(sha1Hex As String) As String ' 对应PHP的pack("H*", ...):把十六进制字符串转成原始字节数组 Dim byteArray(sha1Hex.Length \ 2 - 1) As Byte For i As Integer = 0 To sha1Hex.Length - 1 Step 2 byteArray(i \ 2) = Convert.ToByte(sha1Hex.Substring(i, 2), 16) Next ' 对应PHP的base64_encode(...):把字节数组转成Base64字符串 Return Convert.ToBase64String(byteArray) End Function ' 测试调用,和你的PHP输入一致 Dim sha1Signature As String = "484cea8e6bd1153674548ebab5a3673a5c3d0381" Dim base64Result As String = Sha1HexToBase64(sha1Signature) Console.WriteLine(base64Result) ' 输出和PHP完全一致:SEzqjmvRFTZ0VI66taNnOlw9A4E=
你之前的代码大概率踩了这些坑
- 错误地直接用字符串编码转字节:比如用
Encoding.UTF8.GetBytes(sha1Hex),这是把每个十六进制字符当成UTF8字节处理,而不是解析十六进制对应的原始字节,结果肯定不对 - 十六进制转字节的循环逻辑错误:比如没有按每两位取一个字节,或者处理长度时没考虑到40位刚好是偶数,导致数组越界或者字节值错误
验证结果
运行上面的代码,输出的Base64字符串和你PHP的结果完全匹配,刚好符合支付系统的一致性要求。
内容的提问来源于stack exchange,提问作者Realbitt
相关产品推荐
相关产品推荐

