Search code examples
c#visa-api

The remote server returned an error: (401) Unauthorized. In Visa develope payment Gateway


I am getting an error while implementing visa cyber source using c# code and I have downloaded source code for that after creating a project but getting error may be x-pay-token was not generating correctly. Is there any way so I can verify my token or generate it with any API by passing parameter. Below code, I am using

string baseUri = "cybersource/";
string resourcePath = "v2/payments";

string xPayToken = GetXPayToken(resourcePath, "apikey=" + apikey, requestBodyString);static string GetXPayToken(string apiNameURI, string queryString, string requestBody)
{
    string timestamp = GetTimestamp();
    string sourceString = timestamp + apiNameURI + queryString + requestBody;
    string hash = GetHash(sourceString);
    string token = "xv2:" + timestamp + ":" + hash;
    return token;
} 

private static string GetHash(string data)
{
    string sharedSecret = ConfigurationManager.AppSettings["VisaPaySharedSecret"];
    var hashString = new HMACSHA256(Encoding.ASCII.GetBytes(sharedSecret));
    var hashbytes = hashString.ComputeHash(Encoding.ASCII.GetBytes(data));
    string digest = String.Empty;

    foreach (byte b in hashbytes)
    {

    }

    return digest;
}

Solution

  • This Iis the official Visa way to do it: https://developer.visa.com/pages/working-with-visa-apis/x-pay-token#sample_code_for_api_key__shared_secret_xpaytoken

    private static string getTimestamp() {     
        long timeStamp = ((long) DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds) / 1000;     
        return timeStamp.ToString(); 
    }
    
    private static string getHash(string data) {     
        var hashString = new HMACSHA256(Encoding.ASCII.GetBytes(SHARED_SECRET));     
        var hashbytes = hashString.ComputeHash(Encoding.ASCII.GetBytes(data));     
        string digest = String.Empty;    
        foreach (byte b in hashbytes) {         
             digest += b.ToString("x2");     
        }     
        return digest;
    } 
    
    private static string getXPayToken(string resourcePath, string queryString, string requestBody) {    
        string timestamp = getTimestamp();     
        string sourceString = timestamp + resourcePath + queryString  + requestBody;     
        string hash = getHash(sourceString);     
        string token = "xv2:" + timestamp + ":" + hash;     return token; 
    }