Fix: Form in Payment Requests was not setting its values to the invoices metadata (#4907)

This commit is contained in:
Nicolas Dorier
2023-04-24 18:04:46 +09:00
committed by GitHub
parent c3c8cc21ff
commit 39b76c08de
4 changed files with 24 additions and 18 deletions

View File

@@ -116,8 +116,11 @@ namespace BTCPayServer.Tests
s.Driver.FindElement(By.Name("buyerEmail")).SendKeys("aa@aa.com"); s.Driver.FindElement(By.Name("buyerEmail")).SendKeys("aa@aa.com");
s.Driver.FindElement(By.CssSelector("input[type='submit']")).Click(); s.Driver.FindElement(By.CssSelector("input[type='submit']")).Click();
invoiceId = s.Driver.Url.Split('/').Last();
s.Driver.Navigate().GoToUrl(editUrl); s.Driver.Navigate().GoToUrl(editUrl);
Assert.Contains("aa@aa.com", s.Driver.PageSource); Assert.Contains("aa@aa.com", s.Driver.PageSource);
var invoice = await s.Server.PayTester.GetService<InvoiceRepository>().GetInvoice(invoiceId);
Assert.Equal("aa@aa.com", invoice.Metadata.BuyerEmail);
//Custom Forms //Custom Forms
s.GoToStore(StoreNavPages.Forms); s.GoToStore(StoreNavPages.Forms);

View File

@@ -124,7 +124,8 @@ namespace BTCPayServer.Controllers.Greenfield
try try
{ {
var invoice = await _invoiceController.CreatePaymentRequestInvoice(pr, amount, this.StoreData, Request, cancellationToken); var prData = await _paymentRequestRepository.FindPaymentRequest(pr.Id, null);
var invoice = await _invoiceController.CreatePaymentRequestInvoice(prData, amount, pr.AmountDue, this.StoreData, Request, cancellationToken);
return Ok(GreenfieldInvoiceController.ToModel(invoice, _linkGenerator, Request)); return Ok(GreenfieldInvoiceController.ToModel(invoice, _linkGenerator, Request));
} }
catch (BitpayHttpException e) catch (BitpayHttpException e)

View File

@@ -187,33 +187,35 @@ namespace BTCPayServer.Controllers
return await CreateInvoiceCoreRaw(entity, store, excludeFilter, null, cancellationToken, entityManipulator); return await CreateInvoiceCoreRaw(entity, store, excludeFilter, null, cancellationToken, entityManipulator);
} }
internal async Task<InvoiceEntity> CreatePaymentRequestInvoice(ViewPaymentRequestViewModel pr, decimal? amount, StoreData storeData, HttpRequest request, CancellationToken cancellationToken) internal async Task<InvoiceEntity> CreatePaymentRequestInvoice(Data.PaymentRequestData prData, decimal? amount, decimal amountDue, StoreData storeData, HttpRequest request, CancellationToken cancellationToken)
{ {
if (pr.AllowCustomPaymentAmounts && amount != null) var id = prData.Id;
amount = Math.Min(pr.AmountDue, amount.Value); var prBlob = prData.GetBlob();
if (prBlob.AllowCustomPaymentAmounts && amount != null)
amount = Math.Min(amountDue, amount.Value);
else else
amount = pr.AmountDue; amount = amountDue;
var redirectUrl = _linkGenerator.PaymentRequestLink(pr.Id, request.Scheme, request.Host, request.PathBase); var redirectUrl = _linkGenerator.PaymentRequestLink(id, request.Scheme, request.Host, request.PathBase);
var invoiceMetadata = JObject invoiceMetadata = prData.GetBlob()?.FormResponse is JObject formResponse ? formResponse : new JObject();
new InvoiceMetadata invoiceMetadata.Merge(new InvoiceMetadata
{ {
OrderId = PaymentRequestRepository.GetOrderIdForPaymentRequest(pr.Id), OrderId = PaymentRequestRepository.GetOrderIdForPaymentRequest(id),
PaymentRequestId = pr.Id, PaymentRequestId = id,
BuyerEmail = pr.Email BuyerEmail = string.IsNullOrEmpty(prBlob.Email) ? null : prBlob.Email
}; }.ToJObject(), new JsonMergeSettings() { MergeNullValueHandling = MergeNullValueHandling.Ignore });
var invoiceRequest = var invoiceRequest =
new CreateInvoiceRequest new CreateInvoiceRequest
{ {
Metadata = invoiceMetadata.ToJObject(), Metadata = invoiceMetadata,
Currency = pr.Currency, Currency = prBlob.Currency,
Amount = amount, Amount = amount,
Checkout = { RedirectURL = redirectUrl }, Checkout = { RedirectURL = redirectUrl },
Receipt = new InvoiceDataBase.ReceiptOptions { Enabled = false } Receipt = new InvoiceDataBase.ReceiptOptions { Enabled = false }
}; };
var additionalTags = new List<string> { PaymentRequestRepository.GetInternalTag(pr.Id) }; var additionalTags = new List<string> { PaymentRequestRepository.GetInternalTag(id) };
return await CreateInvoiceCoreRaw(invoiceRequest, storeData, request.GetAbsoluteRoot(), additionalTags, cancellationToken); return await CreateInvoiceCoreRaw(invoiceRequest, storeData, request.GetAbsoluteRoot(), additionalTags, cancellationToken);
} }

View File

@@ -277,7 +277,6 @@ namespace BTCPayServer.Controllers
return BadRequest("Payment Request cannot be paid as it has been archived"); return BadRequest("Payment Request cannot be paid as it has been archived");
} }
if (!result.FormSubmitted && !string.IsNullOrEmpty(result.FormId)) if (!result.FormSubmitted && !string.IsNullOrEmpty(result.FormId))
{ {
var formData = await FormDataService.GetForm(result.FormId); var formData = await FormDataService.GetForm(result.FormId);
@@ -322,7 +321,8 @@ namespace BTCPayServer.Controllers
try try
{ {
var store = await _storeRepository.FindStore(result.StoreId); var store = await _storeRepository.FindStore(result.StoreId);
var newInvoice = await _InvoiceController.CreatePaymentRequestInvoice(result, amount, store, Request, cancellationToken); var prData = await _PaymentRequestRepository.FindPaymentRequest(result.Id, null);
var newInvoice = await _InvoiceController.CreatePaymentRequestInvoice(prData, amount, result.AmountDue, store, Request, cancellationToken);
if (redirectToInvoice) if (redirectToInvoice)
{ {
return RedirectToAction("Checkout", "UIInvoice", new { invoiceId = newInvoice.Id }); return RedirectToAction("Checkout", "UIInvoice", new { invoiceId = newInvoice.Id });