2

サンドボックスで、Amazon の v2 c# SDK (MVC アプリ) を使用して、Amazon Pay をウェブサイトに統合しています。セットアップはすべて良好です。キー、リターン URL などを作成しました。

私のチェックアウト プロセスでは、成功した CheckoutSession を作成します。Amazon Pay ボタンをクリックし、テスト購入者アカウントを使用してログインし、有効なテスト用クレジット カードを使用して商品の「支払い」を行います。

Amazon は、期待どおりにチェックアウト セッション 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 セッション ID をキャッシュに保存し、合計を保存します。ペイロードが Amazon Pay スクリプトに返され、Amazon サイトに移動します。支払いタイプを選択し、[チェックアウトに進む] をクリックすると、SessionId を使用してサイトに戻り、「完了」ステップを実行できます。

私の CompleteCheckoutSession(sessionId) へのリクエスト

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

client.CompleteCheckoutSession(sessionId) メソッドからの result.RawResponse:

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

注: 一部のキーは難読化されていますが、実際のキーはサンプル コードにあります。

4

2 に答える 2

3

CheckoutSession を手動で作成しても、フォローしている「レビュー ページなし」フローでは機能しません。このフローを統合する場合は、ボタン コードで createCheckoutSessionConfig パラメータを使用して、Amazon Pay に CheckoutSession を作成させる必要があります。こちらを参照してください: https://amazonpaycheckoutintegrationguide.s3.amazonaws.com/amazon-pay-apb -checkout/add-the-amazon-pay-button.html#4-render-the-button

編集:

以下のコード サンプルは、「注文レビューなし」の支払いフローのペイロードと署名を作成する方法を示しています。Amazon Pay に支払いをすぐに処理するように指示する CheckoutMode パラメータと、購入者がチェックアウトを完了するために送信される URL を定義する checkoutResultReturnUrl に注意してください。ユーザーがその 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();
}
于 2021-01-02T14:48:52.543 に答える