예제 #1
0
        private void SendBuildingsMap(CallbackRequest callbackrequest)
        {
            var buildedClient = GetInitializeWebClient(callbackrequest);

            buildedClient.QueryString.Add("attachment", "photo-166642622_456239017");
            var res = buildedClient.DownloadString(uri);
        }
        public async Task <Callback> UpdateCallbackAsync(string id, CallbackRequest content)
        {
            var request  = new RestRequest($"/callbacks/{id}", HttpMethod.Put, content);
            var response = await SendRequestAsync(Client, request);

            return(JsonConvert.DeserializeObject <IDictionary <string, Callback> >(response.Content).Values.First());
        }
예제 #3
0
 private void SendPostsFromMisisGroup(CallbackRequest callbackRequest)
 {
     if (_vkProxy.AccessToken.Equals(String.Empty))
     {
         _vkProxy.GetPosts(GetInitializeWebClient(callbackRequest), uri, callbackRequest.Object.Body);
     }
 }
예제 #4
0
        /// <summary>
        /// Requests that the following action be completed as soon as reasonably possible.
        /// This will either be done immediately, or be queued for the next approriate time.
        /// </summary>
        /// <param name="callback">action to perform</param>
        /// <returns>
        /// A cancelation object. Use in a using block.
        /// </returns>
        public CallbackRequest RequestCallback(Action callback)
        {
            CallbackRequest request = new CallbackRequest(callback);

            lock (m_syncRoot)
            {
                m_isRequestCallbackMethodProcessing = true;
                Thread.MemoryBarrier();
                //------------------------------------------
                if (m_isSafeToCallback)
                {
                    request.Run();
                }
                else
                {
                    m_isCallbackWaiting = true;
                    m_pendingCallbacks.Add(request);
                }
                //-----------------------------------------
                Thread.MemoryBarrier();
                m_isRequestCallbackMethodProcessing = false;
            }

            return(request);
        }
        public async Task <ServiceResult> Process(string userId, CallbackRequest callbackData)
        {
            if (!string.IsNullOrEmpty(callbackData.Error))
            {
                return(ServiceResult.Failed(new[] { ErrorMessages.CallbackStatedAccessDenied }));
            }

            var accountContext = new AccountAccessContext
            {
                UserId = userId,
                Code   = callbackData.Code,
                Scopes = callbackData.GetScopes()
            };

            var exchangeCodeResult = await _authorizationService.ExchangeCode(accountContext);

            if (!exchangeCodeResult.Success)
            {
                return(ServiceResult.Failed(exchangeCodeResult.Errors));
            }

            await _userDataCachingService.ClearUserData(userId);

            return(ServiceResult.Succeeded());
        }
예제 #6
0
        private void SendSchedule(CallbackRequest callbackRequest)
        {
            var buildedClient = GetInitializeWebClient(callbackRequest);

            buildedClient.QueryString.Add("attachment", "doc141213476_466619620,doc141213476_466619622,doc141213476_466619680,doc141213476_466619682,doc141213476_466619754,doc141213476_466619783");
            var res = buildedClient.DownloadString(uri);
        }
예제 #7
0
        private void SendCommunityList(CallbackRequest callbackRequest)
        {
            var buildedClient = GetInitializeWebClient(callbackRequest);
            var message       = "Список объединений : \n" +
                                "Лига разработчиков МИСиС - https://vk.com/lodmisis \n" +
                                "НИТУ «МИСиС» - https://vk.com/nust_misis \n" +
                                "ТурКлуб МИСиС - https://vk.com/tk_misis \n" +
                                "Студенческий совет НИТУ «МИСиС» - https://vk.com/studentmisis \n" +
                                "Студсовет Общежитий НИТУ \"МИСиС\" - https://vk.com/studac_new \n" +
                                "Центр карьеры НИТУ \"МИСиС\" - https://vk.com/ck_misis \n " +
                                "Цитатник МИСиС - https://vk.com/public80799683 \n" +
                                "СКБ НИТУ \"МИСиС\" - https://vk.com/skbmisis \n" +
                                "СНО НИТУ «МИСиС» - https://vk.com/sno_misis \n " +
                                "Lignum | Литературное сообщество НИТУ \"МИСиС\" - https://vk.com/lignummisis \n" +
                                "КВН МИСиС - https://vk.com/kvn_misis \n" +
                                "Управление культуры и молодежной политики МИСиС - https://vk.com/ykmp_misis \n" +
                                "Эндаумент-фонд НИТУ \"МИСиС\" - https://vk.com/ef.misis \n " +
                                "Лингвистика в МИСиС - https://vk.com/lingvistikavmisis \n" +
                                "СтудОК НИТУ \"МИСиС\" - https://vk.com/studok_misis \n" +
                                "Киберспорт НИТУ \"МИСиС\" - https://vk.com/cybersport_nustmisis \n" +
                                "Волонтерский центр НИТУ \"МИСиС\" - https://vk.com/volunteer_misis \n" +
                                "Хоккейный клуб НИТУ \"МИСиС\" \"Стальные медведи\" - https://vk.com/fan.steelbears \n" +
                                "Кейс-движение CUP MISIS CASE - https://vk.com/cupmisiscase \n " +
                                "Сделано Лигой Разработчиков - https://lod-misis.ru"

            ;

            buildedClient.QueryString.Add("message", message);
            var res = buildedClient.DownloadString(uri);
        }
        public async Task <IActionResult> Get(string userId, [FromQuery] CallbackRequest request)
        {
            _logger.LogInformation($"Processing new account access for user {userId}");

            var result = await _service.Process(userId, request);

            return(GenerateResultFromServiceResult(result));
        }
예제 #9
0
        public bool Satisfies(CallbackRequest request)
        {
            SignedValues values     = _valueProvider.GetSignedValues(request);
            string       scriptPath = request.Uri.GetScriptPath();
            string       signature  = Sign(scriptPath, values.Values);

            return(signature == values.Signature);
        }
예제 #10
0
        public bool Satisfies(CallbackRequest request)
        {
            SignedValues values = _valueProvider.GetSignedValues(request);
            string scriptPath = request.Uri.GetScriptPath();
            string signature = Sign(scriptPath, values.Values);

            return signature == values.Signature;
        }
예제 #11
0
        private WebClient GetInitializeWebClient(CallbackRequest callbackRequest)
        {
            var uri    = new Uri(@"https://api.vk.com/method/messages.send");
            var client = new WebClient();

            client.QueryString.Add("v", "5.70");
            client.QueryString.Add("access_token", AccessToken);
            client.QueryString.Add("user_id", callbackRequest.Object.UserId.ToString());
            client.QueryString.Add("chat_id", callbackRequest.Object.UserId.ToString());
            return(client);
        }
예제 #12
0
        public JsonResult Index(CallbackRequest cbdata)
        {
            var result = new Dictionary <string, object>();

            try
            {
                var dataStr    = Convert.ToString(cbdata.Data);
                var requestMac = Convert.ToString(cbdata.Mac);

                var isValidCallback = ZaloPayHelper.VerifyCallback(dataStr, requestMac);

                // kiểm tra callback hợp lệ (đến từ zalopay server)
                if (!isValidCallback)
                {
                    // callback không hợp lệ
                    result["returncode"]    = -1;
                    result["returnmessage"] = "mac not equal";
                }
                else
                {
                    // thanh toán thành công
                    // merchant xử lý đơn hàng cho user
                    var data       = JsonConvert.DeserializeObject <Dictionary <string, object> >(dataStr);
                    var apptransid = data["apptransid"].ToString();

                    using (var db = new ZaloPayDemoContext())
                    {
                        var orderDTO = db.Orders.SingleOrDefault(o => o.Apptransid.Equals(apptransid));
                        if (orderDTO != null)
                        {
                            orderDTO.Zptransid = data["zptransid"].ToString();
                            orderDTO.Channel   = int.Parse(data["channel"].ToString());
                            orderDTO.Status    = 1;

                            db.SaveChanges();
                        }
                    }

                    result["returncode"]    = 1;
                    result["returnmessage"] = "success";
                }

                // thông báo kết quả cho zalopay server
                return(Json(result));
            } catch (Exception ex)
            {
                result["returncode"]    = 0; // ZaloPay sẽ callback lại tối đa 3 lần
                result["returnmessage"] = ex.Message;
                return(Json(result));
            }
        }
        public void CallbackRequestRendersJsonAs()
        {
            var request = new CallbackRequest
            {
                ObjectType  = ObjectType.Users,
                Description = "Users Callback",
                Enabled     = true,
                Url         = "https://httpbin.org/post"
            };

            var response = JsonConvert.SerializeObject(request);

            Assert.Equal(@"{""description"":""Users Callback"",""url"":""https://httpbin.org/post"",""object_type"":""users"",""enabled"":true}", response);
        }
예제 #14
0
        private void SendCommandList(CallbackRequest callbackRequest)
        {
            var buildedClient = GetInitializeWebClient(callbackRequest);
            var message       = "Список команд : \n" +
                                "1)hashtag - получение записи по тегу, например tag студент \n" +
                                "2) объединения - получить список студенческих объединений университета \n" +
                                "3) расписание - расписание занятий \n" +
                                "4) карта - карта корпусов \n" +
                                "Сделано Лигой Разработчиков - https://lod-misis.ru/"
            ;

            buildedClient.QueryString.Add("message", message);
            var res = buildedClient.DownloadString(uri);
        }
예제 #15
0
        public async Task <ActionResult> Callback(CallbackRequest model, CancellationToken ct)
        {
            var cardholderId = model?.Data?.AcctId ?? 0;

            var entity = new CallbackEntity
            {
                SharedSecret = GetSharedSecretFromHeaders(),
                RequestJson  = model.ToJson()
            };

            await _callbackStorage
            .Insert(cardholderId, entity, ct);

            return(NoContent());
        }
예제 #16
0
        public void approveFortellisActivationRequest(string accessToken, string connectionId, string status)
        {
            string          connectionCallbackURI    = String.Format("https://{0}/connections/{1}/callback", Configuration["Fortellis:ConnectionCallbackDomain"], connectionId);
            CallbackRequest fortellisCallbackRequest = new CallbackRequest(status);

            var http = new RestClient(connectionCallbackURI);
            var req  = new RestRequest(Method.POST)
                       .AddHeader("Authorization", $"Bearer {accessToken}")
                       .AddJsonBody(fortellisCallbackRequest);

            var res = http.Execute(req);

            if (res.StatusCode != HttpStatusCode.OK)
            {
                throw new Exception(res.Content.ToString());
            }
            Console.WriteLine("Connection activation successful.");
        }
        public SignedValues GetSignedValues(CallbackRequest request)
        {
            Ensure.ArgumentNotNull(request, nameof(request));

            var values = request.QueryString.Cast <string>()
                         .Where(name => name != SignatureFieldName)
                         .OrderBy(name => name)
                         .Select(name => request.QueryString[name])
                         .ToList();

            var signature = request.QueryString[SignatureFieldName];

            return(new SignedValues
            {
                Values = values,
                Signature = signature
            });
        }
예제 #18
0
        public async Task <ActionResult <string> > Callback([FromBody] CallbackRequest request)
        {
            // Run type specific logic
            switch (HttpContext.GetHeader("Twitch-Eventsub-Message-Type"))
            {
            case "webhook_callback_verification":
                return(Ok(request.Challenge));
            }

            // Is there an event to send?
            if (request.Event != null)
            {
                // Send event to client
                await _eventHub.Clients.User(request.Subscription.Condition.UserId).SendAsync(request.Subscription.Type, request.Event);
            }

            return(Ok());
        }
        public SignedValues GetSignedValues(CallbackRequest request)
        {
            Ensure.ArgumentNotNull(request, nameof(request));

            var values = request.QueryString.Cast<string>()
                .Where(name => name != SignatureFieldName)
                .OrderBy(name => name)
                .Select(name => request.QueryString[name])
                .ToList();

            var signature = request.QueryString[SignatureFieldName];

            return new SignedValues
                   {
                       Values = values,
                       Signature = signature
                   };
        }
예제 #20
0
        public async Task RegiisterCallBack(CallbackRequest request, EnumCollbackType collbackType)
        {
            switch (collbackType)
            {
            case EnumCollbackType.Payment:
                await _dbRepository.AddPaymentCallBack(request);

                break;

            case EnumCollbackType.Refund:
                await _dbRepository.AddRefundCallBack(request);

                break;

            default:
                break;
            }
        }
예제 #21
0
        public static ResultUrlRequest Parse(CallbackRequest callback)
        {
            Ensure.ArgumentNotNull(callback, nameof(callback));

            var resultUrl = new ResultUrlRequest();

            resultUrl.Uri = callback.Uri;

            resultUrl.OrderId = callback.GetOrDefault("pg_order_id", string.Empty);

            resultUrl.PaymentId    = callback.Get("pg_payment_id");
            resultUrl.Amount       = callback.Get <double>("pg_amount");
            resultUrl.Currency     = callback.Get <PlatronPaymentCurrency>("pg_currency");
            resultUrl.NetAmount    = callback.Get <double>("pg_net_amount");
            resultUrl.PsAmount     = callback.Get <double>("pg_ps_amount");
            resultUrl.PsFullAmount = callback.Get <double>("pg_ps_full_amount");
            resultUrl.PsCurrency   = callback.Get <PlatronPaymentCurrency>("pg_ps_currency");
            resultUrl.Overpayment  = callback.GetOrDefault <double>("pg_overpayment", 0);

            resultUrl.PaymentSystem = callback.Get("pg_payment_system");
            resultUrl.PaymentDate   = callback.GetDate("pg_payment_date");
            resultUrl.CanReject     = callback.GetOrDefault("pg_can_reject", PaymentRejectType.Unrevokable);

            if (callback.Contains("pg_card_brand"))
            {
                resultUrl.CardBrand = callback.GetOrDefault("pg_card_brand", string.Empty);
                resultUrl.CardPan   = callback.GetOrDefault("pg_card_pan", string.Empty);
                resultUrl.CardHash  = callback.GetOrDefault("pg_card_hash", string.Empty);
                resultUrl.AuthCode  = callback.GetOrDefault("pg_auth_code", string.Empty);
                resultUrl.Captured  = callback.GetOrDefault("pg_captured", CardClearingBehaviourType.WaitForPlatronWillSend);
            }

            resultUrl.UserPhone             = callback.GetOrDefault("pg_user_phone", string.Empty);
            resultUrl.NeedPhoneNotification = callback.GetBool("pg_need_phone_notification", x => x == "1");

            resultUrl.UserContactEmail      = callback.GetOrDefault("pg_user_contact_email", string.Empty);
            resultUrl.NeedEmailNotification = callback.GetBoolOrDefault("pg_need_email_notification", x => x == "1", false);

            resultUrl.RecurringProfileId         = callback.GetOrDefault("pg_recurring_profile_id", string.Empty);
            resultUrl.RecurringProfileExpiryDate = callback.GetDateOrDefault("pg_recurring_profile_expiry_date", DateTime.MinValue);

            return(resultUrl);
        }
예제 #22
0
        public async void Process_Should_Not_Clear_User_Data_If_ExchangeCode_Fails()
        {
            var userId          = Guid.NewGuid().ToString();
            var code            = Guid.NewGuid().ToString();
            var callbackRequest = new CallbackRequest
            {
                Code  = code,
                Scope = $"{Scope.accounts.ToString()} {Scope.offline_access.ToString()}"
            };

            _mockAuthorizationService
            .Setup(x => x.ExchangeCode(It.Is <AccountAccessContext>(context => context.Code == code && context.UserId == userId)))
            .ReturnsAsync(ServiceObjectResult <AccountAccessContext> .Failed(null, new List <string>()));

            var result = await _callbackService.Process(userId, callbackRequest);

            Assert.False(result.Success);
            _mockAuthorizationService.Verify(x => x.ExchangeCode(It.Is <AccountAccessContext>(context => context.Code == code && context.UserId == userId)), Times.Once);
            _mockUserDataCachingService.Verify(x => x.ClearUserData(It.IsAny <string>()), Times.Never);
        }
        public void UpdateCallbackSuccessfully()
        {
            var content = Files.ReadAllText("./Fixtures/callback_edit.json");

            var client = GetMockClient(content);
            var repo   = Get <ICallbackRepository>(client.Object);

            const string callbackId = "f92d4ca1-4ee5-43f3-9e34-ca5f759c5e76";
            var          callback   = new Callback
            {
                Id          = callbackId,
                ObjectType  = ObjectType.Accounts,
                Description = "Account Callback",
                Enabled     = true,
                Url         = "https://httpbin.org/put",
                CreatedAt   = DateTime.Now.AddDays(-2),
                UpdatedAt   = DateTime.Now.AddDays(-1),
                Links       = new CallbackLinks
                {
                    Self      = "",
                    Responses = ""
                }
            };

            var request = new CallbackRequest
            {
                ObjectType  = ObjectType.Users,
                Description = "Users Callback",
                Enabled     = true,
                Url         = ""
            };

            var updatedCallback = repo.UpdateCallbackAsync(callbackId, request).Result;

            Assert.NotNull(updatedCallback);
            Assert.Equal(callback.Id, updatedCallback.Id);
            Assert.Equal(updatedCallback.ObjectType, ObjectType.Users);
            Assert.Equal(updatedCallback.Description, "Users Callback");
            Assert.Equal(updatedCallback.Enabled, true);
            Assert.Equal(updatedCallback.Url, "https://httpbin.org/put");
        }
예제 #24
0
        public async void Process_Should_Call_ExchangeCode_With_New_AccessContext()
        {
            var userId          = Guid.NewGuid().ToString();
            var code            = Guid.NewGuid().ToString();
            var callbackRequest = new CallbackRequest
            {
                Code  = code,
                Scope = $"{Scope.accounts.ToString()} {Scope.offline_access.ToString()}"
            };

            _mockAuthorizationService
            .Setup(x => x.ExchangeCode(It.Is <AccountAccessContext>(context => context.Code == code && context.UserId == userId)))
            .ReturnsAsync(ServiceObjectResult <AccountAccessContext> .Succeeded(new AccountAccessContext
            {
                Code = code, UserId = userId
            }));

            var result = await _callbackService.Process(userId, callbackRequest);

            Assert.True(result.Success);
            _mockAuthorizationService.Verify(x => x.ExchangeCode(It.Is <AccountAccessContext>(context => context.Code == code && context.UserId == userId)), Times.Once);
        }
 private void TestSendCallBack(string id, string orderId)
 {
     using (SqlSugarClient db = new DBClient().GetClient())
     {
         var             account = db.Queryable <table_商户账号>().Where(it => it.商户ID == id).First();
         var             detail  = db.Queryable <table_商户明细提款>().Where(it => it.订单号 == orderId).First();
         CallbackRequest request = new CallbackRequest()
         {
             Username            = account.商户ID,
             Userpassword        = account.商户密码,
             OrderNumberSite     = detail.订单号,
             OrderNumberMerchant = detail.商户API订单号,
             OrderType           = detail.类型,
             OrderStatus         = detail.状态,
             OrderTimeCreation   = detail.时间创建.Value.ToString("yyyy-MM-dd HH:mm:ss"),
             OrderTimeEnd        = detail.时间完成.Value.ToString("yyyy-MM-dd HH:mm:ss"),
             OrderMoney          = detail.交易金额.Value.ToString()
         };
         try
         {
             int statusCode = 0;
             using (MD5 md5Hash = MD5.Create())
             {
                 // 商户ID + 商户API密码 + 当前unix时间 + 商户自定义订单号 + 生成订单号 + 类型 + 状态 + 公共密匙(公匙)
                 long   ts     = GetTimeStamp();
                 string unsign = request.Username + request.Userpassword + ts +
                                 request.OrderNumberMerchant + request.OrderNumberSite + request.OrderType + request.OrderStatus + account.公共密匙;
                 string sign     = GetMd5Hash(md5Hash, unsign);
                 string url      = $"{account.API回调}?timeunix={ts}&signature={sign}";
                 string response = PostResponse(url, JsonConvert.SerializeObject(request), out statusCode);
                 ShowMessage(response);
             }
         }
         catch (Exception e)
         {
             ShowMessage(e.Message);
         }
     }
 }
예제 #26
0
        public async Task <IActionResult> Index(CallbackRequest request)
        {
            _logger.LogDebug("Callback response", request);

            var client   = new HttpClient();
            var response = await client.RequestTokenAsync(new TokenRequest
            {
                Address   = "https://demo.identityserver.io/connect/token",
                GrantType = "custom",

                ClientId     = "client",
                ClientSecret = "secret",

                Parameters =
                {
                    { "custom_parameter", "custom value" },
                    { "scope",            "api1"         }
                }
            });

            return(View(request));
        }
        public void CreateCallbackSuccessfully()
        {
            var content = Files.ReadAllText("./Fixtures/callback_create.json");

            var client = GetMockClient(content);
            var repo   = Get <ICallbackRepository>(client.Object);

            var request = new CallbackRequest
            {
                ObjectType  = ObjectType.Users,
                Description = "Users Callback",
                Enabled     = true,
                Url         = "https://httpbin.org/post"
            };

            var response = repo.CreateCallbackAsync(request).Result;

            Assert.NotNull(response);
            Assert.Equal(request.ObjectType, response.ObjectType);
            Assert.Equal(request.Description, response.Description);
            Assert.Equal(request.Enabled, response.Enabled);
            Assert.Equal(request.Url, response.Url);
        }
예제 #28
0
        private string SendMessage(CallbackRequest callbackRequest)
        {
            var command   = callbackRequest.Object.Body;
            var toExecute = _commands.SingleOrDefault(pair => pair.Key.Equals(command.Trim().ToLower())).Value;

            if (toExecute == null)
            {
                if (command.Contains("tag"))
                {
                    var crutchCommand = _commands.SingleOrDefault(pair => pair.Key.Equals("tag")).Value;
                    callbackRequest.Object.Body = callbackRequest.Object.Body.Split(' ')[1];
                    crutchCommand(callbackRequest);
                }
                else
                {
                    SendCommandList(callbackRequest);
                }
            }
            else
            {
                toExecute(callbackRequest);
            }
            return("ok");
        }
예제 #29
0
        public HttpResponseMessage Post([FromBody] CallbackRequest request)
        {
            var response = new HttpResponseMessage(HttpStatusCode.OK);

            if (request.Type == EventType.Сonfirmation)
            {
                response.Content = new StringContent(
                    ConfigurationManager.ConnectionStrings["confirm-code"].ConnectionString,
                    System.Text.Encoding.UTF8, "text/plain");
            }

            if (request.Type == EventType.MessageNew)
            {
                var m = request.Object;
                Task.Run(() => Bot.NewMessage(m.PeerId, m.Text));

                response.Content = new StringContent(
                    "ok",
                    System.Text.Encoding.UTF8,
                    "text/plain");
            }

            return(response);
        }
예제 #30
0
        /// <summary>
        /// Called when an asynchronous read operation completes.
        /// </summary>
        private void OnReadComplete(IAsyncResult result)
        {
            AsyncReadTransaction transaction = null;
            
            lock (m_lock)
			{
                // complete the operation.
                DataValueCollection results = null;
                DiagnosticInfoCollection diagnosticInfos = null;
                
                int serviceError = ResultIds.S_OK;

                try
                {
                    m_session.EndRead(
                        result,
                        out results,
                        out diagnosticInfos);
                }
                catch (Exception)
                {
                    serviceError = ResultIds.E_FAIL;
                }                         

                try
                {
                    // check if transaction has been cancelled.
                    int cancelId = (int)result.AsyncState;

                    Transaction transaction2 = null;

                    if (!m_transactions.TryGetValue(cancelId, out transaction2))
                    {
                        return;
                    }

                    transaction = (AsyncReadTransaction)transaction2;
                    m_transactions.Remove(cancelId);                   
                    
                    // get callback object - nothing more to do if missing.
                    IOPCDataCallback callback = (IOPCDataCallback)GetCallback(typeof(IOPCDataCallback).GUID);

                    if (callback == null)
                    {
                        return;
                    }
     
                    // process results.
                    ReadValueIdCollection nodesToRead = transaction.NodesToRead;

                    List<CallbackValue> callbackValues = new List<CallbackValue>();

                    for (int ii = 0; ii < nodesToRead.Count; ii++)
                    {
                        // get item in originally read.
                        Item itemToRead = (Item)nodesToRead[ii].Handle;
                        
                        // process the read result.
                        object value = null;
                        short quality = Qualities.OPC_QUALITY_BAD;
                        DateTime timestamp = DateTime.MinValue;
                        int error = serviceError;

                        if (serviceError >= 0)
                        {
                            error = ProcessReadResult(
                                itemToRead.ServerHandle, 
                                itemToRead.ReqType, 
                                results[ii],
                                out value, 
                                out quality,
                                out timestamp);
                            
                            // update the cache.
                            UpdateCachedValue(itemToRead, results[ii]);
                        }

                        CallbackValue callbackValue = new CallbackValue();

                        callbackValue.ClientHandle = itemToRead.ClientHandle;
                        callbackValue.Value        = value;
                        callbackValue.Quality      = quality;
                        callbackValue.Timestamp    = timestamp;
                        callbackValue.Error        = error;

                        callbackValues.Add(callbackValue);
				    }

                    // queue the callback.
                    CallbackRequest request = new CallbackRequest();

                    request.CallbackType = (transaction.IsRefresh)?CallbackType.DataChange:CallbackType.Read;
                    request.Callback = callback;
                    request.TransactionId = transaction.TransactionId;
                    request.GroupHandle = m_clientHandle;
                    request.ServerHandle = m_serverHandle;
                    request.Values = callbackValues;

                    QueueCallbackRequest(request);
                }
                catch (Exception e)
                {
                    Utils.Trace(e, "Unexpected error processing asynchronous read callback.");
                }
			}
        }
예제 #31
0
        /// <summary>
        /// Called when an asynchronous write operation completes.
        /// </summary>
        private void OnWriteComplete(IAsyncResult result)
        {
            AsyncWriteTransaction transaction = null;
            
            lock (m_lock)
			{
                // complete the write operation.
                StatusCodeCollection results = null;
                DiagnosticInfoCollection diagnosticInfos = null;
                
                int serviceError = ResultIds.S_OK;

                try
                {
                    m_session.EndWrite(
                        result,
                        out results,
                        out diagnosticInfos);
                }
                catch (Exception)
                {
                    serviceError = ResultIds.E_FAIL;
                }                         

                try
                {
                    // check if transaction has been cancelled.
                    int cancelId = (int)result.AsyncState;

                    Transaction transaction2 = null;

                    if (!m_transactions.TryGetValue(cancelId, out transaction2))
                    {
                        return;
                    }

                    transaction = (AsyncWriteTransaction)transaction2;
                    m_transactions.Remove(cancelId);                   
                    
                    // get callback object - nothing more to do if missing.
                    IOPCDataCallback callback = (IOPCDataCallback)GetCallback(typeof(IOPCDataCallback).GUID);

                    if (callback == null)
                    {
                        return;
                    }
     
                    // process results.
                    WriteValueCollection valuesToWrite = transaction.ValuesToWrite;
                    
                    List<CallbackValue> callbackValues = new List<CallbackValue>();

                    for (int ii = 0; ii < valuesToWrite.Count; ii++)
                    {
                        // get item originally written.
                        Item itemToWrite = (Item)valuesToWrite[ii].Handle;
                        
                        int error = serviceError;
                        
                        // get for operation level error.
                        if (serviceError >= 0)
                        {
                            error = Server.MapWriteStatusToErrorCode(results[ii]);
                        }

                        CallbackValue callbackValue = new CallbackValue();

                        callbackValue.ClientHandle = itemToWrite.ClientHandle;
                        callbackValue.Error        = error;

                        callbackValues.Add(callbackValue);
				    }

                    // queue the callback.
                    CallbackRequest request = new CallbackRequest();

                    request.CallbackType = CallbackType.Write;
                    request.Callback = callback;
                    request.TransactionId = transaction.TransactionId;
                    request.GroupHandle = m_clientHandle;
                    request.ServerHandle = m_serverHandle;
                    request.Values = callbackValues;

                    QueueCallbackRequest(request);
                }
                catch (Exception e)
                {
                    Utils.Trace(e, "Unexpected error processing asynchronous write callback.");
                }
			}
        }
예제 #32
0
		/// <summary>
        /// IOPCAsyncIO2::Cancel2 - Request that the server cancel an outstanding transaction.
		/// </summary>
		public void Cancel2(int dwCancelID)
		{
			lock (m_lock)
			{
				if (m_subscription == null) throw ComUtils.CreateComException(ResultIds.E_FAIL);
				
                // get callback object - error if missing.
                IOPCDataCallback callback = (IOPCDataCallback)GetCallback(typeof(IOPCDataCallback).GUID);

                if (callback == null)
                {
					throw ComUtils.CreateComException(ResultIds.CONNECT_E_NOCONNECTION);
                }

				try
				{
                    // see if transaction has already completed.
                    Transaction transaction = null;

                    if (!m_transactions.TryGetValue(dwCancelID, out transaction))
                    {
					    throw ComUtils.CreateComException(ResultIds.E_FAIL);
                    }

                    // remove transaction - results will be discarded.
                    m_transactions.Remove(dwCancelID);
                                                        
                    // Utils.Trace(
                    //     "AsyncCancel: GroupHandle={0}, CancelID={1}", 
                    //     m_clientHandle,
                    //     dwCancelID);

                    // queue the callback.
                    CallbackRequest request = new CallbackRequest();

                    request.CallbackType = CallbackType.Cancel;
                    request.Callback = callback;
                    request.TransactionId = transaction.TransactionId;
                    request.GroupHandle = m_clientHandle;
                    request.ServerHandle = m_serverHandle;

                    QueueCallbackRequest(request);
				}
				catch (Exception e)
				{
					throw ComUtils.CreateComException(e);
				}
			}
		}
예제 #33
0
 public IActionResult PostPayment(CallbackRequest data)
 {
     return(Ok());
 }
예제 #34
0
        /// <summary>
        /// Queues a callback request. Assigns a worker thread if one is not already assigned.
        /// </summary>
        private void QueueCallbackRequest(CallbackRequest callback)
        {
            lock (m_callbacks)
            {
                if (m_callbacks.Count == 0)
                {
                    ThreadPool.QueueUserWorkItem(OnCallback);
                }

                m_callbacks.Enqueue(callback);
            }     
        }
예제 #35
0
        /// <summary>
        /// Sends a read or datachange callback to the client.
        /// </summary>
        private void SendReadCallback(CallbackRequest callback)
        {      
            int count = callback.Values.Count;

            int masterError = ResultIds.S_OK;
            int masterQuality = ResultIds.S_OK;

            int[] clientHandles = new int[count];
            object[] values = new object[count];
            short[] qualities = new short[count];
            System.Runtime.InteropServices.ComTypes.FILETIME[] timestamps = new System.Runtime.InteropServices.ComTypes.FILETIME[count];
            int[] errors = new int[count];

            for (int ii = 0; ii < callback.Values.Count; ii++)
            {
                CallbackValue change = callback.Values[ii];
                
                clientHandles[ii] = change.ClientHandle;
                values[ii]        = change.Value;   
                qualities[ii]     = change.Quality;
                timestamps[ii]    = ComUtils.GetFILETIME(change.Timestamp);
                errors[ii]        = change.Error;

                // check error.
                if (change.Error < 0)
                {             
                    masterError = ResultIds.S_FALSE;
                    continue;
                }                           

                // set the master quality if any bad qualities are found.
                if ((change.Quality & Qualities.OPC_QUALITY_GOOD) != Qualities.OPC_QUALITY_GOOD)
                {
                    masterQuality = ResultIds.S_FALSE; 
                }
	        }
                 
            //Utils.Trace(
            //    "DataChange: GroupHandle={0}, Count={1}, ServerHandle={2}, Value={3}", 
            //   callback.ServerHandle,
            //    callback.Values.Count,
            //    callback.Values[0].ServerHandle,
            //    callback.Values[0].Value);

            if (callback.CallbackType == CallbackType.DataChange)
            {   
                callback.Callback.OnDataChange(
                    callback.TransactionId,
                    callback.GroupHandle,
                    masterQuality,
                    masterError,
                    count,
                    clientHandles,
                    values,
                    qualities,
                    timestamps,
                    errors);

                m_server.SetLastUpdate();
            }
            else
            {                
                callback.Callback.OnReadComplete(
                    callback.TransactionId,
                    callback.GroupHandle,
                    masterQuality,
                    masterError,
                    count,
                    clientHandles,
                    values,
                    qualities,
                    timestamps,
                    errors);
            }
        }
예제 #36
0
        /// <summary>
        /// Sends a write callback to the client.
        /// </summary>
        private void SendWriteCallback(CallbackRequest callback)
        {      
            int count = callback.Values.Count;

            int masterError = ResultIds.S_OK;

            int[] clientHandles = new int[count];
            int[] errors = new int[count];

            for (int ii = 0; ii < callback.Values.Count; ii++)
            {
                CallbackValue result = callback.Values[ii];
                
                clientHandles[ii] = result.ClientHandle;
                errors[ii] = result.Error;

                if (result.Error < 0)
                {             
                    masterError = ResultIds.S_FALSE;
                }
	        }
            
            // Utils.Trace(
            //    "WriteComplete: GroupHandle={0}, ServerHandle={1}, Error={2}", 
            //    callback.GroupHandle,
            //    callback.Values[0].ClientHandle,
            //    callback.Values[0].Error);

            callback.Callback.OnWriteComplete(
                callback.TransactionId,
                callback.GroupHandle,
                masterError,
                count,
                clientHandles,
                errors);
        }
예제 #37
0
        /// <summary>
        /// Sends a cancel callback to the client.
        /// </summary>
        private void SendCancelCallback(CallbackRequest callback)
        {                
            // Utils.Trace(
            //     "CancelComplete: GroupHandle={0}, TransactionId={1}", 
            //     callback.GroupHandle,
            //     callback.TransactionId);

            callback.Callback.OnCancelComplete(callback.TransactionId, callback.GroupHandle);
        }
예제 #38
0
        public string Handle(CallbackRequest callbackRequest)
        {
            var execute = _methods.SingleOrDefault(pair => pair.Key.Equals(callbackRequest.Type)).Value;

            return(execute(callbackRequest));
        }
예제 #39
0
        /// <summary>
        /// IOPCAsyncIO3::WriteVQT - Writes one or more values, qualities and timestamps for the items specified. 
        ///                          The results are returned via the client�s IOPCDataCallback connection established 
        ///                          through the server�s IConnectionPointContainer.
        /// </summary>
		public void WriteVQT(
            int dwCount, 
            int[] phServer, 
            OPCITEMVQT[] pItemVQT, 
            int dwTransactionID, 
            out int pdwCancelID, 
            out System.IntPtr ppErrors)
		{
            pdwCancelID = 0;

			// validate arguments.
			if (dwCount == 0 || phServer == null || pItemVQT == null || dwCount != phServer.Length || dwCount != pItemVQT.Length)
			{
				throw ComUtils.CreateComException(ResultIds.E_INVALIDARG);
			}
			
            // get callback object - nothing more to do if missing.
            IOPCDataCallback callback = (IOPCDataCallback)GetCallback(typeof(IOPCDataCallback).GUID);

            if (callback == null)
            {
		        throw ComUtils.CreateComException(ResultIds.CONNECT_E_NOCONNECTION);
            }
            
			try
			{ 
                int[] errors = new int[dwCount];
                
                // build list of values to write.
                WriteValueCollection valuesToWrite = new WriteValueCollection();
                
		        lock (m_lock)
		        {
				    if (m_subscription == null) throw ComUtils.CreateComException(ResultIds.E_FAIL);
                    
                    CallbackValue[] conversionErrors = null;

                    for (int ii = 0; ii < dwCount; ii++)
                    {
                        Item itemToWrite = null;

                        if (!m_items.TryGetValue(phServer[ii], out itemToWrite))
                        {
                            errors[ii] = ResultIds.E_INVALIDHANDLE;
                            continue;
                        }

                        VariableNode variable = itemToWrite.Variable;

                        WriteValue valueToWrite = new WriteValue();

                        valueToWrite.NodeId      = variable.NodeId;
                        valueToWrite.IndexRange  = null;
                        valueToWrite.AttributeId = Attributes.Value;

                        DataValue value = new DataValue();
                        
                        int error = 0;
                        value.Value = m_server.VariantValueToValue(variable, pItemVQT[ii].vDataValue, out error);

                        if (error != ResultIds.S_OK)
                        {
                            // only allocate this array when it is needed.
                            if (conversionErrors == null)
                            {
                                conversionErrors = new CallbackValue[dwCount];
                            }

                            // create the callback item.
                            CallbackValue conversionError = new CallbackValue();

                            conversionError.ClientHandle = itemToWrite.ClientHandle;
                            conversionError.Error = error;

                            conversionErrors[ii] = conversionError;

                            errors[ii] = error;
                            continue;
                        }

                        valueToWrite.Value = value;
                        
                        if (pItemVQT[ii].bQualitySpecified != 0)
                        {
                            value.StatusCode = ComUtils.GetQualityCode(pItemVQT[ii].wQuality);
                        }
                        
                        if (pItemVQT[ii].bTimeStampSpecified != 0)
                        {
                            value.SourceTimestamp = ComUtils.GetDateTime(pItemVQT[ii].ftTimeStamp);
                        }

                        // needed to correlate results to input.
                        valueToWrite.Handle = itemToWrite;
                        
                        valuesToWrite.Add(valueToWrite);
                    }
                    
                    // create transaction.
                    if (valuesToWrite.Count > 0 || conversionErrors != null)
                    {
                        pdwCancelID = Utils.IncrementIdentifier(ref m_nextHandle);
                        m_transactions[pdwCancelID] = new AsyncWriteTransaction(dwTransactionID, valuesToWrite);
                    }
                    
                    // send conversion errors in the callback if no valid items available (CTT bug workaround).
                    if (valuesToWrite.Count == 0 && conversionErrors != null)
                    {   
                        // must return S_OK from this function if sending the errors in the callback.
                        List<CallbackValue> errorsToSend = new List<CallbackValue>();
             
                        for (int ii = 0; ii < conversionErrors.Length; ii++)
                        {
                            if (conversionErrors[ii] != null)
                            {
                                errors[ii] = ResultIds.S_OK;
                                errorsToSend.Add(conversionErrors[ii]);
                            }
                        }

                        // queue the request.
                        CallbackRequest request = new CallbackRequest();

                        request.CallbackType = CallbackType.Write;
                        request.Callback = callback;
                        request.TransactionId = dwTransactionID;
                        request.GroupHandle = m_clientHandle;
                        request.ServerHandle = m_serverHandle;
                        request.Values = errorsToSend;

                        QueueCallbackRequest(request);
                    }
				}
                   
                // write values from server.                    
                if (valuesToWrite.Count > 0)
                {
                    m_session.BeginWrite(
                        null,
                        valuesToWrite,
                        new AsyncCallback(OnWriteComplete),
                        pdwCancelID);
                }
                
                // marshal error codes.
                ppErrors = ComUtils.GetInt32s(errors); 
			}
			catch (Exception e)
			{
                Utils.Trace(e, "Error writing items.");
				throw ComUtils.CreateComException(e);
			}
		}
 public Task <ServiceResult> Process(string userId, CallbackRequest callbackData)
 {
     return(Task.FromResult(GenerateResponse(userId)));
 }
        /// <summary>
        /// Requests that the following action be completed as soon as reasonably possible. 
        /// This will either be done immediately, or be queued for the next approriate time.
        /// </summary>
        /// <param name="callback">action to perform</param>
        /// <returns>
        /// A cancelation object. Use in a using block.
        /// </returns>
        public CallbackRequest RequestCallback(Action callback)
        {
            CallbackRequest request = new CallbackRequest(callback);

            lock (m_syncRoot)
            {
                m_isRequestCallbackMethodProcessing = true;
                Thread.MemoryBarrier();
                //------------------------------------------
                if (m_isSafeToCallback)
                {
                    request.Run();
                }
                else
                {
                    m_isCallbackWaiting = true;
                    m_pendingCallbacks.Add(request);
                }
                //-----------------------------------------
                Thread.MemoryBarrier();
                m_isRequestCallbackMethodProcessing = false;
            }

            return request;
        }
예제 #42
0
        /// <summary>
        /// Queues a datachange.
        /// </summary>
        private void QueueDataChange(bool sendAll)
        {
            // dequeue values from monitored item caches.
            List<CallbackValue> changes = new List<CallbackValue>();
    
            foreach (Item item in this.m_items.Values)
            {
                IList<DataValue> values = item.MonitoredItem.DequeueValues();

                // send the cached value if an update must be sent.
                if (sendAll && values.Count == 0)
                {
                    values = new DataValue[1];

                    // look of value in the publishing cache.
                    DataValue dataValue = ReadCachedValue(item, Int32.MaxValue);

                    // create a dummy value if nothing in the cache.
                    if (dataValue == null)
                    {
                        dataValue = new DataValue();
                        dataValue.ServerTimestamp = DateTime.UtcNow;
                        dataValue.StatusCode = StatusCodes.BadWaitingForInitialData;
                    }

                    values[0] = dataValue;
                }
                
                //Utils.Trace(
                //    "Values Found: Group={0}, Changes={1}",
                //    m_clientHandle,
                //    values.Count);

                for (int ii = 0; ii < values.Count; ii++)
                {
                    // apply any type conversions.
                    object value;
                    short quality;
                    DateTime timestamp;
                    
                    int error = ProcessReadResult(
                        item.ServerHandle, 
                        item.ReqType, 
                        values[ii],
                        out value, 
                        out quality,
                        out timestamp);

                    item.LastValueSent = value;
                    item.LastQualitySent = quality;
                    item.LastTimestampSent = timestamp;

                    // update value in cache.
                    UpdateCachedValue(item, values[ii]);

                    // create callback value for active items
                    if (item.Active && m_active && m_enabled)
                    {
                        CallbackValue change = new CallbackValue();

                        change.ServerHandle = item.ServerHandle;
                        change.ClientHandle = item.ClientHandle;
                        change.Value        = value;
                        change.Quality      = quality;
                        change.Timestamp    = timestamp;
                        change.Error        = error;

                        changes.Add(change);
                    }
                }
            }

            // get callback object - do nothing if missing.
            IOPCDataCallback callback = (IOPCDataCallback)GetCallback(typeof(IOPCDataCallback).GUID);

            if (callback == null)
            {
                return;
            }
            
            // check if there are changes to send.
            if (changes.Count > 0)
            {                   
                CallbackRequest request = new CallbackRequest();

                request.CallbackType = CallbackType.DataChange;
                request.Callback = callback;
                request.GroupHandle = m_clientHandle;
                request.ServerHandle = m_serverHandle;
                request.Values = changes;

                //Utils.Trace(
                //    "Callback Queued: Group={0}, Changes={1}, Value[0]={2}",
                //    m_clientHandle,
                //    changes.Count,
                //    changes[0].Value);
                
                QueueCallbackRequest(request);
            }
        }
예제 #43
0
        public static ResultUrlRequest Parse(CallbackRequest callback)
        {
            Ensure.ArgumentNotNull(callback, nameof(callback));

            var resultUrl = new ResultUrlRequest();

            resultUrl.Uri = callback.Uri;

            resultUrl.OrderId = callback.GetOrDefault("pg_order_id", string.Empty);

            resultUrl.PaymentId = callback.Get("pg_payment_id");
            resultUrl.Amount = callback.Get<double>("pg_amount");
            resultUrl.Currency = callback.Get<PlatronPaymentCurrency>("pg_currency");
            resultUrl.NetAmount = callback.Get<double>("pg_net_amount");
            resultUrl.PsAmount = callback.Get<double>("pg_ps_amount");
            resultUrl.PsFullAmount = callback.Get<double>("pg_ps_full_amount");
            resultUrl.PsCurrency = callback.Get<PlatronPaymentCurrency>("pg_ps_currency");
            resultUrl.Overpayment = callback.GetOrDefault<double>("pg_overpayment", 0);

            resultUrl.PaymentSystem = callback.Get("pg_payment_system");
            resultUrl.PaymentDate = callback.GetDate("pg_payment_date");
            resultUrl.CanReject = callback.GetOrDefault("pg_can_reject", PaymentRejectType.Unrevokable);

            if (callback.Contains("pg_card_brand"))
            {
                resultUrl.CardBrand = callback.GetOrDefault("pg_card_brand", string.Empty);
                resultUrl.CardPan = callback.GetOrDefault("pg_card_pan", string.Empty);
                resultUrl.CardHash = callback.GetOrDefault("pg_card_hash", string.Empty);
                resultUrl.AuthCode = callback.GetOrDefault("pg_auth_code", string.Empty);
                resultUrl.Captured = callback.GetOrDefault("pg_captured", CardClearingBehaviourType.WaitForPlatronWillSend);
            }

            resultUrl.UserPhone = callback.GetOrDefault("pg_user_phone", string.Empty);
            resultUrl.NeedPhoneNotification = callback.GetBool("pg_need_phone_notification", x => x == "1");

            resultUrl.UserContactEmail = callback.GetOrDefault("pg_user_contact_email", string.Empty);
            resultUrl.NeedEmailNotification = callback.GetBoolOrDefault("pg_need_email_notification", x => x == "1", false);

            resultUrl.RecurringProfileId = callback.GetOrDefault("pg_recurring_profile_id", string.Empty);
            resultUrl.RecurringProfileExpiryDate = callback.GetDateOrDefault("pg_recurring_profile_expiry_date", DateTime.MinValue);

            return resultUrl;
        }