簡體   English   中英

Amazon Product Affiliate REST API集成

[英]Amazon Product Affiliate REST API Integration

我正在嘗試與Amazon Product Affiliate REST API集成,我拒絕使用SOAP集成,請不要在這里調出Soap,我要使用REST,我正在使用最新的API版本,即08 / 2013年1月1日,我遵循了說明文件,總以某種方式總是返回403禁止的錯誤,我到處都是,我所看到的唯一是,ppl對亞馬遜上的過時示例感到憤怒,所以我沒有感到沮喪開始集成工作,這是我使用的規格。

面向.NET 4.5.2 Amazon Api版本的VS 2015控制台應用程序2013年8月1日

這是我的代碼庫

我有一個名為AmazonRestService的類,該類具有ItemLookup所需的所有屬性,

在構造函數中,我設置了一些屬性,這是每個請求的默認屬性,然后我有一個名為SignAmazonRequest的方法,該方法將AmazonRestService作為參數,並且我檢查了所有具有值的字段,並填充了需要簽,

  public class AmazonRestService { public string Url { get; set; } public string Operation { get; set; } public string AWSAccessKeyId { get; set; } public string SecretKey { get; set; } public string AssociateTag { get; set; } public string ItemId { get; set; } public string IdType { get; set; } public string[] ResponseGroup { get; set; } public string Timestamp { get; set; } public string Signature { get; set; } public string Version { get; set; } public AmazonRestService() { Url = "http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&"; AWSAccessKeyId = "XXXXXXXXXXXXXXXXXXXXX"; AssociateTag = "xxxx-xx"; SecretKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ"); Version = "2013-08-01"; } public AmazonRestService SignAmazonRequest(AmazonRestService service) { var stringToSign = ""; stringToSign = stringToSign + "AssociateTag=" + service.AssociateTag; if (!string.IsNullOrEmpty(service.Operation)) { stringToSign = stringToSign + "&Operation=" + service.Operation; } if (!string.IsNullOrEmpty(service.ItemId)) { stringToSign = stringToSign + "&ItemId=" + service.ItemId; } if (!string.IsNullOrEmpty(service.IdType)) { stringToSign = stringToSign + "&IdType=" + service.IdType; } if (service.ResponseGroup.Length > 0) { stringToSign = stringToSign + "&ResponseGroup="; var lastResponse = service.ResponseGroup.Last(); foreach (var response in service.ResponseGroup) { stringToSign = stringToSign + response; if (response != lastResponse) { stringToSign = stringToSign + ","; } } } stringToSign = stringToSign + "&Version=" + service.Version; stringToSign = stringToSign + "&AWSAccessKeyId=" + service.AWSAccessKeyId + "&Timestamp=" + service.Timestamp; stringToSign = stringToSign.Replace(",", "%2C"); stringToSign = stringToSign.Replace(":", "%3A"); service.Url = service.Url + stringToSign; stringToSign = stringToSign + "&Service=AWSECommerceService"; service.Signature = HmacSha256.SignAmazonRequest(service.SecretKey, stringToSign); service.Url = service.Url + "&Signature=" + service.Signature; return service; } } 

一旦准備好對字符串進行簽名,我將在另一個名為HmacSha256.SignAmazonRequest的類上調用靜態方法,在該類中傳遞我的secretKey和要簽名的字符串,

  public static class HmacSha256 { public static string SignAmazonRequest(string secretKey, string request) { var stringToSign = PrepareSignatureEncryption(request); var bytesToSign = Encoding.UTF8.GetBytes(stringToSign); var secretKeyBytes = Encoding.UTF8.GetBytes(secretKey); var hmacSha256 = new HMACSHA256(secretKeyBytes); var hashBytes = hmacSha256.ComputeHash(bytesToSign); return Convert.ToBase64String(hashBytes).Replace("+", "%2B").Replace("=", "%3D"); } private static string PrepareSignatureEncryption(string request) { var header = "GET" + Environment.NewLine + "webservices.amazon.com" + Environment.NewLine + "/once/xml" + Environment.NewLine; var result = header + request; return result; } } 

在SignAmazonRequest方法中,我首先按照亞馬遜希望的方式准備了字符串,

我有一個稱為PrepareSignatureEncryption的私有幫助器方法,它使用要簽名的字符串作為參數,並返回亞馬遜在其文檔中顯示的格式正確的字符串,然后將字符串轉換為字節,然后將密鑰轉換為字節,生成HMACSHA256基於密鑰字節,我計算要簽名的字符串的哈希,然后返回轉換為base64字符串的字節,

現在,這是我在靜態void main中的代碼。

  class Program { static void Main(string[] args) { var restService = new AmazonRestService(); restService.Operation = "ItemLookup"; restService.IdType = "ASIN"; restService.ItemId = "ASINTOLOOKUP"; restService.ResponseGroup = new string[] { "BrowseNodes", "Images", "ItemAttributes", "Offers", "Reviews", "SalesRank" }; var signedRequest = restService.SignAmazonRequest(restService); Console.WriteLine(signedRequest.Url); Console.ReadLine(); try { var request = WebRequest.Create(signedRequest.Url); var response = request.GetResponse(); var doc = new XmlDocument(); doc.Load(response.GetResponseStream()); doc.Save("C:/data.xml"); } catch (Exception ex) { var msg = ex.Message; } } } 

我正在遵循本文檔

知道我哪里出錯了嗎?

亞馬遜的文件資料不好。 但是您可以使用此庫Nager.AmazonProductAdvertising在nugetgithub上可用

PM> Install-Package Nager.AmazonProductAdvertising

var authentication = new AmazonAuthentication();
authentication.AccessKey = "accesskey";
authentication.SecretKey = "secretkey";

var wrapper = new AmazonWrapper(authentication, AmazonEndpoint.US);
var result = wrapper.Search("canon eos", AmazonSearchIndex.Electronics, AmazonResponseGroup.Large);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM