protected override async Task HandleMessage(Message <DtoRenewAccessTokenMessage> message) { if (message == null || message.Data == null || string.IsNullOrWhiteSpace(message.Data.ExternalAccessToken) || string.IsNullOrWhiteSpace(message.Data.ExternalRefreshToken) || message.Data.ExternalTokenExpiry == default(DateTime)) { return; } try { var accessToken = message.Data.ExternalAccessToken; var refreshToken = message.Data.ExternalRefreshToken; var tokenExpiry = message.Data.ExternalTokenExpiry; var companyId = message.Data.CompanyId; var client = new SquareClient.Builder() .Environment(_settings.Connection.SquarePaymentsSandbox ? Square.Environment.Sandbox : Square.Environment.Production) .Build(); var body = new ObtainTokenRequest(_settings.Connection.SquareAppId, _settings.Connection.SquareAccessToken, "refresh_token", refreshToken: refreshToken); ObtainTokenResponse response = null; try { response = await client.OAuthApi.ObtainTokenAsync(body).ConfigureAwait(false); accessToken = response.AccessToken; refreshToken = response.RefreshToken; var expiry = DateTime.TryParse(response.ExpiresAt, out DateTime parsedDate)? parsedDate : tokenExpiry; if (!string.IsNullOrWhiteSpace(accessToken) && !string.IsNullOrWhiteSpace(refreshToken) && (expiry != null || expiry != default(DateTime))) { await _companies.UpdateCompany(new CompanyPatch { ResourceId = companyId, ExternalAccessToken = new PatchOperation <string> { Operation = OperationKind.Update, Value = accessToken }, ExternalRefreshToken = new PatchOperation <string> { Operation = OperationKind.Update, Value = refreshToken }, ExternalTokenExpiry = new PatchOperation <DateTime> { Operation = OperationKind.Update, Value = expiry } }).ConfigureAwait(false); } } catch (Exception e) { Logger.LogError(e, $"Unable to update company access token"); } } catch (ApiException e) { Logger.LogError(e, $"Failed to connect to Square API"); } }
public async Task <IActionResult> SubmitToken([FromQuery] string code, [FromQuery] string response_type, [FromQuery] string state) { if (string.IsNullOrWhiteSpace(code) || string.IsNullOrWhiteSpace(response_type) || string.IsNullOrWhiteSpace(state) || !string.Equals(response_type, "code", StringComparison.OrdinalIgnoreCase)) { return(RedirectToPage("/Index")); } var employeeId = await cache.GetStringAsync($"company-square-verify-{state}").ConfigureAwait(false); if (string.IsNullOrWhiteSpace(employeeId)) { return(RedirectToPage("/Index")); } int rawEmployeeId = -1; if (!int.TryParse(employeeId, out rawEmployeeId)) { return(RedirectToPage("/Index")); } if (rawEmployeeId == -1) { return(RedirectToPage("/Index")); } var employee = await employees.FetchEmployee(rawEmployeeId) .Ensure(e => e.HasValue, "Employee found") .OnSuccess(e => e.Value) .ConfigureAwait(false); if (employee.IsFailure) { return(RedirectToPage("/Index")); } var role = await roles.FetchEmployeeRole(employee.Value.RoleId) .Ensure(r => r.HasValue, "Role found") .OnSuccess(r => r.Value) .ConfigureAwait(false); if (role.IsFailure || !role.Value.CanAdministerCompany) { return(RedirectToPage("/Index")); } var company = await companies.FetchCompany(employee.Value.CompanyId) .Ensure(c => c.HasValue, "Company found") .OnSuccess(c => c.Value) .ConfigureAwait(false); if (company.IsFailure) { return(RedirectToPage("/Index")); } var client = new SquareClient.Builder() .Environment(settings.Connection.SquarePaymentsSandbox ? Square.Environment.Sandbox : Square.Environment.Production) .Build(); var body = new ObtainTokenRequest(settings.Connection.SquareAppId, settings.Connection.SquareAccessToken, "authorization_code", code); ObtainTokenResponse response = null; try { response = await client.OAuthApi.ObtainTokenAsync(body).ConfigureAwait(false); } catch (Exception) { return(RedirectToPage("/Index")); } if (response == null) { return(RedirectToPage("/Index")); } var accessToken = response.AccessToken; var refreshToken = response.RefreshToken; var expiresAt = response.ExpiresAt; var merchantId = response.MerchantId; DateTime tokenExpiry; if (!DateTime.TryParse(response.ExpiresAt, out tokenExpiry)) { return(RedirectToPage("/Index")); } var companyId = company.Value.CompanyId; SynchVenuesWithExternalPaymentProvider(accessToken, company.Value); accessToken = await EncryptString(accessToken).ConfigureAwait(false); refreshToken = await EncryptString(refreshToken).ConfigureAwait(false); return(await companies.UpdateCompany(new CompanyPatch { ResourceId = companyId, ExternalAccessToken = new PatchOperation <string> { Operation = OperationKind.Update, Value = accessToken }, ExternalRefreshToken = new PatchOperation <string> { Operation = OperationKind.Update, Value = refreshToken }, ExternalAccountId = new PatchOperation <string> { Operation = OperationKind.Update, Value = merchantId }, ExternalTokenExpiry = new PatchOperation <DateTime> { Operation = OperationKind.Update, Value = tokenExpiry } }).OnBoth(u => RedirectToPage("/Index")).ConfigureAwait(false)); }