支払いゲートウェイからのリクエストを処理するために使用されるコントローラーにアクションがあります。リクエストの本文でjsonを、このアクションを実行するサーバー上のURLに送信します。このコードは、データを送信するときに正常に機能しています。
[ValidateInput(false)]
public ActionResult WebHookHandler()
{
var json = new StreamReader(Request.InputStream).ReadToEnd();
if (string.IsNullOrEmpty(json))
return new HttpStatusCodeResult(400); // bad request
...
// return ok status
return new HttpStatusCodeResult(200); // ok
}
問題は、テストデータを送信してこのアクションを自分の側でテストしたいのですが、機能させることができないことです。私が試したすべての結果は400応答になります。これは、送信したjsonがサーバー側で抽出されなかったことを意味します。MVC 3は賢くなりすぎて、jsonを処理していると思います。これは、 Request.InputStreamプロパティから取得できないように送信しているためです。これは、このプロパティがajax構成で常に空であるためです。試しました。
データを文字列化する、processDataをfalseに設定する、さまざまなcontentTypeを設定するなど、あらゆる種類の組み合わせを試しましたが、サーバー側のコードがRequest.InputStreamからデータを取得できるような方法でデータを通過させることはできません。
これが私のjavascriptがどのように見えるかです:
var data = $("#stripeJSON").val();
$.ajax({
url: "http://localhost/PaymentStripe/WebHookHandler",
type: "POST",
data: data,
processData: true,
contentType: "application/json",
success: function (data, textStatus, jqXHR) {
$("#result").html("success");
},
error: function (jqXHR, textStatus, errorThrown) {
$("#result").html("failed:<br/>" + textStatus + errorThrown);
},
complete: function (jqXHR, textStatus) {
}
});
そしてここにいくつかのダミーのjsonデータがあります:
{
"pending_webhooks": 1,
"type": "invoice.payment_succeeded",
"object": "event",
"created": 1347318097,
"livemode": false,
"id": "evt_0LMvt7Q9vL1oFI",
"data": {
"object": {
"currency": "usd",
"ending_balance": null,
"customer": "cus_0LMvSw8LEmOcJG",
"discount": null,
"id": "in_0LMvHGx1XutT7p",
"object": "invoice",
"amount_due": 0,
"date": 1347318097,
"total": 0,
"subtotal": 0,
"charge": null,
"period_end": 1347318097,
"next_payment_attempt": null,
"livemode": false,
"attempted": true,
"period_start": 1347318097,
"starting_balance": 0,
"lines": {
"subscriptions": [{
"quantity": 1,
"period": {
"end": 1349910097,
"start": 1347318097
},
"amount": 0,
"plan": {
"livemode": false,
"trial_period_days": null,
"amount": 0,
"object": "plan",
"name": "ZeroMonthly",
"id": "ZeroMonthly",
"interval_count": 1,
"currency": "usd",
"interval": "month"
}
}],
"prorations": [],
"invoiceitems": []
},
"paid": true,
"closed": true,
"attempt_count": 0
}
}
}
提案?