【问题标题】:Amazon Pay SDK CompleteCheckoutSession ErrorAmazon Pay SDK CompleteCheckoutSession 错误
【发布时间】:2021-04-08 15:14:01
【问题描述】:

我正在沙箱中使用来自亚马逊的 v2 c# SDK(MVC 应用程序)将亚马逊支付与我的网站集成。设置一切正常,我创建了密钥、返回 url 等。

在我的结帐过程中,我创建了 CheckoutSession,它是成功的。我点击亚马逊支付按钮,使用我的测试买家账户登录,然后使用他们有效的测试信用卡“支付”该商品。

亚马逊按预期重定向到带有结帐会话 ID 的返回 URL。

当我尝试 CompleteCheckoutSession 时,结果是来自 Amazon API 的错误返回

error: InvalidCheckoutSessionStatus
message: You tried to call an operation on a Checkout Session that is in a state where that operation is not allowed

我在尝试完成之前放入了一行测试代码检索CheckoutSession来查看它,它显示当前状态为“打开”,这是尝试完成时的正确状态,所以我不知道为什么结帐会话状态无效。

编辑:

请注意,我正在为我的交易使用此流程,因此没有对交易的“审查”。买家在我的网站上选择他的商品。

https://amazonpaycheckoutintegrationguide.s3.amazonaws.com/amazon-pay-apb-checkout/additional-payment-button-overview.html

另外请注意,我正在根据此动态创建有效负载:

https://amazonpaycheckoutintegrationguide.s3.amazonaws.com/amazon-pay-checkout/amazon-pay-script.html#render-button-using-a-checkout-session-object

因此,当单击 amazonpay 按钮时,它会调用我网站上的一个方法,该方法会构建开始 CheckoutSession 的有效负载。然后,我在缓存中保存了 Amazon Session ID,并保存了总数。有效载荷返回到亚马逊支付脚本,然后将我带到亚马逊网站。我选择付款类型并单击“继续结帐”,这会将我带回带有 SessionId 的站点以执行“完成”步骤。

我对 CompleteCheckoutSession(sessionId) 的请求

{"chargeAmount":{"amount":99,"currencyCode":"USD"}}

result.RawResponse 来自 client.CompleteCheckoutSession(sessionId) 方法:

{
"reasonCode":"InvalidCheckoutSessionStatus",
"message":"You tried to call an operation on a Checkout Session that is in a state where that operation is not allowed"
}

编辑示例代码:

我创建了一个具有基本功能的全新测试 MVC 应用程序:

public ActionResult Index()
{
var client = InitiateClient(); //hidden for security

// prepare the request
var request = new CreateCheckoutSessionRequest
(
    checkoutReviewReturnUrl: "http://localhost:44300/home/completecheckout",
    storeId: "amzn1.application-oa2-client.mystoreid"
);

request.PaymentDetails.PaymentIntent = Amazon.Pay.API.WebStore.Types.PaymentIntent.AuthorizeWithCapture;
request.PaymentDetails.ChargeAmount.Amount = 99;
request.PaymentDetails.ChargeAmount.CurrencyCode = Currency.USD;

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

return View();

}

在 Index.cshtml 文件中:

<div id="AmazonPayButton"></div>
<script src="https://static-na.payments-amazon.com/checkout.js"></script>
<script type="text/javascript" charset="utf-8">
amazon.Pay.renderButton('#AmazonPayButton', {
    merchantId: 'mymerchantid',
    ledgerCurrency: 'USD',
    sandbox: true,

    checkoutLanguage: 'en_US',
    productType: 'PayOnly',
    placement: 'Checkout',
    buttonColor: 'Gold',

    createCheckoutSessionConfig: {
        payloadJSON: '@Html.Raw(ViewBag.Payload)', // string generated in step 2
        signature: '@Html.Raw(ViewBag.Signature)', // signature generated in step 3
        publicKeyId: 'AGPTYXGL5VH6PSYLJUSHTKW6'
    }
});
</script>

最后是完整的结帐代码,但不成功:

public ActionResult CompleteCheckout(string amazonCheckoutSessionId)
{
    var client = InitiateClient(); //hidden for security
    var request = new CompleteCheckoutSessionRequest(99.00M, Currency.USD);

    // send the request
    var result = client.CompleteCheckoutSession(amazonCheckoutSessionId, request);

    // check if API call was successful
    if (!result.Success)
    {
        throw new Exception("API Call unsuccessful");
    }

    return View();
}

注意:某些键被混淆了,但实际键在示例代码中。

【问题讨论】:

  • 这是在您从亚马逊托管页面 (amazonPayRedirectUrl) 被发送回您的返回 URL (checkoutResultReturnUrl) 之后,对吧?您是从 URL 中读取 CheckoutSessionID,还是将其缓存在本地某处?您能否提供来自 API 的原始响应(请参阅 AmazonPayResponse 对象中的 RawResponse 属性)?
  • 嗨,丹,是的,这是在我从亚马逊托管页面发回之后。我从与创建的会话匹配的 url 中读取了 CheckoutSessionId。我发布的错误本质上是我添加的 RawResponse。查看我的编辑。

标签: c# amazon-pay


【解决方案1】:

手动创建 CheckoutSession 不适用于您遵循的“无评论页面”流程。如果您想集成此流程,您必须让 Amazon Pay 使用按钮代码中的 createCheckoutSessionConfig 参数为您创建 CheckoutSession,请参见此处:https://amazonpaycheckoutintegrationguide.s3.amazonaws.com/amazon-pay-apb-checkout/add-the-amazon-pay-button.html#4-render-the-button

编辑:

下面的代码示例显示了如何为“无订单审查”支付流程构建有效负载和签名。请注意 CheckoutMode 参数,它指示 Amazon Pay 立即处理付款,以及 checkoutResultReturnUrl,它定义了买家被发送到以完成结帐的 URL。当用户到达该 URL 时,您必须调用 Complete CheckoutSession,现在应该会成功。

public ActionResult Index()
{
    var client = InitiateClient(); //hidden for security

    // prepare the request
    var request = new CreateCheckoutSessionRequest
    (
        checkoutReviewReturnUrl: null,
        storeId: "amzn1.application-oa2-client.mystoreid"
    );

    // instructs Amazon Pay to immediately process the payment
    request.WebCheckoutDetails.CheckoutMode = CheckoutMode.ProcessOrder;
    request.WebCheckoutDetails.CheckoutResultReturnUrl = "http://localhost:44300/home/completecheckout";

    // payment details
    request.PaymentDetails.PaymentIntent = Amazon.Pay.API.WebStore.Types.PaymentIntent.AuthorizeWithCapture;
    request.PaymentDetails.ChargeAmount.Amount = 99;
    request.PaymentDetails.ChargeAmount.CurrencyCode = Currency.USD;

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

    return View();
}

【讨论】:

  • 谢谢丹。有没有办法在将我重定向到亚马逊页面之前获取创建的会话 ID?
  • 另外,手动创建 CheckoutSession 的用例是什么?
  • 不适用于此集成流程。通常不建议手动创建 CheckoutSession,仅支持高级用例,例如在后台异步生成 CheckoutSession,以最大限度地减少用户单击 Amazon Pay 按钮时的延迟。不过,对于大多数用例,建议通过 createCheckoutSessionConfig 进行基于前端的集成。
  • 嗨 Larry,我在本地项目中测试了我的代码示例,发现 SDK 存在一个小缺陷,因为它强制您通过 checkoutReviewReturnUrl,这不适用于此集成流程。我已经通过将此参数设置为 null 并传递缺少的 CheckoutResultReturnUrl 参数来调整代码示例,这可能是您看到的错误的根本原因。试一试,让我知道它是否有效。
  • 很高兴我能帮上忙 :)
【解决方案2】:

我遇到了类似的问题,我花了很长时间才弄清楚。这就是发生在我身上的事情。

我无意创建生产代码。我只想创建一个只有 Amazon Pay 按钮的测试页面。我使用了几个节点 js 脚本来getCheckoutSession/updateCheckoutSession。但是,当我尝试completeCheckoutSession 时,我得到了“InvalidCheckoutSessionStatus”。

最后,我发现,在我设置了所有必需的参数并删除了所有约束之后,updateCheckoutSession 在 API 返回中给了我一个“amazonPayRedirectUrl”。这个网址真的很重要。您需要访问该 URL 才能完成审核...

来自亚马逊官网:

"一旦没有约束,响应将返回一个唯一的 amazonPayRedirectUrl。将买家重定向到该 URL 以完成 结帐。”

“Daniel Lemke”提到了解决此问题的另一种方法。这样,购物者就不需要确认会话。但是,您需要确保在webCheckoutDetailspaymentDetails、addressDetails)中提供所有有用信息。如果你只给checkoutMode,你会得到“MissingParameterValue”。

来自亚马逊官网:

"使用'ProcessOrder'时需要paymentDetails。addressDetails 如果您使用 'ProcessOrder' 并将 productType 设置为 'PayAndShip'"

【讨论】:

    猜你喜欢
    • 2020-11-06
    • 2022-01-19
    • 2022-08-07
    • 2021-11-26
    • 2021-01-18
    • 1970-01-01
    • 2018-09-20
    • 2015-08-13
    • 2021-03-10
    相关资源
    最近更新 更多