/// <summary> /// Vérification du numéro de carte bancaire /// </summary> /// <param name="user">Compte utilisateur</param> /// <param name="cardHolder">Numéro de carte</param> /// <param name="expirationDate">Date d'expiration</param> /// <param name="onlineCheck">Tester la carte via RBS</param> /// <param name="cardHolder">Détenteur de la carte</param> /// <param name="pos">Marché</param> /// <param name="timeout">timeout</param> /// <param name="service">service</param> /// <param name="customercode">code client</param> /// <param name="travellercode">code voyageur</param> /// <param name="token">code token</param> /// <param name="lodgedCard">Flag lodged card or not</param> /// <param name="firstCardReference">First card reference</param> /// <returns>ReturnIndicator</returns> public static CardInfos CheckCardNumber(UserInfo user, string cardnumber, DateTime expirationDate, bool onlineCheck, string cardHolder, string pos, int timeout, string service, string customercode, string travellercode, string token, int lodgedCard, string firstCardReference) { // On va valider cette carte CardInfos ri = new CardInfos(); if (onlineCheck) { // On demande une vérification // depuis le service en ligne ri.SetOnlineCheckRequested(onlineCheck); } //--> EGE-62034 : Revamp - CCE - Change Financial flow update if (lodgedCard == 1) { ri.SetNavisionLodgedCard(); } //<-- EGE-62034 : Revamp - CCE - Change Financial flow update // On gère les rejets classiques if (String.IsNullOrEmpty(cardnumber)) { // Pan vide ri.SetUnValidMsg(user, user.GetMessages().GetString("EmptyPAN", true)); return(ri); } if (cardnumber.Length < MinimalLength) { // Pan trop court ri.SetUnValidMsg(user, user.GetMessages().GetString("UnvalidPAN", cardnumber, true)); return(ri); } if (IsInvalidRegEx(cardnumber)) { // Pan non digits ri.SetUnValidMsg(user, user.GetMessages().GetString("PANNotDigits", cardnumber, true)); return(ri); } // On va essayer de déterminer le type de carte // grace au numéro de la carte int cardId = GetCardID(cardnumber); if (cardId == Invalid) { // On ne connait pas ce type de carte ri.SetUnValidMsg(user, user.GetMessages().GetString("UnknownCardType", true)); return(ri); } // On garde en mémoire le numéro de carte ri.SetCardNumber(cardnumber); // On a déterminé le type de carte // allons maintenant vérifier si cette carte // est valide en effectuant un contrôle de Luhn if (!LuhnValidate(user, cardnumber)) { // Cette carte est invalide ri.SetUnValidMsg(user, user.GetMessages().GetString("UnvalidPAN", ri.GetTruncatedPAN(), true)); return(ri); } // A-t-on besoin de vérifier la date d'expiration if (!Util.IsEmptyDate(expirationDate)) { DateTime now = DateTime.Today; // On doit vérifier la date d'expiration if (now > expirationDate) { // Cette carte a expiré ri.SetUnValidMsg(user, user.GetMessages().GetString("ExpiredPAN", ri.GetTruncatedPAN(), true)); return(ri); } // La date d'expiration ne peut aller au dela // de 10 ans if (Util.DateDiffInYears(now, expirationDate) > 10) { // La date d'expiration est invalide ri.SetUnValidMsg(user, user.GetMessages().GetString("InvalidExpirationDate", Util.GetShortExpirationDate(expirationDate), true)); return(ri); } // La carte n'a pas encore expirée ri.SetExpirationDate(expirationDate); } // Card is valid ri.SetCardValid(true); ri.SetCardType(GetCardName(cardId)); ri.SetShortCardType(GetShortCardName(cardId)); ri.SetNavisionCardType(GetNavisionCardType(cardId)); ri.SetNavisionCardName(GetNavisionCardName(cardId)); ri.SetPOS(Util.CorrectPos(user, pos)); ri.SetFirstCardReference(firstCardReference); ri.SetTruncatedPAN(TruncatePan(cardnumber)); ri.SetMII(cardnumber); ri.SetMIIIssuerCategory(GetMIIIssuerCategory(cardId)); ri.SetCustomerCode(customercode); switch (cardId) { case AmericanExpress: ri.SetNavisionPaymentBTA(); break; case Airplus: ri.SetNavisionPaymentAirPlus(); break; //case DinersClub : ri.SetNavisionPaymentDiners() ; break; default: break; } // We are here..we can do online validation or even connect to BackOffice system // only if we have market if (String.IsNullOrEmpty(ri.GetPOS())) { //Services.WriteOperationStatusToLog(user, String.Format(" - Info : Empty POS..cannot call online validationfor card type = {0}, truncated PAN {1}", ri.GetCardType(), ri.GetTruncatedPAN())); // We cannot continue, we don't have market return(ri); } //Services.WriteOperationStatusToLog(user, String.Format(" - Info : Connecting to BackOffice system to retrieve financial settings for Truncated PAN= {0}, POS = {1}, card type = {2}, Lodged= {3} ...", ri.GetTruncatedPAN(), ri.GetPOS(), ri.GetNavisionCardName(), ri.GetNavisionLodgedCard())); // Connect to backoffice system // and retrieve informations such as merchant and enhanced flows // online validation NavServiceUtils.GetPaymentSettings(user, ri); //Services.WriteOperationStatusToLog(user, (String.Format("Financial settings retrieved for card type ={0}, truncated PAN= {1}, Merchant flow = {2}, Enhanced flow = {3}, Online check = {4}" // , ri.GetCardType(),ri.GetTruncatedPAN(), ri.GetNavisionFinancialFlow(), ri.GetNavisionEnhancedFlow(), ri.GetOnlineValidation()))); // Cette carte est valide // Si c'est une carte BIBIT alors, il faut // vérifier via le service RBS si nécéssaire if (!ri.IsCallOnLineValidationForSure(user)) { // On n'a pas besoin de valider en ligne cette carte // Services.WriteOperationStatusToLog(user, String.Format(" - Info : No need to do online validation for card type = {0}, truncated PAN = {1}, POS = {2}", ri.GetCardType(), ri.GetTruncatedPAN(), ri.GetPOS())); ; return(ri); } //Services.WriteOperationStatusToLog(user, String.Format(" - Info : We need to do online validation for card type = {0}, truncated PAN = {1}, POS = {2}", ri.GetCardType(), ri.GetTruncatedPAN(), ri.GetPOS())); // We are here we need to fo online validation // On complète les informations ri.SetService(service); ri.SetTravellerCode(travellercode); ri.SetHolderName(cardHolder); ri.SetToken(token); // Mais avant de procéder, il est nécéssaire de vérifier si une vérification n'a pas été faite // les 24 dernières heures // pour cela, nous devons disposer du cryptogramme lors de la recherche dans le cache bool CheckCacheInFO = false; if (BibitVerifier.RBSRequestCacheOn) { // En fonction de la méthode d'appel,nous n'allons // pas utiliser le même serveur d'encryption switch (user.GetApplication()) { case UserInfo.APPLICATION_FO_TOKENIZATION: case UserInfo.APPLICATION_CARD_VALIDATION: ri.SetEncryptedPan(Services.EncryptFOCard(user, ri.GetCardNumber())); CheckCacheInFO = true; break; default: ri.SetEncryptedPan(Services.EncryptBOCard(user, ri.GetCardNumber())); break; } CachedValidationResult cache = null; // On a le cryptogramme du PAN // Nous allons maintenant lire le cache... if (CheckCacheInFO) { cache = Services.GetCachedFOBibitResponse(user, ri.GetEncryptedPan()); } else { cache = Services.GetCachedBibitResponse(user, ri.GetEncryptedPan()); } if (cache.GetStatus() == CachedValidationResult.CacheStatus.FoundValid) { Services.WriteOperationStatusToLog(user, String.Format(" - Info : Card truncated PAN={0}, was found in the cache", ri.GetTruncatedPAN())); // La carte a déjà été validée ri.SetBibitValidFromCache(true); ri.SetBibitValidFromCacheDate(cache.GetLastAccessTime()); return(ri); } } // Nous devons valider via le service en ligne ProviderVerifierResult br = CheckCard(user, ri, cardId, timeout); if (br == null) { // We cannot find provider to validate the credit card // We have to stop here return(ri); } //Services.WriteOperationStatusToLog(user, String.Format(" - Info : Online validation done (Valid = {0}) for card type = {1}, truncated PAN = {2}, POS = {3}" // , br.IsSuccess(), ri.GetCardType(), ri.GetTruncatedPAN(), ri.GetPOS())); if (!br.IsSuccess()) { // credit card is unvalid ri.SetCardValid(false); ri.SetUnValidMsg(user, br.GetOrderCode(), br.GetInformationMessage(), br.GetCompleteResponse(), user.GetMessages().GetString("Bibit.RejectedCard", ri.GetTruncatedPAN(), true) + br.GetInformationMessage()); return(ri); } // La carte est valide // ou on a eu un soucis de Timeout // ou d'erreurs au niveau du service de validation ri.SetInformationCode(br.GetInformationCode()); ri.SetInformationMessage(br.GetInformationMessage()); if (br.GetInformationCode() != null) { // On va tracer cette erreur dans la table des traces des carte rejetées // typiquement un soucis de timeout Services.LogRejectedCreditCard(user, ri, br.GetOrderCode(), br.GetInformationCode(), br.GetInformationMessage(), br.GetCompleteResponse()); return(ri); } // La carte a été validée via RBS if (BibitVerifier.RBSRequestCacheOn) { // On va mettre en cache cet état if (CheckCacheInFO) { // dans le cache du Front Office Services.CacheFOBibitResponseStatus(user, ri.GetEncryptedPan()); } else { // dans le cache du BackOffice Services.CacheBibitResponseStatus(user, ri.GetEncryptedPan()); } } return(ri); }
public static void TestNavisionService(UserInfo user) { // Test Navision Wss NavServiceUtils.Test(); }