首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码403的HMAC验证失败

代码403的HMAC验证失败
EN

Stack Overflow用户
提问于 2015-08-07 05:07:15
回答 2查看 6.2K关注 0票数 2

从过去的三天开始,我一直在探索payeezy api。我只是从一个C#应用程序发出一个简单的http请求。我遵循了所有的步骤,提到并正确地验证了每一件事。下面是每个项目的详细信息。

  1. API密钥:-我已经验证了我的api密钥是正确的。
  2. API秘密:-这也是正确的。
  3. 商人令牌:-它也被验证了。
  4. 现在:-我创建了密码强随机数如下。 RandomNumberGenerator rng =新RNGCryptoServiceProvider();byte[] nonceData =新byte18;rng.GetBytes(nonceData);string nonce =RNGCryptoServiceProvider
  5. 时间戳:- 字符串时间戳= Convert.ToInt64(ts.TotalMilliseconds).ToString();
  6. 有效载荷:- {“merchant_ref”:“惊人销售”,“transaction_type”:“授权”,“方法”:“credit_card”,“金额”:“1299”,“currency_code”:“美元”,“credit_card”:{“类型”:“签证”,“cardholder_name”:“约翰·史密斯”,"card_number":"4788250000028291","exp_date":"1020",“cvv”:“123”}
  7. 然后我创建了HMAC,如下所示。 私有字符串CreateAuthorization(字符串数据,字符串秘密){ //数据采用以下格式。// data = apiKey + nonce +时间戳+令牌+有效载荷;apiKey=保密??“;使用(var hmacsha256 =新HMACSHA256(Encoding.UTF8.GetBytes(机密){ byte[] hashdata =byte[]返回Convert.ToBase64String(hashdata);}}
  8. 现在我得到了hmac验证错误。我生成的hmac字符串是64位,而在您的网站下的docs和沙箱它的86位。

请你在这方面帮助我,因为我被困在这个问题上从过去的三天。谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-07 06:04:54

以下是“HMAC验证失败”的常见原因:

  1. API密钥和/或API秘密是不正确的。
  2. API密钥、API秘密、商人令牌中的前导或尾随空格。
  3. HTTP头中的时间戳不以毫秒为单位。
  4. HTTP报头中的时间戳并不代表划时代的时间。
  5. HTTP报头中的时间戳不在服务器时间的5分钟之内。
  6. 系统时间不准确。

下面是生成HMAC的示例c#代码:

代码语言:javascript
复制
public byte[] CalculateHMAC(string data, string secret)
    {
        HMAC hmacSha256 = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
        byte[] dataBytes = Encoding.UTF8.GetBytes(data);
        byte[] hmac2Hex = hmacSha256.ComputeHash(Encoding.UTF8.GetBytes(data));

        string hex = BitConverter.ToString(hmac2Hex);
        hex = hex.Replace("-","").ToLower();
        byte[] hexArray = Encoding.UTF8.GetBytes(hex);
        return hexArray;
    }

protected void Button1_Click(object sender, EventArgs e)
{                     
    string jsonString = "{ \"merchant_ref\": \"MVC Test\", \"transaction_type\": \"authorize\", \"method\": \"credit_card\", \"amount\": \"1299\", \"currency_code\": \"USD\", \"credit_card\": { \"type\": \"visa\", \"cardholder_name\": \"Test Name\", \"card_number\": \"4005519200000004\", \"exp_date\": \"1020\", \"cvv\": \"123\" } }";

    Random random = new Random();
    string nonce = (random.Next(0, 1000000)).ToString();

    DateTime date = DateTime.UtcNow;
    DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    TimeSpan span = (date - epoch);
    string time = span.TotalSeconds.ToString();

    string token = Request.Form["token"];//Merchant token
    string apiKey = Request.Form["apikey"];//apikey
    string apiSecret = Request.Form["apisecret"];//API secret
    string hashData = apiKey+nonce+time+token+jsonString;

    string base64Hash = Convert.ToBase64String(CalculateHMAC(hashData, apiSecret));

    string url = "https://api-cert.payeezy.com/v1/transactions";

    //begin HttpWebRequest
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);

    webRequest.Method = "POST";
    webRequest.Accept = "*/*";
    webRequest.Headers.Add("timestamp", time);
    webRequest.Headers.Add("nonce", nonce);
    webRequest.Headers.Add("token", token);
    webRequest.Headers.Add("apikey", apiKey);
    webRequest.Headers.Add("Authorization", base64Hash );
    webRequest.ContentLength = jsonString.Length;
    webRequest.ContentType = "application/json";

    StreamWriter writer = null;
    writer = new StreamWriter(webRequest.GetRequestStream());
    writer.Write(jsonString);
    writer.Close();

    string responseString;
    try
        {
            using(HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
            {
                using (StreamReader responseStream = new StreamReader(webResponse.GetResponseStream()))
                {
                    responseString = responseStream.ReadToEnd();
                    request_label.Text = "<h3>Request</h3><br />" + webRequest.Headers.ToString() + System.Web.HttpUtility.HtmlEncode(jsonString);
                    response_label.Text = "<h3>Response</h3><br />" + webResponse.Headers.ToString() + System.Web.HttpUtility.HtmlEncode(responseString);
                }
            }
        }
    catch (WebException ex)
    {
        if (ex.Response != null) 
        {
            using (HttpWebResponse errorResponse = (HttpWebResponse)ex.Response) 
            {
                using (StreamReader reader = new StreamReader(errorResponse.GetResponseStream())) 
                {
                    string remoteEx = reader.ReadToEnd();
                    error.Text = remoteEx;
                }
            }
        }           
    }
}
票数 3
EN

Stack Overflow用户

发布于 2015-08-16 21:40:42

我一直在进行集成,它运行得很好;也许您可以查看一下https://github.com/clifton-io/Clifton.Payment

具体来说,您需要在这里查看:https://github.com/clifton-io/Clifton.Payment/blob/cc4053b0bfe05f2453dc508e96a649fc138b973c/Clifton.Payment/Gateway/Payeezy/PayeezyGateway.cs#L66

祝你好运:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31870058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档