ASP.NET集成PayU Money支付网关:哈希参数计算错误问题
解决PayU Money哈希参数计算错误问题
你的哈希计算错误主要来自以下几个问题:
- 金额参数在哈希计算与POST提交时格式不一致(哈希用字符串,POST转成Double可能丢失小数位)
- 哈希计算过程中编码处理混乱(混用UTF8和UnicodeEncoding)
- 字符串拼接时的参数顺序或分隔符存在隐性问题
以下是修正后的完整代码:
修正后的PayNow按钮代码
protected void Button1_Click(object sender, EventArgs e) { // 直接使用金额字符串,避免格式转换导致的不一致 string amountStr = Label4.Text.Trim(); // 严格按照PayU的哈希规则拼接字符串:key|txnid|amount|productinfo|firstname|email|udf1|udf2|udf3|udf4|udf5||||||salt string hashInput = $"{key.Value}|{txnid.Value}|{amountStr}|Women Tops|{Label1.Text.Trim()}|{Label8.Text.Trim()}|1|1|1|1|1||||||{salt.Value}"; // 统一使用UTF8编码计算SHA512哈希 string hash = ComputeSHA512Hash(hashInput); System.Collections.Hashtable data = new System.Collections.Hashtable(); data.Add("hash", hash); data.Add("key", key.Value); data.Add("txnid", txnid.Value); data.Add("amount", amountStr); // 与哈希计算用的金额字符串保持一致 data.Add("productinfo", "Women Tops"); data.Add("firstname", Label1.Text.Trim()); data.Add("email", Label8.Text.Trim()); data.Add("phone", Label10.Text.Trim()); data.Add("udf1", "1"); data.Add("udf2", "1"); data.Add("udf3", "1"); data.Add("udf4", "1"); data.Add("udf5", "1"); data.Add("surl", "http://localhost:44376/SuccessPayment.aspx"); data.Add("furl", "http://localhost:44376/FailurPayment.aspx"); data.Add("service_provider", ""); string strForm = PreparePOSTForm("https://test.payu.in/_payment", data); Page.Controls.Add(new LiteralControl(strForm)); }
独立的SHA512哈希计算方法
private string ComputeSHA512Hash(string input) { using (SHA512 sha512 = SHA512.Create()) { byte[] inputBytes = Encoding.UTF8.GetBytes(input); byte[] hashBytes = sha512.ComputeHash(inputBytes); // 将字节数组转换为小写十六进制字符串(PayU要求小写哈希) StringBuilder sb = new StringBuilder(); foreach (byte b in hashBytes) { sb.Append(b.ToString("x2")); } return sb.ToString(); } }
关键修正点说明
- 金额参数一致性:哈希计算和POST提交时使用完全相同的金额字符串,避免Double转换导致的格式差异(比如"100.00"转成Double后变为100,与哈希中的字符串不一致)
- 编码统一:全程使用UTF8编码处理字符串转字节,移除多余的UnicodeEncoding操作
- 哈希计算标准化:使用
SHA512.Create()而非已过时的SHA512Managed,并确保输出的十六进制字符串为小写(PayU的哈希验证要求小写) - 字符串拼接简化:使用字符串插值让拼接逻辑更清晰,减少手动拼接时的分隔符错误
内容的提问来源于stack exchange,提问作者Asad
相关产品推荐
相关产品推荐

