Попытка в течение недели безуспешно, чтобы выяснить, почему я не могу получить ответ от моего контроллера.
- Примечание. Я не владею JS, только C#, но у меня уже есть хорошее понимание того, что делает выборка.
- Сейчас изучаю ASP. NET Core, но все еще где-то ниже младшего уровня в моем общем C# и. Net опыте возможно.
- Это касается процесса перенаправления на извлечение Stripe, но выборка и метод, как упомянуто, не могут согласиться около 200.
- Первоначально контроллер был обычным MVC контроллером но из многих попыток я сделал его также контроллером API, надеясь, что что-то, что я, по-видимому, не понимаю, может решить проблему с его методом. Перевернул сеть в поисках похожих проблем, и у меня нет других вариантов, кроме как связаться с вами, ребята, многие опытные разработчики здесь.
- Метод работает на 100%, я имею в виду лог c внутри. Возвращает объект сеанса. Версия API возвращает сессию; версия MVC возвращает
this.Json(session);
Я знаю, что обе версии работают, потому что я отлаживал их, вводя их после нажатия кнопки - Все это происходит на локальном хосте, поэтому я указал
credentials: 'include'
в заголовках. ... если я прав. - Попытка чего-либо с Почтальоном с авторизацией, конечно, но пока безуспешно.
- 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 $ @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 объект. Однако это все еще не доказывает и не позволяет метод получить доступ к выборке ... Снимок экрана добавлен из отладки моего браузера. sessionId = 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));