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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:40:50