当前位置: 首页 > 知识库问答 >
问题:

Amazon Pay SDK CompleteCheckoutSession错误

苗征
2023-03-14

我正在沙箱中使用亚马逊v2 html" target="_blank">c#SDK(MVC应用程序)将亚马逊支付与我的网站集成。设置都很好,我创建了键,返回URL等。

在签出过程中,我创建了CheckoutSession,这是成功的。我单击亚马逊支付按钮,使用我的测试买家帐户登录,并使用他们的有效测试信用卡“支付”项目。

Amazon按照预期使用结帐会话ID重定向到我的返回URL。

当我尝试完成TechEckoutSession时,结果是从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-按钮-using-a-checkout-session-object

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

我的CompleteCheckoutSession请求(sessionId)

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

后果RAW来自客户端的响应。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();

}

索引中。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>

最后是completecheckout代码,该代码不成功:

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();
}

注意:某些键已模糊,但实际键在示例代码中。

共有2个答案

姜志行
2023-03-14

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

我无意创建生产代码。我只想创建一个只有亚马逊支付按钮的测试页面。我使用了几个节点js脚本来获取CheckOutSession/updateCheckoutSession。然而,当我尝试completeCheckoutSession时,我得到了“InvalidCheckoutSessionStatus”。

最后,我发现,在设置了所有必需的参数并删除了所有约束之后,updateCheckoutSession在API返回中为我提供了一个“amazonPayRedirectUrl”。这个URL真的很重要。您需要转到该URL才能完成审阅。。。

亚马逊官网链接:

“一旦没有限制,响应将返回唯一的amazonPayRedirectUrl。将买家重定向到该URL以完成签出。”

解决这个问题的另一种方法是“DanielLemke”。这样,购物者就不需要确认会话。但是,您需要确保在webCheckoutDetails中提供所有有用的信息(paymentDetails、addressDetails)。如果您只给出签出模式(checkout mode),您将得到“MissingParameterValue”。

亚马逊官网链接:

“使用“ProcessOrder”时需要paymentDetails。如果使用“ProcessOrder”并将productType设置为“PayAndShip”,则还需要addressDetails”

郎鸿朗
2023-03-14

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

编辑:

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

html" target="_blank">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();
}
 类似资料:
  • 我正在尝试搜索亚马逊的产品广告,并使用botlenose来帮助我做到这一点。但是,我刚刚收到HTTP错误400。 其他一些重要信息: 我来自巴西,我的标签也来自亚马逊。这是个问题吗? 我确实检查了我的钥匙、秘密和标签,一切正常。我确实在StackOverflow上查看了其他一些问题,但对我来说没有任何效果。 当然,出于安全原因,我更改了密钥。 Traceback(最近一次调用最后一次):File"

  • 我有一个基于Spring Web model view controller(MVC)框架的项目。Spring Web模型-视图-控制器(MVC)框架的版本是3.2.8 我有这个控制器 这个URL一切正常:

  • 目前从Angular JS controller中,我试图将JSON数据发送到后端服务。但是我有400个错误的请求错误。 在Controller中,我试图通过http服务发送数据,如下所示:

  • 我得到了这个错误,有什么想法会导致它吗?我试图发送一个DTO,它有一个扩展抽象类的对象列表,我想这个问题可能是因为DTO中的列表,还是因为抽象类的子类?

  • 在月食中, ”org.apache.axis2。AxisFault:传输错误: 403错误:禁止”试图从svn检出项目时发生错误。我不能实现这个错误,因此我检查了从终端使用"svn-co"命令的项目。 但是,有趣的是,当我试图在Eclipse中运行应用程序时,在输入凭据(用户名和密码)并按下“登录”按钮之后,我又遇到了相同的错误。响应是JFrame上的无效用户名/密码,但凭据没有错误。这只发生在日

  • Errors 错误 Library routines must often return some sort of error indication to the caller. As mentioned earlier, Go’s multivalue return makes it easy to return a detailed error description alongside th

  • 本章概述了Google API错误模型,以及开发人员如何正确生成和处理错误的一般指南。 Google API使用简单的协议无关错误模型,这使我们能够在不同的API,API协议(如gRPC或HTTP)以及错误上下文(例如,异步,批处理或工作流错误)中获得一致的体验。 错误模型 错误模型在逻辑上由google.rpc.Status定义,当API发生错误时,返回一个Status实例给客户端。 以下代码段

  • 5.4. 错误 在Go中有一部分函数总是能成功的运行。比如strings.Contains和strconv.FormatBool函数,对各种可能的输入都做了良好的处理,使得运行时几乎不会失败,除非遇到灾难性的、不可预料的情况,比如运行时的内存溢出。导致这种错误的原因很复杂,难以处理,从错误中恢复的可能性也很低。 还有一部分函数只要输入的参数满足一定条件,也能保证运行成功。比如time.Date函数