public static TransactionCreateResponse Create(ShoppingCart cart,
                                                       Options options)
        {
            if (cart == null)
            {
                throw new ArgumentNullException(nameof(cart));
            }
            options = Options.Build(options);
            SendTransactionRequest request =
                OnepayRequestBuilder.Instance.BuildSendTransactionRequest(cart, options);
            string output = JsonConvert.SerializeObject(request);
            string input  = RequestAsync($"{ServiceUri}/{SendTransaction}",
                                         HttpMethod.Post, output).Result;
            SendTransactionResponse response =
                JsonConvert.DeserializeObject <SendTransactionResponse>(input);

            if (response == null)
            {
                throw new TransactionCreateException(-1,
                                                     "Could not obtain the service response");
            }
            else if (!response.ResponseCode.Equals("ok",
                                                   StringComparison.OrdinalIgnoreCase))
            {
                throw new TransactionCreateException(-1,
                                                     $"{response.ResponseCode} : {response.Description}");
            }

            if (!OnepaySignUtil.Instance.Validate(response.Result, options.SharedSecret))
            {
                throw new SignatureException("The response signature is not valid");
            }

            return(response.Result);
        }
 public static TransactionHash ReadSendTransactionResponse(SendTransactionResponse response)
 {
     return(response.Hash == null ? null : new TransactionHash(Convert.FromBase64String(response.Hash)));
 }
        public SendTransactionResponse ProcessTransactionold(SendTransactionRequest request)
        {
            var dataStoreType = "Backup";

            Account account = null;

            if (dataStoreType == "Backup")
            {
                var transactionStore = new BackupTransactionRepository();
                account = transactionStore.GetAccount(request.DebtorAccountNumber);
            }
            else
            {
                var transactionStore = new TransactionRepository();
                account = transactionStore.GetAccount(request.DebtorAccountNumber);
            }

            var result = new SendTransactionResponse();

            if (request.PaymentScheme == PaymentScheme.Bacs)
            {
                if (account == null)
                {
                    result.Success = false;
                }
                else if (account.AllowedPaymentSchemes != AllowedPaymentSchemes.Bacs)
                {
                    result.Success = false;
                }
            }
            else if (request.PaymentScheme == PaymentScheme.FasterPayments)
            {
                if (account == null)
                {
                    result.Success = false;
                }
                else if (account.AllowedPaymentSchemes != AllowedPaymentSchemes.FasterPayments)
                {
                    result.Success = false;
                }
                else if (account.Balance < request.Amount)
                {
                    result.Success = false;
                }
            }
            else if (request.PaymentScheme == PaymentScheme.Chaps)
            {
                if (account == null)
                {
                    result.Success = false;
                }
                else if (account.AllowedPaymentSchemes != AllowedPaymentSchemes.Chaps)
                {
                    result.Success = false;
                }
                else if (account.Status != AccountStatus.Live)
                {
                    result.Success = false;
                }
            }

            if (result.Success)
            {
                account.Balance -= request.Amount;

                if (dataStoreType == "Backup")
                {
                    var transactionStore = new BackupTransactionRepository();
                    transactionStore.UpdateAccount(account);
                }
                else
                {
                    var transactionStore = new TransactionRepository();
                    transactionStore.UpdateAccount(account);
                }
            }

            return(result);
        }
        /// <summary>
        /// Re-write ProcessTransaction() method to make it more testable.
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public SendTransactionResponse ProcessTransaction(SendTransactionV2Request request)
        {
            Account account;

            // This are functional service with process execution
            if (request.DataStoreType == DataStoreDefault.BackupType)
            {
                account = _backupTransactionRepository.GetAccount(request.DebtorAccountNumber);
            }
            else
            {
                account = _trasactionRepository.GetAccount(request.DebtorAccountNumber);
            }


            var result = new SendTransactionResponse();

            if (request.PaymentScheme == PaymentScheme.Bacs)
            {
                if (account == null)
                {
                    result.Success = false;
                }
                else if (account.AllowedPaymentSchemes != AllowedPaymentSchemes.Bacs)
                {
                    result.Success = false;
                }
            }
            else if (request.PaymentScheme == PaymentScheme.FasterPayments)
            {
                if (account == null)
                {
                    result.Success = false;
                }
                else if (account.AllowedPaymentSchemes != AllowedPaymentSchemes.FasterPayments)
                {
                    result.Success = false;
                }
                else if (account.Balance < request.Amount)
                {
                    result.Success = false;
                }
            }
            else if (request.PaymentScheme == PaymentScheme.Chaps)
            {
                if (account == null)
                {
                    result.Success = false;
                }
                else if (account.AllowedPaymentSchemes != AllowedPaymentSchemes.Chaps)
                {
                    result.Success = false;
                }
                else if (account.Status != AccountStatus.Live)
                {
                    result.Success = false;
                }
            }
            else
            {
                result.Success = true;
            }

            if (result.Success)
            {
                account.Balance -= request.Amount;

                if (request.DataStoreType == DataStoreDefault.BackupType)
                {
                    _backupTransactionRepository.UpdateAccount(account);
                }
                else
                {
                    _trasactionRepository.UpdateAccount(account);
                }
            }

            return(result);
        }