0

タイトルはおそらく言葉遣いが悪いです、私の経験不足を許してください。

私はAmazonCheckoutの統合に取り組んでおり、AmazonにURLをフィードするコールバックハンドラーを作成しました。これにより、Amazonにメッセージを送信する必要があるときに、サイトのどのURLをヒットするかがわかります。トランザクションは正常に完了しましたが、Amazonが支払いの処理を完了した後、ユーザーを自分のサイトのページにリダイレクトする必要があります。これは通常、Amazonセラーの中央パイプライン設定に移動して手動で「返品URL」を入力することで行われますが、リダイレクトする必要のあるページは、内部注文データのURLを作成します。例:

http://www.website.com/Cart/OrderComplete/?orderId={ourInternalOrderIdNumber}&emailAddress={customerEmailAddress}

この問題を回避する方法についてのアイデアがあります。Amazonが支払いを処理し、コールバックハンドラーにヒットしてデータの最終バッチを送信した後、Amazonのデータに基づいてコールバックハンドラーに内部注文を作成します。内部注文が作成されたら、OrderIdとEmailAddressを一時変数としてアプリケーションに保存します。そうすれば、次のように静的URLをパイプライン設定に入れることができます。

http://www.website.com/Cart/OrderCompleteAmazon/

そして、このルートがヒットすると、内部のコードはこれらの一時変数が存在するかどうかを検出し、それらを使用して正しい注文確認URLを作成し、ユーザーをそのURLにリダイレクトします。

public bool ProcessCallbackRequest(HttpContext context)
{
    if (context.Request.Params.Get(Constants.NOTIFICATION_DATA_KEY) != null)
    {
        _logger.Info("Processing Amazon Payments new order notification");

        var xml = context.Request.Params.Get(Constants.NOTIFICATION_DATA_KEY);
        var xSerializer = new XmlSerializer(typeof(NewOrderNotification));
        var orderRequest = (NewOrderNotification)xSerializer.Deserialize(new StringReader(xml)); //A lot of the customer data from Amazon becomes null after deserializing, but that's a separate issue

        /** Internal order gets made here using the orderRequest and inserted into our DB **/

        /** Here I need to somehow store a couple of pieces of data from our internal order as variables that my route that Amazon will attempt to redirect to needs to access later.**/

        context.Response.StatusCode = 200;
        context.Response.Flush();
    }

    return true;
}

理想的には、このメソッドが終了した後、Amazonはユーザーを「http://www.website.com/cart/ordercompleteamazon/」にリダイレクトしようとします。これは私のカートコントローラーでこれを行います。

public ActionResult OrderCompleteAmazon()
{
    var orderId = //The variable created in my callback handler;
    var emailAddress = //The variable created in my callback handler;

    Redirect("/cart/ordercomplete/" + orderId.ToString() + "/?emailAddress=" + emailAddress);
}

問題は、最初のメソッドがコールバックハンドラーで発生することです。これは、ビューのコントローラーの一部ではないため、ViewData、TempData、またはSessionの概念がありません。HttpContextにアクセスできますが、これはAmazonによってコールバックハンドラーメソッドに渡されるパラメーターです。このHttpContextの要求と応答内でCookieを設定しようとしましたが、どちらも自分のアプリケーションでCookieを設定していないようです。

アプリケーションの一部としてデータをグローバルに保存する方法はありますが、現在のセッションのViewData、TempData、Session、またはCookieにアクセスすることなく、そのユーザーのセッションに対してのみ保持されますか?

4

0 に答える 0