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); } }
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)); }
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 }); } }