【问题标题】:Securepay payment gateway integration issueSecurepay支付网关集成问题
【发布时间】:2012-09-03 05:20:27
【问题描述】:

我正在与我的 ASP.NET 网页进行 Securepay 集成,根据他们的文档,我正在从以下信息生成 SHA1:

指纹是上述字段的 SHA1 哈希加上 SecurePay 交易密码,按此顺序使用管道分隔符“|”:

  1. EPS_MERCHANTID
  2. 交易密码(由 SecurePay 支持提供)
  3. EPS_TXNTYPE(为 0)
  4. EPS_REFERENCEID(用于测试目的 123)
  5. EPS_AMOUNT(用于测试目的 100.00)
  6. EPS_TIMESTAMP(用于测试目的 20120910203805)

虽然我已按照上述说明进行操作,但每当我付款时,它都会显示“Invalid Fingerprint”。示例代码:

FormsAuthentication
  .HashPasswordForStoringInConfigFile("xxx|xxx|0|123|100.00|201‌20910203805","sha1")
  .ToLower();`

【问题讨论】:

  • 请您出示您的代码(隐藏密码)
  • 好的,如下:FormsAuthentication.HashPasswordForStoringInConfigFile("xxx|xxx|0|123|100.00|20120910203805", "sha1").ToLower();
  • 所以你用它来创建一个哈希密码来保存在配置文件中?只是因为文档说它适合存储在配置中而询问。
  • 我没有使用哈希密码保存在配置文件中,但上面给出的函数创建了 SHA1 而不存储它
  • 我认为您需要仔细阅读有关如何散列的文档,因为我认为您希望安全散列随请求一起发送,以便他们(支付服务提供商)可以验证您的请求是你的吗?通常你有一个共享的秘密词,它与其他信息位一起被散列。

标签: c# asp.net cryptography payment-gateway sha


【解决方案1】:

检查您是否正确地结束了该行,或者使用尾随“|”或删除不必要的尾随“|”。

还要检查您正在使用的方法是否没有在方法中添加任何会扭曲您所期望的内容的其他内容。 (我正在考虑基于您所使用的特定机器的盐,不知道它是否这样做)

我一直在尝试使用以下代码在http://shagenerator.com/ 处生成哈希:

ABC|password|1|Te‌​st Reference|1.00|20120912123421

给予:

25a1804285bafc078f45e41056bcdc42e0508b6f

您能否使用我的输入获得与您的代码相同的密钥?

更新:

你能不能试试这个方法而不是HashPasswordForStoringInConfigFile(),看看你能不能靠近:

private string GetSHA1String(string text)
{
    var UE = new UnicodeEncoding();
    var message = UE.GetBytes(text);

    var hashString = new SHA1Managed(); 
    var hex = string.Empty;

    var hashValue = hashString.ComputeHash(message); 
    foreach (byte b in hashValue)
    { 
        hex += String.Format("{0:x2}", b);
    } 

    return hex;
}

更新 2:

检查你的编码,我发现我可以匹配哈希输出:

var UE = new UTF8Encoding();

更新 3:

以下代码在控制台应用程序中为我工作,我看到哈希生成相同的值,并且我还能够将输出与 http://shagenerator.com/ 进行比较:

using System;
using System.Security.Cryptography;
using System.Text;
using System.Web.Security;

namespace SecurepayPaymentGatewayIntegrationIssue
{
    class Program
    {
        static void Main(string[] args)
        {
            var text = @"ABC|password|1|Te‌​st Reference|1.00|20120912123421";
            Console.WriteLine(GetSHA1String(text));

            Console.WriteLine(FormsAuthentication.HashPasswordForStoringInConfigFile(text, "sha1").ToLower());

            Console.ReadKey();
        }

        private static string GetSHA1String(string text)
        {
            var UE = new UTF8Encoding();// ASCIIEncoding(); // UnicodeEncoding();
            var message = UE.GetBytes(text);

            var hashString = new SHA1Managed();
            var hex = string.Empty;

            var hashValue = hashString.ComputeHash(message);
            foreach (byte b in hashValue)
            {
                hex += String.Format("{0:x2}", b);
            }

            return hex;
        }
    }
}

【讨论】:

  • 嗨,我尝试了您的输入,得到的 SHA1 为:c09e1bf5f6c201d7dfb3574305458d48f9714a05,这与您上面给出的代码不同
  • 请显示更多代码,因为我提供的这个哈希代码确实有效,所以问题出在哈希调用之前或之后。
  • 嗨 Monkieboy,非常感谢您的帮助,它运行良好。
  • 您的问题解决了吗,如果解决了,请不要忘记将其标记为答案。
  • 已修复 Secure Pay 的实时 URL,但 Secure Pay 的测试 URL 仍显示相同的旧错误“指纹无效”。
【解决方案2】:

我有同样的问题,我用下面的方法解决了这个问题:

 private string GetSHA1HashData(string data)
        {   

            SHA1 sha1 = new SHA1CryptoServiceProvider();

            //convert the input text to array of bytes
            byte[] hashData = sha1.ComputeHash(Encoding.Default.GetBytes(data));

            //create new instance of StringBuilder to save hashed data
            StringBuilder returnValue = new StringBuilder();

            //loop for each byte and add it to StringBuilder
            for (int i = 0; i < hashData.Length; i++)
            {                
                returnValue.Append(hashData[i].ToString("x2"));
            }

            // return hexadecimal string
            return returnValue.ToString();
        }

在页面加载中,我将此返回值转换为小写。因为上面的方法返回值都是大写的

string VAL="ABC|password|1|Te‌​st Reference|1.00|20120912123421";
fingerPrint = GetSHA1HashData(VAL);

【讨论】:

  • 1) 默认编码在这里肯定不是正确的想法,因为它会根据您运行的计算机而有所不同。请改用固定编码。我希望 UTF-8 是最佳选择。 2) 我建议将哈希编码从GetSHA1HashData 中分离出来。 (单一责任原则) 3)Trim 是没用的,首先输出中不会有任何空格。 4) 你可以使用ToString("x2") 而不是ToLowerInvariant。 5) 注释“创建 md5 的新实例”不符合代码。 6)你应该处理sha1
  • @CodesInChaos 感谢您提供的信息。我做了你提到的改变。但在我的场景中,我必须使用默认编码,因为它提到使用..谢谢
【解决方案3】:

现在将时间用作 UTC: string epsTimestamp = DateTime.UtcNow.ToString(@"yyyyMMddHHmmss");

还要确保你使用了 sha1 进行加密:

string data = EpsMerchant + "|" + EpsPassword + "|" + EpsTxnType + "|" + 
EpsReferenceId + "|" + EpsAmount + "|" + epsTimestamp;
string epsFingerprint = GetSha1String(data);

下面是获取sha1的代码

string GetSha1String(string input)
        {
            StringBuilder stringBuilder = new StringBuilder();
            foreach (byte b in GetHash(input))
                stringBuilder.Append(b.ToString("X2"));
            return stringBuilder.ToString();
        }

    public static byte[] GetHash(string inputString)
    {
        HashAlgorithm obj = SHA1.Create();
        return obj.ComputeHash(Encoding.UTF8.GetBytes(inputString));
    }

【讨论】:

    猜你喜欢
    • 2018-09-11
    • 1970-01-01
    • 2016-12-26
    • 2011-05-05
    • 2016-02-02
    • 2012-05-21
    • 2011-03-10
    • 2013-07-21
    • 2015-03-19
    相关资源
    最近更新 更多