/// <summary> /// Activates the device. /// </summary> /// <param name="request">The device activation request.</param> /// <returns>The device activation response.</returns> private static ActivateDeviceRealtimeResponse ActivateDevice(ActivateDeviceRealtimeRequest request) { var getDeviceRequest = new GetDeviceDataRequest(request.DeviceNumber, isActivatedOnly: false); Device device = request.RequestContext.Runtime.Execute <SingleEntityDataServiceResponse <Device> >(getDeviceRequest, request.RequestContext).Entity; device.ActivatedDateTime = device.ActivatedDateTime ?? DateTimeOffset.UtcNow; device.DeactivateComments = device.DeactivateComments ?? string.Empty; device.DeactivatedDateTime = device.DeactivatedDateTime ?? DateTimeOffset.MinValue; device.TokenIssueTime = device.TokenIssueTime ?? DateTimeOffset.UtcNow; var result = new DeviceActivationResult(); if (device == null) { // Device is not found, throws exception. string message = string.Format("The input device number '{0}' does not exist in demo database.", request.DeviceNumber); throw new ConfigurationException(ConfigurationErrors.Microsoft_Dynamics_Commerce_Runtime_DeviceConfigurationNotFound, message); } else if (string.IsNullOrWhiteSpace(device.TerminalId)) { // If device is found but the terminal associated with the device is not found, try to find the terminal using input terminal id. var columnSet = new ColumnSet(Terminal.RecordIdColumn, Terminal.TerminalIdColumn, Terminal.ChannelIdColumn); var settings = new QueryResultSettings(columnSet, PagingInfo.AllRecords); var getTerminalRequest = new GetTerminalDataRequest(request.TerminalId, settings); Terminal terminal = request.RequestContext.Runtime.Execute <SingleEntityDataServiceResponse <Terminal> >(getTerminalRequest, request.RequestContext).Entity; if (terminal == null) { string message = string.Format("The input device number '{0}' and terminal identifier '{1}' do not exist in demo database.", request.DeviceNumber, request.TerminalId); throw new ConfigurationException(ConfigurationErrors.Microsoft_Dynamics_Commerce_Runtime_DeviceConfigurationNotFound, message); } result.Device = new Device { DeviceId = request.DeviceId, DeviceNumber = request.DeviceNumber, TerminalRecordId = terminal.RecordId, TerminalId = terminal.TerminalId, ChannelId = terminal.ChannelId, DeviceTypeRecordId = device.DeviceTypeRecordId, ActivatedDateTime = device.ActivatedDateTime, TokenIssueTime = device.TokenIssueTime, DeactivatedDateTime = device.DeactivatedDateTime, DeactivateComments = device.DeactivateComments, TokenData = device.TokenData, TokenSalt = device.TokenSalt }; } else { // Both the device and associated terminal are found. device.DeviceNumber = request.DeviceNumber; device.DeviceId = request.DeviceId; result.Device = device; } var response = new ActivateDeviceRealtimeResponse(result); return(response); }
/// <summary> /// The data service method to execute the data manager to get the device configuration. /// </summary> /// <param name="request">The data service request.</param> /// <returns>The data service response.</returns> private SingleEntityDataServiceResponse <DeviceConfiguration> GetDeviceConfiguration(GetDeviceConfigurationDataRequest request) { ThrowIf.Null(request, "request"); ThrowIf.Null(request.RequestContext, "request.RequestContext"); ThrowIf.Null(request.QueryResultSettings, "request.QueryResultSettings"); ICommercePrincipal principal = request.RequestContext.GetPrincipal(); if (principal.IsChannelAgnostic || principal.IsTerminalAgnostic || string.IsNullOrWhiteSpace(principal.DeviceNumber)) { throw new InvalidOperationException("Current request context is not associated to a device."); } Terminal terminal = request.RequestContext.GetTerminal(); ParameterSet parameters = new ParameterSet(); Tuple <PagedResult <DeviceConfiguration>, ReadOnlyCollection <HardwareConfiguration>, ReadOnlyCollection <HardwareConfiguration>, ReadOnlyCollection <HardwareConfiguration> > dataSets = null; parameters[DatabaseAccessor.ChannelIdVariableName] = terminal.ChannelId; parameters[TerminalIdVariableName] = terminal.TerminalId; parameters[IncludeImagesVariableName] = request.IncludeImages; using (SqlServerDatabaseContext databaseContext = new SqlServerDatabaseContext(request.RequestContext, request.QueryResultSettings)) { dataSets = databaseContext.ExecuteStoredProcedure <DeviceConfiguration, HardwareConfiguration, HardwareConfiguration, HardwareConfiguration>(GetDeviceConfigurationSprocName, parameters); } DeviceConfiguration deviceConfiguration = dataSets.Item1.SingleOrDefault(); ReadOnlyCollection <HardwareConfiguration> drawers = dataSets.Item2; ReadOnlyCollection <HardwareConfiguration> printers = dataSets.Item3; ReadOnlyCollection <HardwareConfiguration> pinpads = dataSets.Item4; if (deviceConfiguration != null) { deviceConfiguration.HardwareConfigurations = new HardwareConfigurations(); deviceConfiguration.HardwareConfigurations.CashDrawerConfigurations.AddRange(drawers); deviceConfiguration.HardwareConfigurations.PrinterConfigurations.AddRange(printers); deviceConfiguration.HardwareConfigurations.PinPadConfiguration = pinpads.SingleOrDefault(); } GetDeviceDataRequest getDeviceRequest = new GetDeviceDataRequest(principal.DeviceNumber); Device device = request.RequestContext.Execute <SingleEntityDataServiceResponse <Device> >(getDeviceRequest).Entity; if (deviceConfiguration != null && device != null) { deviceConfiguration.UseInMemoryDeviceDataStorage = device.UseInMemoryDeviceDataStorage; } return(new SingleEntityDataServiceResponse <DeviceConfiguration>(deviceConfiguration)); }
/// <summary> /// 获取某个设备当前上报到云端的数据,该接口适用于使用数据模板协议的产品。 /// </summary> /// <param name="req">参考<see cref="GetDeviceDataRequest"/></param> /// <returns>参考<see cref="GetDeviceDataResponse"/>实例</returns> public async Task <GetDeviceDataResponse> GetDeviceData(GetDeviceDataRequest req) { JsonResponseModel <GetDeviceDataResponse> rsp = null; try { var strResp = await this.InternalRequest(req, "GetDeviceData"); rsp = JsonConvert.DeserializeObject <JsonResponseModel <GetDeviceDataResponse> >(strResp); } catch (JsonSerializationException e) { throw new TencentCloudSDKException(e.Message); } return(rsp.Response); }
/// <summary> /// Deactivates the device. /// </summary> /// <param name="request">The device deactivation request.</param> /// <returns>The device deactivation response.</returns> private static DeactivateDeviceRealtimeResponse DeactivateDevice(DeactivateDeviceRealtimeRequest request) { ThrowIf.Null(request, "request"); var getDeviceRequest = new GetDeviceDataRequest(request.DeviceNumber, isActivatedOnly: false); Device device = request.RequestContext.Runtime.Execute <SingleEntityDataServiceResponse <Device> >(getDeviceRequest, request.RequestContext).Entity; device.ActivationStatus = DeviceActivationStatus.Deactivated; device.ActivatedDateTime = device.ActivatedDateTime ?? DateTimeOffset.UtcNow; device.DeactivateComments = device.DeactivateComments ?? string.Empty; device.DeactivatedDateTime = device.DeactivatedDateTime ?? DateTimeOffset.MinValue; device.TokenIssueTime = device.TokenIssueTime ?? DateTimeOffset.UtcNow; return(new DeactivateDeviceRealtimeResponse(new DeviceDeactivationResult() { Device = device })); }
/// <summary> /// Authenticates the device. /// </summary> /// <param name="request">The device authentication request.</param> /// <returns>The response.</returns> private static AuthenticateDeviceRealtimeResponse AuthenticateDevice(AuthenticateDeviceRealtimeRequest request) { var getDeviceRequest = new GetDeviceDataRequest(request.Device.DeviceNumber, isActivatedOnly: false); Device device = request.RequestContext.Runtime.Execute <SingleEntityDataServiceResponse <Device> >(getDeviceRequest, request.RequestContext).Entity; if (device == null) { // Device is not found, throws exception. string message = string.Format("The input device number '{0}' does not exist in demo database.", request.Device.DeviceNumber); throw new ConfigurationException(ConfigurationErrors.Microsoft_Dynamics_Commerce_Runtime_DeviceConfigurationNotFound, message); } device.ActivatedDateTime = device.ActivatedDateTime ?? DateTimeOffset.UtcNow; device.DeactivateComments = device.DeactivateComments ?? string.Empty; device.DeactivatedDateTime = device.DeactivatedDateTime ?? DateTimeOffset.MinValue; device.TokenIssueTime = device.TokenIssueTime ?? DateTimeOffset.UtcNow; return(new AuthenticateDeviceRealtimeResponse(device)); }
/// <summary> /// Validate Device token. /// </summary> /// <param name="deviceId">The device identifier.</param> /// <param name="deviceTokenData">The device token data.</param> /// <param name="deviceToken">The device token.</param> /// <param name="requestContext">Request context.</param> /// <returns>Device response.</returns> private static Device ValidateDeviceTokenLocally(string deviceId, string deviceTokenData, string deviceToken, RequestContext requestContext) { var getTransactionServiceProfileDataRequest = new GetTransactionServiceProfileDataRequest(); TransactionServiceProfile transactionServiceProfile = requestContext.Runtime.Execute <SingleEntityDataServiceResponse <TransactionServiceProfile> >(getTransactionServiceProfileDataRequest, requestContext).Entity; int deviceTokenExpirationInDays = transactionServiceProfile.DeviceTokenExpirationInDays; // only validate device if connecting against master database bool mustValidateActiveDevice = requestContext.Runtime.Configuration.IsMasterDatabaseConnectionString; // Get the device GetDeviceDataRequest getDeviceRequest = new GetDeviceDataRequest(deviceId, mustValidateActiveDevice); Device localDevice = requestContext.Execute <SingleEntityDataServiceResponse <Device> >(getDeviceRequest).Entity; if (localDevice == null) { throw new DeviceAuthenticationException( SecurityErrors.Microsoft_Dynamics_Commerce_Runtime_LocalDeviceAuthenticationFailed, string.Format("Device not found for device '{0}'.", deviceId)); } localDevice.Token = deviceToken; string algorithm = localDevice.TokenAlgorithm; if (string.IsNullOrEmpty(algorithm)) { // string algorithm = transactionServiceProfile.DeviceTokenAlgorithm; algorithm = "SHA256"; } if (mustValidateActiveDevice) { if (string.IsNullOrEmpty(localDevice.TokenSalt)) { throw new DeviceAuthenticationException( SecurityErrors.Microsoft_Dynamics_Commerce_Runtime_LocalDeviceAuthenticationFailed, string.Format("TokenSalt not available for device '{0}'.", deviceId)); } if (localDevice.ActivationStatus != DeviceActivationStatus.Activated) { throw new DeviceAuthenticationException( SecurityErrors.Microsoft_Dynamics_Commerce_Runtime_LocalDeviceAuthenticationFailed, string.Format("Device is not activated, actual state is '{0}'.", localDevice.ActivationStatus)); } // Get hashed value for device token HashDataServiceRequest hashDataServiceRequest = new HashDataServiceRequest(deviceTokenData, algorithm, localDevice.DeviceNumber, localDevice.TokenSalt); string deviceTokenHash = requestContext.Execute <HashDataServiceResponse>(hashDataServiceRequest).Data; // Validate the hashed device token with value in the database if (!string.Equals(deviceTokenHash, localDevice.TokenData)) { throw new DeviceAuthenticationException( SecurityErrors.Microsoft_Dynamics_Commerce_Runtime_LocalDeviceAuthenticationFailed, string.Format("Device token for '{0}' record was not found.", deviceId)); } if (!localDevice.TokenIssueTime.HasValue) { throw new ConfigurationException( ConfigurationErrors.Microsoft_Dynamics_Commerce_Runtime_ActivatedDeviceMissingTokenIssueDatetime, string.Format("Activated device '{0}' does not have an associated token issue datetime.", deviceId)); } if (DateTimeOffset.Compare(DateTimeOffset.Now, localDevice.TokenIssueTime.Value.AddDays(deviceTokenExpirationInDays)) > 0) { throw new DeviceAuthenticationException( SecurityErrors.Microsoft_Dynamics_Commerce_Runtime_DeviceTokenExpired, string.Format("Device Token for device '{0}' expired.", deviceId)); } } else { // when device comes from non-master database, it might have stale data localDevice = ConstructDeviceFromToken(deviceToken); } return(localDevice); }