タイトルはおそらく言葉遣いが悪いです、私の経験不足を許してください。
私は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にアクセスすることなく、そのユーザーのセッションに対してのみ保持されますか?