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

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();
    }
}

关键修正点说明

  1. 金额参数一致性:哈希计算和POST提交时使用完全相同的金额字符串,避免Double转换导致的格式差异(比如"100.00"转成Double后变为100,与哈希中的字符串不一致)
  2. 编码统一:全程使用UTF8编码处理字符串转字节,移除多余的UnicodeEncoding操作
  3. 哈希计算标准化:使用SHA512.Create()而非已过时的SHA512Managed,并确保输出的十六进制字符串为小写(PayU的哈希验证要求小写)
  4. 字符串拼接简化:使用字符串插值让拼接逻辑更清晰,减少手动拼接时的分隔符错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 01:04:59