示例#1
0
        public async Task <Payment> AuthorizePayment(
            OrderCloudIntegrationsCreditCardPayment payment,
            string userToken,
            string merchantID
            )
        {
            Require.That((payment.CreditCardID != null) || (payment.CreditCardDetails != null),
                         new ErrorCode("CreditCard.CreditCardAuth", 400, "Request must include either CreditCardDetails or CreditCardID"));

            var cc = await GetMeCardDetails(payment, userToken);

            Require.That(payment.IsValidCvv(cc), new ErrorCode("CreditCardAuth.InvalidCvv", 400, "CVV is required for Credit Card Payment"));
            Require.That(cc.Token != null, new ErrorCode("CreditCardAuth.InvalidToken", 400, "Credit card must have valid authorization token"));
            Require.That(cc.xp.CCBillingAddress != null, new ErrorCode("Invalid Bill Address", 400, "Credit card must have a billing address"));

            var orderWorksheet = await _oc.IntegrationEvents.GetWorksheetAsync <HSOrderWorksheet>(OrderDirection.Incoming, payment.OrderID);

            var order = orderWorksheet.Order;

            Require.That(!order.IsSubmitted, new ErrorCode("CreditCardAuth.AlreadySubmitted", 400, "Order has already been submitted"));

            var ccAmount = orderWorksheet.Order.Total;

            var ocPaymentsList = (await _oc.Payments.ListAsync <HSPayment>(OrderDirection.Incoming, payment.OrderID, filters: "Type=CreditCard"));
            var ocPayments     = ocPaymentsList.Items;
            var ocPayment      = ocPayments.Any() ? ocPayments[0] : null;

            if (ocPayment == null)
            {
                throw new CatalystBaseException("Payment.MissingCreditCardPayment", 400, "Order is missing credit card payment");
            }
            try
            {
                if (ocPayment?.Accepted == true)
                {
                    if (ocPayment.Amount == ccAmount)
                    {
                        return(ocPayment);
                    }
                    else
                    {
                        await VoidTransactionAsync(ocPayment, order, userToken);
                    }
                }
                var call = await _cardConnect.AuthWithoutCapture(CardConnectMapper.Map(cc, order, payment, merchantID, ccAmount));

                ocPayment = await _oc.Payments.PatchAsync <HSPayment>(OrderDirection.Incoming, order.ID, ocPayment.ID, new PartialPayment { Accepted = true, Amount = ccAmount });

                return(await _oc.Payments.CreateTransactionAsync(OrderDirection.Incoming, order.ID, ocPayment.ID, CardConnectMapper.Map(ocPayment, call)));
            }
            catch (CreditCardAuthorizationException ex)
            {
                ocPayment = await _oc.Payments.PatchAsync <HSPayment>(OrderDirection.Incoming, order.ID, ocPayment.ID, new PartialPayment { Accepted = false, Amount = ccAmount });

                await _oc.Payments.CreateTransactionAsync(OrderDirection.Incoming, order.ID, ocPayment.ID, CardConnectMapper.Map(ocPayment, ex.Response));

                throw new CatalystBaseException($"CreditCardAuth.{ex.ApiError.ErrorCode}", 400, ex.ApiError.Message, ex.Response);
            }
        }
示例#2
0
        private async Task <CreditCard> Tokenize(OrderCloudIntegrationsCreditCardToken card, string userToken)
        {
            var userCurrency = await _hsExchangeRates.GetCurrencyForUser(userToken);

            var auth = await _cardConnect.Tokenize(CardConnectMapper.Map(card, userCurrency.ToString()));

            return(CreditCardMapper.Map(card, auth));
        }
示例#3
0
        public async Task VoidTransactionAsync(HSPayment payment, HSOrder order, string userToken)
        {
            var transactionID = "";

            try
            {
                if (payment.Accepted == true)
                {
                    var transaction = payment.Transactions
                                      .Where(x => x.Type == "CreditCard")
                                      .OrderBy(x => x.DateExecuted)
                                      .LastOrDefault(t => t.Succeeded);
                    var retref = transaction?.xp?.CardConnectResponse?.retref;
                    if (retref != null)
                    {
                        transactionID = transaction.ID;
                        var userCurrency = await _hsExchangeRates.GetCurrencyForUser(userToken);

                        var response = await _cardConnect.VoidAuthorization(new CardConnectVoidRequest
                        {
                            currency = userCurrency.ToString(),
                            merchid  = GetMerchantID(userCurrency),
                            retref   = transaction.xp.CardConnectResponse.retref
                        });
                        await WithRetry().ExecuteAsync(() => _oc.Payments.CreateTransactionAsync(OrderDirection.Incoming, order.ID, payment.ID, CardConnectMapper.Map(payment, response)));
                    }
                }
            }
            catch (CreditCardVoidException ex)
            {
                await _supportAlerts.VoidAuthorizationFailed(payment, transactionID, order, ex);
                await WithRetry().ExecuteAsync(() => _oc.Payments.CreateTransactionAsync(OrderDirection.Incoming, order.ID, payment.ID, CardConnectMapper.Map(payment, ex.Response)));

                throw new OrderCloudIntegrationException(new ApiError
                {
                    ErrorCode = "Payment.FailedToVoidAuthorization",
                    Message   = ex.ApiError.Message
                });
            }
        }