internal static AuthorizeRequest ConvertFrom(Request request) { var authorizeRequest = new AuthorizeRequest(); var errors = new List <PaymentError>(); authorizeRequest.ReadBaseProperties(request, errors); // Read card data Hashtable hashtable = PaymentProperty.ConvertToHashtable(request.Properties); authorizeRequest.CardType = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.CardType, errors, ErrorCode.InvalidRequest); if (authorizeRequest.CardType != null && !PaymentUtilities.ValidateCardType(authorizeRequest.SupportedTenderTypes, authorizeRequest.CardType)) { errors.Add(new PaymentError(ErrorCode.CardTypeNotSupported, string.Format("Card type is not supported: {0}.", authorizeRequest.CardType))); } authorizeRequest.IsSwipe = PaymentUtilities.GetPropertyBooleanValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.IsSwipe); if (authorizeRequest.IsSwipe ?? false) { authorizeRequest.Track1 = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.Track1); authorizeRequest.Track2 = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.Track2); authorizeRequest.CardNumber = PaymentUtilities.ParseTrack1ForCardNumber(authorizeRequest.Track1); if (authorizeRequest.CardNumber == null) { authorizeRequest.CardNumber = PaymentUtilities.ParseTrack2ForCardNumber(authorizeRequest.Track2); } if (authorizeRequest.CardNumber == null) { errors.Add(new PaymentError(ErrorCode.InvalidCardTrackData, "Invalid card track data.")); } decimal expirationYear, expirationMonth; HelperUtilities.ParseTrackDataForExpirationDate(authorizeRequest.Track1 ?? string.Empty, authorizeRequest.Track2 ?? string.Empty, out expirationYear, out expirationMonth); authorizeRequest.ExpirationYear = expirationYear; authorizeRequest.ExpirationMonth = expirationMonth; } else { authorizeRequest.CardToken = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.CardToken); if (authorizeRequest.CardToken == null) { authorizeRequest.CardNumber = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.CardNumber, errors, ErrorCode.InvalidCardNumber); } else { authorizeRequest.Last4Digit = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.Last4Digits); } authorizeRequest.ExpirationYear = PaymentUtilities.GetPropertyDecimalValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.ExpirationYear, errors, ErrorCode.InvalidExpirationDate); authorizeRequest.ExpirationMonth = PaymentUtilities.GetPropertyDecimalValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.ExpirationMonth, errors, ErrorCode.InvalidExpirationDate); } if (authorizeRequest.CardNumber != null && !HelperUtilities.ValidateBankCardNumber(authorizeRequest.CardNumber)) { errors.Add(new PaymentError(ErrorCode.InvalidCardNumber, "Invalid card number.")); } if (authorizeRequest.ExpirationYear.HasValue && authorizeRequest.ExpirationMonth.HasValue && authorizeRequest.ExpirationYear >= 0M && authorizeRequest.ExpirationMonth >= 0M && !PaymentUtilities.ValidateExpirationDate(authorizeRequest.ExpirationYear.Value, authorizeRequest.ExpirationMonth.Value)) { errors.Add(new PaymentError(ErrorCode.InvalidExpirationDate, "Invalid expiration date.")); } if (Microsoft.Dynamics.Retail.PaymentSDK.Portable.CardType.Debit.ToString().Equals(authorizeRequest.CardType, StringComparison.OrdinalIgnoreCase)) { authorizeRequest.EncryptedPin = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.EncryptedPin, errors, ErrorCode.CannotVerifyPin); authorizeRequest.AdditionalSecurityData = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.AdditionalSecurityData); } authorizeRequest.CashBackAmount = PaymentUtilities.GetPropertyDecimalValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.CashBackAmount); if (authorizeRequest.CashBackAmount.HasValue && authorizeRequest.CashBackAmount > 0M && !Microsoft.Dynamics.Retail.PaymentSDK.Portable.CardType.Debit.ToString().Equals(authorizeRequest.CardType, StringComparison.OrdinalIgnoreCase)) { errors.Add(new PaymentError(ErrorCode.CashBackNotAvailable, "Cashback is not available.")); } authorizeRequest.CardVerificationValue = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.CardVerificationValue); authorizeRequest.VoiceAuthorizationCode = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.VoiceAuthorizationCode); authorizeRequest.Name = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.Name); authorizeRequest.StreetAddress = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.StreetAddress); authorizeRequest.StreetAddress2 = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.StreetAddress2); authorizeRequest.City = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.City); authorizeRequest.State = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.State); authorizeRequest.PostalCode = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.PostalCode); authorizeRequest.Country = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.Country); authorizeRequest.Phone = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.Phone); authorizeRequest.AccountType = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.AccountType); authorizeRequest.UniqueCardId = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.PaymentCard, PaymentCardProperties.UniqueCardId); // Read transaction data authorizeRequest.Amount = PaymentUtilities.GetPropertyDecimalValue( hashtable, GenericNamespace.TransactionData, TransactionDataProperties.Amount, errors, ErrorCode.InvalidAmount); authorizeRequest.CurrencyCode = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.TransactionData, TransactionDataProperties.CurrencyCode, errors, ErrorCode.InvalidRequest); if (authorizeRequest.CurrencyCode != null && !PaymentUtilities.ValidateCurrencyCode(authorizeRequest.SupportedCurrencies, authorizeRequest.CurrencyCode)) { errors.Add(new PaymentError(ErrorCode.UnsupportedCurrency, string.Format("Currency code is not supported: {0}.", authorizeRequest.CurrencyCode))); } authorizeRequest.SupportCardTokenization = PaymentUtilities.GetPropertyBooleanValue( hashtable, GenericNamespace.TransactionData, TransactionDataProperties.SupportCardTokenization); authorizeRequest.AllowPartialAuthorization = PaymentUtilities.GetPropertyBooleanValue( hashtable, GenericNamespace.TransactionData, TransactionDataProperties.AllowPartialAuthorization); authorizeRequest.AuthorizationProviderTransactionId = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.TransactionData, TransactionDataProperties.AuthorizationProviderTransactionId); authorizeRequest.PurchaseLevel = PaymentUtilities.GetPropertyStringValue( hashtable, GenericNamespace.TransactionData, TransactionDataProperties.PurchaseLevel); if (errors.Count > 0) { throw new SampleException(errors); } return(authorizeRequest); }