示例#1
0
        private async Task <IActionResult> CreateInvoiceForPaymentRequest(string id,
                                                                          bool redirectToInvoice,
                                                                          ViewPaymentRequestViewModel result,
                                                                          decimal?amount = null)
        {
            var pr = await _PaymentRequestRepository.FindPaymentRequest(id, null);

            var blob  = pr.GetBlob();
            var store = pr.StoreData;

            store.AdditionalClaims.Add(new Claim(Policies.CanCreateInvoice.Key, store.Id));
            try
            {
                var redirectUrl = Request.GetDisplayUrl().TrimEnd("/pay", StringComparison.InvariantCulture)
                                  .Replace("hub?id=", string.Empty, StringComparison.InvariantCultureIgnoreCase);
                var newInvoiceId = (await _InvoiceController.CreateInvoiceCore(new CreateInvoiceRequest()
                {
                    OrderId = $"{PaymentRequestRepository.GetOrderIdForPaymentRequest(id)}",
                    Currency = blob.Currency,
                    Price = amount.GetValueOrDefault(result.AmountDue),
                    FullNotifications = true,
                    BuyerEmail = result.Email,
                    RedirectURL = redirectUrl,
                }, store, HttpContext.Request.GetAbsoluteRoot(), new List <string>()
                {
                    PaymentRequestRepository.GetInternalTag(id)
                })).Data.Id;

                if (redirectToInvoice)
                {
                    return(RedirectToAction("Checkout", "Invoice", new { Id = newInvoiceId }));
                }

                return(Ok(newInvoiceId));
            }
            catch (BitpayHttpException e)
            {
                return(BadRequest(e.Message));
            }
        }
        public async Task <ViewPaymentRequestViewModel> GetPaymentRequest(string id, string userId = null)
        {
            var pr = await _PaymentRequestRepository.FindPaymentRequest(id, null);

            if (pr == null)
            {
                return(null);
            }

            var blob      = pr.GetBlob();
            var rateRules = pr.StoreData.GetStoreBlob().GetRateRules(_BtcPayNetworkProvider);

            var invoices = await _PaymentRequestRepository.GetInvoicesForPaymentRequest(id);

            var paymentStats    = _AppService.GetCurrentContributionAmountStats(invoices, true);
            var amountCollected =
                await _AppService.GetCurrentContributionAmount(paymentStats, blob.Currency, rateRules);

            var amountDue = blob.Amount - amountCollected;

            return(new ViewPaymentRequestViewModel(pr)
            {
                AmountFormatted = _currencies.FormatCurrency(blob.Amount, blob.Currency),
                AmountCollected = amountCollected,
                AmountCollectedFormatted = _currencies.FormatCurrency(amountCollected, blob.Currency),
                AmountDue = amountDue,
                AmountDueFormatted = _currencies.FormatCurrency(amountDue, blob.Currency),
                CurrencyData = _currencies.GetCurrencyData(blob.Currency, true),
                LastUpdated = DateTime.Now,
                AnyPendingInvoice = invoices.Any(entity => entity.Status == InvoiceStatus.New),
                Invoices = invoices.Select(entity => new ViewPaymentRequestViewModel.PaymentRequestInvoice()
                {
                    Id = entity.Id,
                    Amount = entity.ProductInformation.Price,
                    Currency = entity.ProductInformation.Currency,
                    ExpiryDate = entity.ExpirationTime.DateTime,
                    Status = entity.GetInvoiceState().ToString(),
                    Payments = entity.GetPayments().Select(paymentEntity =>
                    {
                        var paymentNetwork = _BtcPayNetworkProvider.GetNetwork(paymentEntity.GetCryptoCode());
                        var paymentData = paymentEntity.GetCryptoPaymentData();
                        string link = null;
                        string txId = null;
                        switch (paymentData)
                        {
                        case Payments.Bitcoin.BitcoinLikePaymentData onChainPaymentData:
                            txId = onChainPaymentData.Outpoint.Hash.ToString();
                            link = string.Format(CultureInfo.InvariantCulture, paymentNetwork.BlockExplorerLink,
                                                 txId);
                            break;

                        case LightningLikePaymentData lightningLikePaymentData:
                            txId = lightningLikePaymentData.BOLT11;
                            break;
                        }

                        return new ViewPaymentRequestViewModel.PaymentRequestInvoicePayment()
                        {
                            Amount = paymentData.GetValue(),
                            PaymentMethod = paymentEntity.GetPaymentMethodId().ToString(),
                            Link = link,
                            Id = txId
                        };
                    }).ToList()
                }).ToList()
示例#3
0
        public async Task <ViewPaymentRequestViewModel> GetPaymentRequest(string id, string userId = null)
        {
            var pr = await _PaymentRequestRepository.FindPaymentRequest(id, null);

            if (pr == null)
            {
                return(null);
            }

            var blob = pr.GetBlob();

            var invoices = await _PaymentRequestRepository.GetInvoicesForPaymentRequest(id);

            var paymentStats   = _AppService.GetContributionsByPaymentMethodId(blob.Currency, invoices, true);
            var amountDue      = blob.Amount - paymentStats.TotalCurrency;
            var pendingInvoice = invoices.OrderByDescending(entity => entity.InvoiceTime)
                                 .FirstOrDefault(entity => entity.Status == InvoiceStatus.New);

            return(new ViewPaymentRequestViewModel(pr)
            {
                Archived = pr.Archived,
                AmountFormatted = _currencies.FormatCurrency(blob.Amount, blob.Currency),
                AmountCollected = paymentStats.TotalCurrency,
                AmountCollectedFormatted = _currencies.FormatCurrency(paymentStats.TotalCurrency, blob.Currency),
                AmountDue = amountDue,
                AmountDueFormatted = _currencies.FormatCurrency(amountDue, blob.Currency),
                CurrencyData = _currencies.GetCurrencyData(blob.Currency, true),
                LastUpdated = DateTime.Now,
                AnyPendingInvoice = pendingInvoice != null,
                PendingInvoiceHasPayments = pendingInvoice != null &&
                                            pendingInvoice.ExceptionStatus != InvoiceExceptionStatus.None,
                Invoices = invoices.Select(entity => new ViewPaymentRequestViewModel.PaymentRequestInvoice()
                {
                    Id = entity.Id,
                    Amount = entity.Price,
                    AmountFormatted = _currencies.FormatCurrency(entity.Price, blob.Currency),
                    Currency = entity.Currency,
                    ExpiryDate = entity.ExpirationTime.DateTime,
                    Status = entity.GetInvoiceState().ToString(),
                    Payments = entity
                               .GetPayments()
                               .Select(paymentEntity =>
                    {
                        var paymentData = paymentEntity.GetCryptoPaymentData();
                        var paymentMethodId = paymentEntity.GetPaymentMethodId();
                        if (paymentData is null || paymentMethodId is null)
                        {
                            return null;
                        }

                        string txId = paymentData.GetPaymentId();
                        string link = GetTransactionLink(paymentMethodId, txId);
                        return new ViewPaymentRequestViewModel.PaymentRequestInvoicePayment()
                        {
                            Amount = paymentData.GetValue(),
                            PaymentMethod = paymentMethodId.ToString(),
                            Link = link,
                            Id = txId
                        };
                    })
                               .Where(payment => payment != null)
                               .ToList()
                }).ToList()