首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Amazon CompleteCheckoutSession错误

Amazon CompleteCheckoutSession错误
EN

Stack Overflow用户
提问于 2021-01-02 01:51:04
回答 2查看 1.5K关注 0票数 2

我正在将Amazon与我的网站集成在沙箱中,使用来自亚马逊的v2 c# SDK (MVC应用程序)。安装都很好,我创建了键,返回urls等等。

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

Amazon重定向到我的返回URL,并按预期使用签出会话id。

当我尝试CompleteCheckoutSession时,结果是从Amazon返回一个错误。

代码语言:javascript
运行
复制
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以查看它,它显示当前状态是"Open",这是在尝试完成它时正确的状态,所以我不知道为什么签出会话状态无效。

编辑:

注意,我在我的事务中使用这个流,所以没有对事务的“审查”。买家选择他的项目在我的网站上。

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会话ID保存在缓存中,并保存总数。有效载荷返回到Amazon脚本,然后将我带到Amazon站点。我选择付款类型,并单击“继续结帐”,这将我送回我的网站与SessionId做“完整”的步骤。

我对CompleteCheckoutSession的请求(SessionId)

代码语言:javascript
运行
复制
{"chargeAmount":{"amount":99,"currencyCode":"USD"}}

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

代码语言:javascript
运行
复制
{
"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应用程序,具有基本功能:

代码语言:javascript
运行
复制
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文件中:

代码语言:javascript
运行
复制
<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>

最后,完成了没有成功的代码:

代码语言:javascript
运行
复制
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();
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-02 14:48:52

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

编辑:

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

代码语言:javascript
运行
复制
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();
}
票数 3
EN

Stack Overflow用户

发布于 2021-01-26 08:05:27

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

我并不打算创建生产代码。我只想创建一个只有Amazon按钮的测试页面。我在getCheckoutSession/updateCheckoutSession中使用了几个节点js脚本。然而,当我尝试"InvalidCheckoutSessionStatus".的时候,我得到了completeCheckoutSession

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

这是亚马逊的官方网站:

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

解决这一问题的另一个办法是“丹尼尔·莱姆克”。这样,购物者就不需要确认会议内容了。但是,您需要确保webCheckoutDetails (paymentDetails,addressDetails)中提供所有有用的信息。如果您只给checkoutMode,您将得到"MissingParameterValue“。

这是亚马逊的官方网站:

当使用'ProcessOrder‘时,

"paymentDetails是必需的。如果您将productType设置为'PayAndShip'"

,则addressDetails也是必需的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65535379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档