You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

亚马逊联盟API Java代码转C# .NET Core出错,求AWSV4Auth替代方案

解决亚马逊PAAPI5 C#签名及代码错误问题

错误原因分析

  1. 找不到AWSV4Auth:这是Java生态专属的签名实现类,C#中无对应命名空间,需替换为C#生态的AWS签名方案。
  2. 解构变量类型无法推断:原代码中header集合的类型不支持解构语法,需改用常规键值对遍历方式。

解决方案

步骤1:安装依赖NuGet包

在项目中安装以下两个包:

  • AWSSDK.Core:AWS官方提供的签名工具包
  • Newtonsoft.Json:用于JSON序列化与解析

步骤2:修正后的完整代码

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Amazon.Runtime;
using Amazon.Runtime.Signing;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace AmazonPaApiDemo
{
    class Program
    {
        // 替换为你的凭证与配置
        private const string ACCESS_KEY = "你的AWS Access Key";
        private const string SECRET_KEY = "你的AWS Secret Key";
        private const string HOST = "webservices.amazon.co.uk";
        private const string URI_PATH = "/paapi5/searchitems";
        private const string REGION = "eu-west-1";
        private const string PARTNER_TAG = "你的联盟PartnerTag";

        static async Task Main(string[] args)
        {
            // 构造请求Payload(用匿名对象避免字符串拼接错误)
            var requestPayload = new
            {
                Keywords = "yoshi",
                Resources = new[]
                {
                    "Images.Primary.Medium",
                    "ItemInfo.Title",
                    "Offers.Listings.Condition",
                    "Offers.Listings.Price",
                    "Offers.Listings.Link" // 新增联盟链接字段
                },
                ItemCount = 1,
                PartnerTag = PARTNER_TAG,
                PartnerType = "Associates",
                Marketplace = "www.amazon.co.uk"
            };
            string payloadJson = JsonConvert.SerializeObject(requestPayload);

            // 基础请求头
            var baseHeaders = new Dictionary<string, string>
            {
                {"Content-Type", "application/json; charset=UTF-8"},
                {"X-Amz-Target", "com.amazon.paapi5.v1.ProductAdvertisingAPIv1.SearchItems"},
                {"Host", HOST}
            };

            // 使用AWS官方SDK生成V4签名
            var signer = new AWS4Signer();
            var credentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);
            var signingResult = signer.SignRequest(
                new HttpRequestMessage(HttpMethod.Post, $"https://{HOST}{URI_PATH}"),
                credentials,
                "ProductAdvertisingAPI",
                REGION,
                payloadJson,
                baseHeaders
            );

            // 发送请求并处理响应
            using (var httpClient = new HttpClient())
            {
                var request = new HttpRequestMessage(HttpMethod.Post, $"https://{HOST}{URI_PATH}");
                request.Content = new StringContent(payloadJson, Encoding.UTF8, "application/json");

                // 添加签名后的请求头
                foreach (var kvp in signingResult.SignedHeaders)
                {
                    if (!request.Headers.TryAddWithoutValidation(kvp.Key, kvp.Value))
                    {
                        request.Content.Headers.TryAddWithoutValidation(kvp.Key, kvp.Value);
                    }
                }

                var response = await httpClient.SendAsync(request);
                var jsonResponse = await response.Content.ReadAsStringAsync();
                var statusCode = (int)response.StatusCode;

                Console.WriteLine(jsonResponse);

                if (statusCode == 200)
                {
                    Console.WriteLine("成功获取Product Advertising API响应");
                    // 解析目标字段
                    var json = JObject.Parse(jsonResponse);
                    var targetItem = json["SearchResult"]["Items"]?[0];
                    if (targetItem != null)
                    {
                        string title = targetItem["ItemInfo"]["Title"]["DisplayValue"]?.ToString();
                        string imageUrl = targetItem["Images"]["Primary"]["Medium"]["URL"]?.ToString();
                        string price = targetItem["Offers"]["Listings"]?[0]["Price"]["DisplayAmount"]?.ToString();
                        string condition = targetItem["Offers"]["Listings"]?[0]["Condition"]["DisplayValue"]?.ToString();
                        string affiliateLink = targetItem["Offers"]["Listings"]?[0]["Link"]?.ToString();

                        Console.WriteLine($"标题: {title}");
                        Console.WriteLine($"图片链接: {imageUrl}");
                        Console.WriteLine($"价格: {price}");
                        Console.WriteLine($"商品状态: {condition}");
                        Console.WriteLine($"联盟链接: {affiliateLink}");
                    }
                }
                else
                {
                    var errorJson = JObject.Parse(jsonResponse);
                    if (errorJson.ContainsKey("Errors"))
                    {
                        var errorArray = errorJson["Errors"] as JArray;
                        foreach (var error in errorArray)
                        {
                            Console.WriteLine($"错误代码: {error["Code"]}, 错误信息: {error["Message"]}");
                        }
                    }
                    else
                    {
                        Console.WriteLine("错误代码: InternalFailure, 错误信息: 请求处理失败,原因是未知错误、异常或故障,请重试");
                    }
                }
            }
        }
    }
}

关键修改说明

  1. 替换签名实现:用AWS官方的AWS4Signer替代Java的AWSV4Auth,实现标准AWS V4签名流程。
  2. 修复遍历语法:将解构遍历改为foreach (var kvp in signingResult.SignedHeaders),通过kvp.Key和kvp.Value访问键值对。
  3. 优化Payload构造:用匿名对象+JSON序列化替代字符串拼接,避免引号转义错误。
  4. 补充联盟链接字段:在Resources数组中添加Offers.Listings.Link,确保获取联盟推广链接。

内容的提问来源于stack exchange,提问作者CrazyLegs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 10:57:02