예제 #1
0
        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");
            }
        }
예제 #2
0
        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));
        }