【问题标题】:The remote server returned an error: (401) Unauthorized. In Visa develope payment Gateway远程服务器返回错误:(401) Unauthorized。在 Visa 开发支付网关
【发布时间】:2020-02-07 06:09:36
【问题描述】:

我在使用 c# 代码实现签证网络源时遇到错误,我在创建项目后下载了源代码,但出现错误可能是 x-pay-token 未正确生成。有什么方法可以验证我的令牌或通过传递参数使用任何 API 生成它。下面的代码,我正在使用

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

【问题讨论】:

    标签: c# visa-api


    【解决方案1】:

    这是官方的 Visa 方式: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; 
    }
    

    【讨论】:

    • 感谢您的考虑,但我有相同的代码来获取时间戳,并且还会生成 x-pay-token,但是当我传递 x-pay-token 时,我收到了未经授权的错误。所以我不确定生成的 x-pay-token 是否正确
    • 我也对为sandbox.api.visa.com/cybersource/v2/payments?apikey={apikey} api 传递 resourcePath 感到困惑
    • 那你的代码就好了。检查这个:community.developer.visa.com/t5/Getting-Started-with-Visa/… 其他原因。错误的键,需要错误的 http 动词 Post),正文未使用完全相同的空格进行哈希处理,例如
    猜你喜欢
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    相关资源
    最近更新 更多