【问题标题】:Unsupported private key format amazon pay不支持的私钥格式亚马逊支付
【发布时间】:2021-12-07 09:52:03
【问题描述】:

我一直在尝试使用 amazon sdk for .net 将 amazon pay 与我的 mvc 应用程序集成。我按照提到here的步骤进行操作。我可以使用在卖家账户中创建的私钥和公钥创建客户端。

using Amazon.Pay.API.Types;
using Amazon.Pay.API.WebStore;

public class Sample
{
    public WebStoreClient InitiateClient()
    {
        // set up config
        var payConfiguration = new ApiConfiguration
        (
            region: Region.Europe,
            publicKeyId: "MY_PUBLIC_KEY_ID", // LIVE-XXXXX or SANDBOX-XXXXX
            privateKey: "PATH_OR_CONTENT_OF_MY_PRIVATE_KEY"
        );

        // init API client
        var client = new WebStoreClient(payConfiguration);

        return client;
    }
}

当我尝试创建签名时使用客户端,我收到异常为不支持的私钥格式

using Amazon.Pay.API.WebStore.CheckoutSession;
using Amazon.Pay.API.WebStore;

public class Sample : PageModel
{
    // ..

    public string Signature { get; private set; }

    public string Payload { get; private set; }

    public void OnGet()
    {
        // prepare the request
        var request = new CreateCheckoutSessionRequest
        (
            checkoutReviewReturnUrl: "https://example.com/review.html",
            storeId: "amzn1.application-oa2-client.000000000000000000000000000000000"
        );

        // generate the button signature
        var signature = client.GenerateButtonSignature(request);

        // generate the signature and payload string that is passed back to the frontend
        Signature = client.GenerateButtonSignature(request);
        Payload = request.ToJson();
    }
}

异常的堆栈跟踪

   at Amazon.Pay.API.SignatureHelper.GenerateSignature(String stringToSign)
   at Amazon.Pay.API.WebStore.WebStoreClient.GenerateButtonSignature(String jsonString)
   at Amazon.Pay.API.WebStore.WebStoreClient.GenerateButtonSignature(CreateCheckoutSessionRequest request)

【问题讨论】:

    标签: c# amazon-pay


    【解决方案1】:

    提供私钥有两种方式:1/.pem 文件的完整文件路径或 2/.pem 的字符串内容

    你没有提到你选择了哪个选项,所以我将简要概述每个选项。

    1. .pem 文件的完整路径。我建议在初始化 WebStoreClient 之前设置一个调试断点,以确保您提供的路径有效并且实际加载了文件内容。这是错误的最常见原因 - 文件路径无效,导致未加载私钥。

      var payConfiguration = new ApiConfiguration
          (
              region: Region.Europe,
              publicKeyId: "YOUR_PUBLIC_KEY_ID", 
              privateKey: "C:\\temp\\ap.pem"
          );
      
    2. .pem 文件的字符串内容。这里最常见的错误原因是复制/粘贴错误,可能会无意中添加特殊字符。

      var payConfiguration = new ApiConfiguration
         (
             region: Region.Europe,
             publicKeyId: "YOUR_PUBLIC_KEY_ID", 
             privateKey: "-----BEGIN PRIVATE KEY-----\nXXXXX\n-----END PRIVATE KEY-----"
         );
      

    我会始终提醒不要对私钥的字符串或路径进行硬编码,并鼓励尽可能从安全的密钥库中加载这些凭据。

    【讨论】:

    • 感谢您的回答,我使用的是字符串内容而不是文件路径。我犯了你提到的同样的错误,没有复制整个字符串(包括----BEGIN PRIVATE KEY---)。所以我在创建客户端时出错,在我提出这个问题之前我更正了它。但我真正的问题不在于创建客户端对象,而在于创建签名。当我在 client.GenerateButtonSignature(request); 拨打电话时抛出异常
    • 如果您在提供 .pem 的字符串内容时遇到该异常,则有关提供的字符串值的某些内容不准确/无效。我要么使用流阅读器以编程方式读取 .pem 的字符串,要么提供 .pem 的路径,因为您如何复制 .pem 文件的内容是问题的根源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 2021-06-02
    相关资源
    最近更新 更多