Exemplo n.º 1
0
        public override async Task <CreateStripePaymentIntentResponse> CreateStripePaymentIntent(
            CreateStripePaymentIntentRequest request,
            ServerCallContext context
            )
        {
            var httpContext = context.GetHttpContext();

            var paymentIntentService = new PaymentIntentService();

            var options = new PaymentIntentCreateOptions
            {
                PaymentMethod = request.PaymentMethodId,
                Customer      = httpContext.GetStripeCustomerId(),
                ReceiptEmail  = httpContext.GetEmail(),
                Amount        = request.Transaction.Currency.ToCents(),
                Currency      = Options.Invoice.Currency,
                Metadata      = new Dictionary <string, string>
                {
                    ["UserId"]        = httpContext.GetUserId(),
                    ["TransactionId"] = request.Transaction.Id
                }
            };

            var paymentIntent = await paymentIntentService.CreateAsync(options);

            var response = new CreateStripePaymentIntentResponse
            {
                ClientSecret = paymentIntent.ClientSecret
            };

            var message = $"A new payment {paymentIntent.Id} for {paymentIntent.Amount} {paymentIntent.Currency} was created";

            return(context.Ok(response, message));
        }
Exemplo n.º 2
0
        public void Deposit_ShouldThrowRpcExceptionWithInternalStatus()
        {
            // Arrange
            var          userId = new UserId();
            const string email  = "*****@*****.**";

            var host = TestHost.WithClaimsFromBearerAuthentication(new Claim(JwtClaimTypes.Subject, userId.ToString()), new Claim(JwtClaimTypes.Email, email));

            var client = new PaymentService.PaymentServiceClient(host.CreateChannel());

            var request = new CreateStripePaymentIntentRequest
            {
                Transaction = new TransactionDto
                {
                    Currency = new CurrencyDto
                    {
                        Type   = EnumCurrencyType.Money,
                        Amount = 20
                    },
                    Description = "test",
                    Id          = new TransactionId(),
                    Status      = EnumTransactionStatus.Pending,
                    Timestamp   = DateTime.UtcNow.ToTimestamp(),
                    Type        = EnumTransactionType.Deposit
                }
            };

            // Act
            var func = new Func <Task>(async() => await client.CreateStripePaymentIntentAsync(request));

            // Assert
            func.Should().Throw <RpcException>();
        }
Exemplo n.º 3
0
        public async Task <IActionResult> DepositAsync([FromBody] DepositTransactionRequest request)
        {
            var createTransactionRequest = new CreateTransactionRequest
            {
                Bundle = request.BundleId
            };

            var createTransactionResponse = await _cashierServiceClient.CreateTransactionAsync(createTransactionRequest);

            try
            {
                var createStripePaymentIntentRequest = new CreateStripePaymentIntentRequest
                {
                    PaymentMethodId = request.PaymentMethodId,
                    Transaction     = createTransactionResponse.Transaction
                };

                var createStripePaymentIntentResponse = await _paymentServiceClient.CreateStripePaymentIntentAsync(createStripePaymentIntentRequest);

                return(this.Ok(createStripePaymentIntentResponse.ClientSecret));
            }
            catch (RpcException exception)
            {
                var cancelTransactionRequest = new CancelTransactionRequest
                {
                    TransactionId = createTransactionResponse.Transaction.Id
                };

                await _cashierServiceClient.CancelTransactionAsync(cancelTransactionRequest);

                throw exception.Capture();
            }
        }
Exemplo n.º 4
0
        public void Deposit_ShouldThrowRpcExceptionNoDefaultPayment()
        {
            // Arrange
            var          userId = new UserId();
            const string email  = "*****@*****.**";

            var host = TestHost.WithClaimsFromBearerAuthentication(new Claim(JwtClaimTypes.Subject, userId.ToString()), new Claim(JwtClaimTypes.Email, email))
                       .WithWebHostBuilder(
                builder =>
            {
                builder.ConfigureTestContainer <ContainerBuilder>(
                    container =>
                {
                    TestMock.ServiceBusPublisher.Setup(x => x.PublishAsync(It.IsAny <UserDepositSucceededIntegrationEvent>()))
                    .Returns(Task.CompletedTask);

                    container.RegisterInstance(TestMock.ServiceBusPublisher.Object).As <IServiceBusPublisher>();

                    TestMock.StripeCustomerService.Setup(x => x.HasDefaultPaymentMethodAsync(It.IsAny <string>())).ReturnsAsync(false);

                    container.RegisterInstance(TestMock.StripeCustomerService.Object).As <IStripeCustomerService>();
                });
            });

            var client = new PaymentService.PaymentServiceClient(host.CreateChannel());

            var request = new CreateStripePaymentIntentRequest
            {
                Transaction = new TransactionDto
                {
                    Currency = new CurrencyDto
                    {
                        Type   = EnumCurrencyType.Money,
                        Amount = 20
                    },
                    Description = "test",
                    Id          = new TransactionId(),
                    Status      = EnumTransactionStatus.Pending,
                    Timestamp   = DateTime.UtcNow.ToTimestamp(),
                    Type        = EnumTransactionType.Deposit
                }
            };

            // Act
            var func = new Func <Task>(async() => await client.CreateStripePaymentIntentAsync(request));

            // Assert
            func.Should().Throw <RpcException>();
        }