0

支払いゲートウェイからのリクエストを処理するために使用されるコントローラーにアクションがあります。リクエストの本文で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
        }
    }
}

提案?

4

2 に答える 2

0

問題はURLの送信だと思います...こちらをご覧ください。私も同じ問題を抱えていました。

于 2012-09-11T12:57:13.520 に答える
0

コメントで述べたように、これはこの行を変更することで修正されました:

これから:

var data = $("#stripeJSON").val();

これに:

var data = JSON.parse(JSON.stringify($("#stripeJSON").val()));

「stripeJSON」フィールドはフォーム上のテキストエリアであり、jqueryは実際のjsonオブジェクトではなく文字列リテラルとして送信していました。

于 2012-09-16T02:42:13.877 に答える