У меня есть приложение электронной коммерции ASP .NET Core MVC, в котором я пытаюсь осуществлять платежи с помощью Stripe. Я реализовал решение, описанное в этом руководстве , но по какой-то причине я получаю ошибку Stripe.StripeException: 'Cannot charge a customer that has no active card'
в методе оплаты, который вызывается, когда пользователь инициирует платеж.
Проблема, по-видимому, вызвана тем фактом, что электронное письмо с полосой и маркер полосы, которые являются двумя параметрами, которые фактически передаются в метод начисления, получают нулевые аргументы. Я не уверен, почему эти переменные получают нулевые значения при вызове функции, так как я выполнил все шаги, описанные в руководстве по полосе.
Я использовал как тестовые, так и живые секретные и публикуемые ключи с панели инструментов полосы и правильно включил их в файл jset appsettings. Код из соответствующих файлов приведен ниже. Что может быть причиной этой ошибки здесь?
действие регулятора заряда полосы
public IActionResult Charge(string stripeEmail, string stripeToken)
{
var customerService = new StripeCustomerService();
var chargeService = new StripeChargeService();
var customer = customerService.Create(new StripeCustomerCreateOptions
{
Email = stripeEmail,
SourceToken = stripeToken
});
var charge = chargeService.Create(new StripeChargeCreateOptions
{
Amount = 500,
Description = "ASP .NET Core Stripe Tutorial",
Currency = "usd",
CustomerId = customer.Id
});
return View();
}
appsettings.json
"Stripe": {
"SecretKey": "sk_test...",
"PublishableKey": "pk_test..."
}
страница просмотра стоимости
@using Microsoft.Extensions.Options
@inject IOptions<StripeSettings> Stripe
@{
ViewData["Title"] = "MakePayment";
}
<form action="/Order/Charge" method="post">
<article>
<label>Amount: $5.00</label>
</article>
<script src="//checkout.stripe.com/v2/checkout.js"
class="stripe-button"
data-key="@Stripe.Value.PublishableKey"
data-locale="auto"
data-description="Sample Charge"
data-amount="500">
</script>
</form>
<h2>MakePayment</h2>
Класс настроек полосы
public class StripeSettings
{
public string SecretKey { get; set; }
public string PublishableKey { get; set; }
}
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("Cn")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
// Add application services.
services.AddTransient<IEmailSender, EmailSender>();
services.AddDbContext<wywytrav_DBContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Cn")));
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddScoped(sp => ShoppingCart.GetCart(sp));
services.AddScoped<SignInManager<ApplicationUser>, SignInManager<ApplicationUser>>();
services.AddTransient<IOrderRepository, OrderRepository>();
services.AddMvc();
services.AddMemoryCache();
services.AddSession();
services.Configure<StripeSettings>(Configuration.GetSection("Stripe"));//stripe configuration
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseSession();
app.UseAuthentication();
StripeConfiguration.SetApiKey(Configuration.GetSection("Stripe")["SecretKey"]);
}