2017-01-20 14 views
0

私は、支払いゲートウェイの統合を使用しているWebアプリケーションを持っています。今私はsha-256 HMACアルゴリズムを使用して安全なハッシュコードを作成する際にいくつかの問題に直面しています。MiGS Payment Gatewayインテグレーションの実装をC#

私はmigsゲートウェイへの接続に関するすべての詳細を持っていますが、私の問題はゲートウェイに接続しようとしたときに、作成されたハッシュコードに問題が発生しています。私は以下のようなエラーを取得しています。このURLを発射したら

はMIGSゲートウェイ

https://migs.mastercard.com.au/vpcpay?vpc_AccessCode=XXXXXX&vpc_Amount=6000&vpc_Command=pay&vpc_Locale=en&vpc_MerchTxnRef=12345678&vpc_Merchant=TESTXXXXXX&vpc_OrderInfo=54444&vpc_ReturnURL=http%3a%2f%2flocalhost%3a2231%2fTransaction%2fSecureTransaction%3fdataKey=33445566&vpc_Version=1&vpc_SecureHash=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&vpc_SecureHashType=SHA256 

にURLを構築:

HTTP Status - 400 

E5000: Cannot form a matching secure hash based on the merchant's request using either of the two merchant's secrets 

を私はSecretHashを検証し、商人によって提供されるようにその同じきました。

既存の実装のC#:

string hashSecret = ConfigurationManager.AppSettings["MigsSecureHashSecret"]; 

          var transactionData = paymentRequest.GetParameters().OrderBy(t => t.Key, new VPCStringComparer()).ToList(); 
    var redirectUrl = VPC_URL + "?" + string.Join("&", transactionData.Select(item => HttpUtility.UrlEncode(item.Key) + "=" + HttpUtility.UrlEncode(item.Value))); 
          if (!string.IsNullOrEmpty(hashSecret)) 
          { 
    var hashedData = hashSecret + string.Join("", transactionData.Select(item => item.Value)); 
    redirectUrl += "&vpc_SecureHash=" + Crypto.CreateSHA256Signature(hashedData); 
          } 
    return Redirect(redirectUrl); 

CreateSHA256Signature機能

public static string CreateSHA256Signature (string RawData) 
     { 
      var hasher = System.Security.Cryptography.HMACSHA256.Create(); 
      var HashValue = hasher.ComputeHash(Encoding.ASCII.GetBytes(RawData)); 
      return string.Join("", HashValue.Select(b => b.ToString("x2"))).ToUpper(); 
     } 

私は私が右の方法をしたかしなかったかどうかを確認していません。この問題で私を助けてください。

ご協力いただければ幸いです。

答えて

0

あなたは今までにそれをやったと思います。しかし、あなたの提供するコードでは、Secure Hash Secretからハッシュを作成しようとしており、すべての値が一緒に結合されています。それは間違っている。あなたはHMACSHA256オブジェクトに供給されたキーとしてセキュアハッシュの秘密を使用し、KEY1 = VALUE1 &キー=値2 &の文字列からハッシュを計算する必要があります... の作業コード:

var secureSecret = "123456789ABCDEF123456789ABCDEF12"; 
      var args = new SortedDictionary<string, string>() 
      { 
       {"vpc_Version", "1"}, 
       {"vpc_Command", "refund"}, 
       {"vpc_MerchTxnRef", "TestRefund"}, 
       {"vpc_AccessCode", "XXXXXXXX"}, 
       {"vpc_Merchant", "XXXXXXXX"}, 
       {"vpc_TransNo", "123"}, 
       {"vpc_Amount", "1"} 
      }; 
      var getPart = ""; 
      foreach (var arg in args) 
      { 
       getPart += arg.Key + "=" + arg.Value + "&"; 
      } 
      getPart = getPart.TrimEnd('&'); 
      var keyBytes = new byte[secureSecret.Length/2]; 
      for(int i=0;i<keyBytes.Length;i++) 
      { 
       keyBytes[i] = byte.Parse(secureSecret.Substring(i * 2, 2), System.Globalization.NumberStyles.HexNumber); 
      } 
      var hmac = new HMACSHA256(keyBytes); 
      var hash = hmac.ComputeHash(Encoding.ASCII.GetBytes(getPart)); 
      var hashString = BitConverter.ToString(hash).Replace("-", ""); 
      var requestUri = "https://migs.mastercard.com.au/vpcpay?"+getPart+"&vpc_SecureHash="+hashString+"&vpc_SecureHashType=SHA256"; 
関連する問題