Почему запрос Fetch Post с параметром JSON в теле к ASP. NET Core 3.1 WEB API или MVC Controller ничего не получает? - PullRequest
0 голосов
/ 07 апреля 2020

Попытка в течение недели безуспешно, чтобы выяснить, почему я не могу получить ответ от моего контроллера.

  1. Примечание. Я не владею JS, только C#, но у меня уже есть хорошее понимание того, что делает выборка.
  2. Сейчас изучаю ASP. NET Core, но все еще где-то ниже младшего уровня в моем общем C# и. Net опыте возможно.
  3. Это касается процесса перенаправления на извлечение Stripe, но выборка и метод, как упомянуто, не могут согласиться около 200.
  4. Первоначально контроллер был обычным MVC контроллером но из многих попыток я сделал его также контроллером API, надеясь, что что-то, что я, по-видимому, не понимаю, может решить проблему с его методом. Перевернул сеть в поисках похожих проблем, и у меня нет других вариантов, кроме как связаться с вами, ребята, многие опытные разработчики здесь.
  5. Метод работает на 100%, я имею в виду лог c внутри. Возвращает объект сеанса. Версия API возвращает сессию; версия MVC возвращает this.Json(session); Я знаю, что обе версии работают, потому что я отлаживал их, вводя их после нажатия кнопки
  6. Все это происходит на локальном хосте, поэтому я указал credentials: 'include' в заголовках. ... если я прав.
  7. Попытка чего-либо с Почтальоном с авторизацией, конечно, но пока безуспешно.
  8. Firefox Отладка в настоящее время не выдает ошибок при прохождении выборки.

Вопросы: - Правильно ли работает выборка в соответствии с моим кодом? - Готов ли контроллер получить идентификатор платежа из тела запроса JSON? - Когда я жестко кодирую paymentId внутри контроллера, чтобы не ожидать никаких параметров, почему это не работает так же (выборка имеет неопределенный сеанс)?

Вот выборка в моем Pay.cs html view

<script src="https://js.stripe.com/v3/"></script>
    <div id="checkout">
        <form id="payment-form">
            <div class="row d-flex justify-content-center">
                <div class="col-6 py-4 text-center">
                    <button id="checkout-button"
                        value="Pay"
                        class="btn btn-sm btn-labeled btn-primary">
                        <span class="btn-label">
                            <ion-icon name="card-outline"></ion-icon>
                        </span>Pay &nbsp; $ @Model.Amount
                                </button>
                </div>
            </div>
        </form>
    </div>
    <script>
        var stripe = Stripe('@HomyTestPublishableKey');

        var payButton = document.getElementById('checkout-button');

                payButton.addEventListener('click', function(event) {
            event.preventDefault();
                  stripe.redirectToCheckout({
            sessionId: sessionId
      });
    });

    var sessionId;
    var paymentId = '@Model.Id';

                fetch("/api/payment/createsession/", {
            method: 'POST',
                  headers: {
            'Content-Type': 'application/json'
        },
        credentials: 'include',
                  body: JSON.stringify({id: paymentId })
                }).then(function(r) {
                  return r.json();
                }).then(function(response) {
            sessionId = response.id;
      })
          .catch(error => console.error('Error:', error));
</script>

Метод в API-контроллере выглядит следующим образом:

// Create PaymentSession
[HttpPost]
[Route("createsession")]
public async Task<Session> CreateSession([FromBody]string id)
{
    var userId = this.userManager.GetUserId(this.User);
    var payment = await this.paymentService.GetPaymentDetailsAsync(id, userId);

    var successStringUrl = "https://localhost:44319/Checkout/success?session_id={CHECKOUT_SESSION_ID}";
    var cancelStringUrl = "https://localhost:44319/Checkout/cancel";

    var options = new SessionCreateOptions
    {
        PaymentMethodTypes = new List<string>
                {
                    "card",
                },

        LineItems = new List<SessionLineItemOptions>
                {
                    new SessionLineItemOptions
                    {
                        Quantity = 1,
                        Amount = (long)payment.Amount * 100,
                        Currency = CurrencyUSD,

                        Description = $"Payment Id: {payment.Id} for rental at {payment.RentalAddress}",

                        Name = $"Rent Payment for {DateTime.UtcNow.Month} | {DateTime.UtcNow.Year} for rental at {payment.RentalAddress}",
                    },
                },

        PaymentIntentData = new SessionPaymentIntentDataOptions
        {
            ApplicationFeeAmount = (long)((payment.Amount * 0.01m) * 100),
            CaptureMethod = "manual",

            TransferData = new SessionPaymentIntentTransferDataOptions
            {
                Destination = payment.ToStripeAccountId,
            },
        },

        SuccessUrl = successStringUrl,
        CancelUrl = cancelStringUrl,
    };

    var service = new SessionService();
    Session session = service.Create(options);

    return session;  // the MVC version returns Task<IActionResult> of this.Json(session);
}

Метод параметров Stripe не важен, его единственный импорт, почему выборка не может получить что-нибудь и что я делаю в корне неправильно. Вот инженер Stripe CJ Avilla, демонстрирующий это с PHP и JS, но вы можете получить представление. После минутной отметки 20:30 вы хотите увидеть, как он создает выборку, а затем, как начинает действовать процесс оформления заказа. https://www.youtube.com/watch?v=VQ5jccnZ2Ow&t=1160s

Буду благодарен за любые предложения. Бросьте их мне.

Любой, у кого есть серьезный опыт и мало времени, чтобы покопаться, я могу предоставить доступ к частному репозиторию github (это мой первый веб-проект, и я должен защищать его в конце ASP. NET Основной курс в SoftUni).

Спасибо!

PS Edit 1: Добавлена ​​модель привязки для параметра Id, так как я ошибочно ожидал строку, но проходил json объект. Однако это все еще не доказывает и не позволяет метод получить доступ к выборке ... Снимок экрана добавлен из отладки моего браузера. imagesessionId = response.id; ">

Редактировать 2: Этот код возвращает статус 400 в консоли

fetch("https://localhost:44319/api/payment/createsession", {
            method: 'POST',
            mode: 'same-origin',
            headers: {
            'Content-Type': 'application/json'
            },
            credentials: 'include',
            body: JSON.stringify({ id: paymentId })
            })
            .then(r =>  r.json().then(data => ({status: r.status, body: data})))
            .then(obj => console.log(obj));

1 Ответ

1 голос
/ 08 апреля 2020

почему выборка не может ничего получить. и что я делаю в корне неправильно

Ваше действие CreateSession принимает параметр типа строки id, на вашей JavaScript стороне клиента вы можете передавать данные через тело запроса, как показано ниже.

body: JSON.stringify(paymentId)

Кроме того, если вы хотите, чтобы ваше действие могло обрабатывать body: JSON.stringify({id: paymentId }) хорошо от клиента, вы также можете изменить свое действие для принятия пользовательского параметра модели, как показано ниже.

[HttpPost]
[Route("createsession")]
public async Task<Session> CreateSession([FromBody]MyTestModel myTestModel)
{
    var id = myTestModel.id;

    //your code logic here
    //...

MyTestModel class

public class MyTestModel
{
    public string id { get; set; }
}
...