public async Task <IActionResult> ShuftiPro() { var check = await KycExternalProvider.OnServiceCallback(HttpContext.Request); if (check.IsFinalStatus) { var ticket = await( from t in DbContext.KycShuftiProTicket where t.ReferenceId == check.TicketId && t.TimeResponded == null select t ) .Include(tickt => tickt.User).ThenInclude(user => user.UserVerification) .FirstOrDefaultAsync() ; if (ticket != null) { var userVerified = check.OverallStatus == CoreLogic.Services.KYC.VerificationStatus.Verified; ticket.IsVerified = userVerified; ticket.CallbackStatusCode = check.ServiceStatus; ticket.CallbackMessage = check.ServiceMessage; ticket.TimeResponded = DateTime.UtcNow; await DbContext.SaveChangesAsync(); } } return(Ok()); }
public async Task <APIResponse> VerificationKycStart([FromBody] VerificationKycStartModel model) { // validate if (BaseValidableModel.IsInvalid(model, out var errFields)) { return(APIResponse.BadRequest(errFields)); } var user = await GetUserFromDb(); var userTier = CoreLogic.User.GetTier(user); // tos not signed, didn't fill personal data, has kyc already if ( !CoreLogic.User.HasTosSigned(user.UserVerification) || !CoreLogic.User.HasFilledPersonalData(user.UserVerification) || CoreLogic.User.HasKycVerification(user.UserVerification) ) { return(APIResponse.BadRequest(APIErrorCode.AccountNotVerified)); } // check previous verification attempt var status = MakeVerificationView(user); if (status.IsKycPending) { return(APIResponse.BadRequest(APIErrorCode.RateLimit)); } // --- // new kyc ticket var ticket = new KycTicket() { UserId = user.Id, ReferenceId = Guid.NewGuid().ToString("N"), Method = "general", FirstName = user.UserVerification.FirstName, LastName = user.UserVerification.LastName, DoB = user.UserVerification.DoB.Value, CountryCode = user.UserVerification.CountryCode, PhoneNumber = user.UserVerification.PhoneNumber, TimeCreated = DateTime.UtcNow, }; DbContext.KycShuftiProTicket.Add(ticket); await DbContext.SaveChangesAsync(); // set last ticket user.UserVerification.LastKycTicket = ticket; await DbContext.SaveChangesAsync(); // new redirect var kycUser = new CoreLogic.Services.KYC.UserData() { FirstName = ticket.FirstName, LastName = ticket.LastName, CountryCode = ticket.CountryCode, LanguageCode = GetUserLocale().ToString().ToUpper(), DoB = ticket.DoB, PhoneNumber = ticket.PhoneNumber, Email = user.Email, }; var callbackUrl = Url.Link("CallbackShuftiPro", new { /*secret = AppConfig.Services.ShuftiPro.CallbackSecret*/ }); var userTempRedirectUrl = Url.Link("CallbackRedirect", new { to = System.Web.HttpUtility.UrlEncode(model.Redirect) }); var kycRedirect = await KycExternalProvider.GetRedirect( kycUser, ticket.ReferenceId, userTempRedirectUrl, callbackUrl ); Logger.Verbose($"{user.UserName} got kyc redirect to {kycRedirect} with callback to {callbackUrl} and middle redirect to {userTempRedirectUrl}"); return(APIResponse.Success(new VerificationKycStartView() { TicketId = ticket.Id.ToString(), Redirect = kycRedirect, })); }