public async Task <PayPros> Post(int id, [FromBody] PayPros payment) { //Get item to be paid from id var item = new { id = id, balance = 1.00 }; #region PayPros //Process Payment EFContext _dbContext = new EFContext(); //Be secure, remove full CC from persistent storage record string FullCCNum = payment.CreditCardNumber; payment = PaymentProcessing.EncryptCreditCardNumber(payment); //Save payment attempt to persistent storage _dbContext.PayPros.Add(payment); await _dbContext.SaveChangesAsync(); //Process with paypros PaymentProcessing payProcessing = new PaymentProcessing(PaymentAccounts.Judicial, PaymentMethods.Web); payment = payProcessing.Initiate(payment, FullCCNum); //Save updated payment attempt to persistent storage _dbContext.PayPros.Update(payment); await _dbContext.SaveChangesAsync(); #endregion //Update item if payment is successful if (payment.responseCode == 1) { item.balance = 0.00; } return(payment); }
public static PayPros EncryptCreditCardNumber(PayPros payment) { /** * Strip the full CC number out immediately. * TODO - Encrypt it and store it in CreditCardNumber field? * **/ payment.CCLast4 = payment.CCLast4 ?? payment.CreditCardNumber.Substring(12, 4); payment.CreditCardNumber = null; return(payment); }
public PayPros Initiate(PayPros payment, string cardNumber) { #region CREATE REQUEST CreditCardRequest request = new CreditCardRequest(); try { request.setCreditCardNumber(cardNumber); if (!string.IsNullOrEmpty(payment.CCV)) { request.setCreditCardVerificationNumber(payment.CCV); } request.setExpireMonth(payment.CCExpireMonth); request.setExpireYear(payment.CCExpireYear); request.setChargeType(CreditCardRequest.SALE); request.setPurchaseOrderNumber(payment.PaymentAccount); request.setChargeTotal((double)payment.PaymentAmount); request.setPartialApprovalFlag(false); if (!string.IsNullOrEmpty(payment.RequestingOrigin)) { request.setCustomerIpAddress(payment.RequestingOrigin); } switch (_account) { case PaymentAccounts.UBO: request.setIndustry("DIRECT_MARKETING"); break; case PaymentAccounts.Judicial: break; default: break; } switch (_method) { case PaymentMethods.Web: request.setTransactionConditionCode(5); break; case PaymentMethods.Phone: request.setTransactionConditionCode(2); break; default: break; } } catch (Exception) { throw new ArgumentException("Unable to create request"); } #endregion #region PROCESS REQUEST string payprosToken = (payment.IsTest ? testTokens[_account] : accountTokens[_account]); CreditCardResponse response = (CreditCardResponse)TransactionClient.doTransaction(request, payprosToken); payment.responseCode = (payment.IsTest ? (-1 * response.getResponseCode()) : response.getResponseCode());//flip sign of response code for test payments (keeps it from being written for processing) payment.responseText = response.getResponseCodeText(); payment.retryRecommended = response.getRetryRecommended(); payment.timestamp = response.getTimeStamp(); #endregion #region RECORD RESPONSE double authorizedAmount = 0; if (double.TryParse(response.getAuthorizedAmount(), out authorizedAmount)) { payment.PaymentAmount = (decimal)authorizedAmount; } long orderID; if (long.TryParse(response.getOrderId(), out orderID)) { payment.orderID = orderID; } long batchID; if (long.TryParse(response.getBatchId(), out batchID)) { payment.batchID = batchID; } long bankApprovalCode; if (long.TryParse(response.getBankApprovalCode(), out bankApprovalCode)) { payment.bankApprovalCode = bankApprovalCode; } long bankTransactionId; if (long.TryParse(response.getBankTransactionId(), out bankTransactionId)) { payment.bankTransactionId = bankTransactionId; } int creditCardVerification; if (int.TryParse(response.getCreditCardVerificationResponse(), out creditCardVerification)) { payment.creditCardVerificationResponse = creditCardVerification; } #endregion return(payment); }