Ejemplo n.º 1
0
        private async Task ReceivedPayment(InvoiceEntity invoice, PaymentEntity payment)
        {
            _logger.LogInformation(
                $"Invoice {invoice.Id} received payment {payment.GetCryptoPaymentData().GetValue()} {payment.GetCryptoCode()} {payment.GetCryptoPaymentData().GetPaymentId()}");
            var paymentData   = (ZcashLikePaymentData)payment.GetCryptoPaymentData();
            var paymentMethod = invoice.GetPaymentMethod(payment.Network, ZcashPaymentType.Instance);

            if (paymentMethod != null &&
                paymentMethod.GetPaymentMethodDetails() is ZcashLikeOnChainPaymentMethodDetails Zcash &&
                Zcash.Activated &&
                Zcash.GetPaymentDestination() == paymentData.GetDestination() &&
                paymentMethod.Calculate().Due > Money.Zero)
            {
                var walletClient = _ZcashRpcProvider.WalletRpcClients[payment.GetCryptoCode()];

                var address = await walletClient.SendCommandAsync <CreateAddressRequest, CreateAddressResponse>(
                    "create_address",
                    new CreateAddressRequest()
                {
                    Label        = $"btcpay invoice #{invoice.Id}",
                    AccountIndex = Zcash.AccountIndex
                });

                Zcash.DepositAddress = address.Address;
                Zcash.AddressIndex   = address.AddressIndex;
                await _invoiceRepository.NewPaymentDetails(invoice.Id, Zcash, payment.Network);

                _eventAggregator.Publish(
                    new InvoiceNewPaymentDetailsEvent(invoice.Id, Zcash, payment.GetPaymentMethodId()));
                paymentMethod.SetPaymentMethodDetails(Zcash);
                invoice.SetPaymentMethod(paymentMethod);
            }

            _eventAggregator.Publish(
                new InvoiceEvent(invoice, InvoiceEvent.ReceivedPayment)
            {
                Payment = payment
            });
        }
        public static InvoicePaymentMethodDataModel.Payment ToPaymentModel(InvoiceEntity entity, PaymentEntity paymentEntity)
        {
            var data = paymentEntity.GetCryptoPaymentData();

            return(new InvoicePaymentMethodDataModel.Payment()
            {
                Destination = data.GetDestination(),
                Id = data.GetPaymentId(),
                Status = !paymentEntity.Accounted
                    ? InvoicePaymentMethodDataModel.Payment.PaymentStatus.Invalid
                    : data.PaymentConfirmed(paymentEntity, entity.SpeedPolicy) || data.PaymentCompleted(paymentEntity)
                        ? InvoicePaymentMethodDataModel.Payment.PaymentStatus.Settled
                        : InvoicePaymentMethodDataModel.Payment.PaymentStatus.Processing,
                Fee = paymentEntity.NetworkFee,
                Value = data.GetValue(),
                ReceivedDate = paymentEntity.ReceivedTime.DateTime
            });
        }