private async void DoWork(object state) { if (sessionId != null) { var url = apiClient.BaseAddress + $"sessions/{sessionId}/transaction"; apiClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); apiClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token); try { var response = await apiClient.GetAsync(url); if (response != null && response.IsSuccessStatusCode) { var apiResponse = await response.Content.ReadAsAsync <ApiResponse <EFTTransactionResponse> >(); if (apiResponse?.Response != null) { transaction = apiResponse.Response; } } } catch { } } else { await StopAsync((CancellationToken)state); } }
// async void PurchaseToken_Click() // NOT WORKING DELETE // { // // Get an auth token // await RefreshTokenAsync(); // // ShowNotification("TRANSACTION IN PROGRESS", "", "CHECK PIN PAD FOR STATUS", NotificationType.Normal, false); // // // TxnType is required // string txnType = GetTxnType().ToString(); // // Set ReferenceNumber to something unique // string txnRef = DateTime.Now.ToString("YYMMddHHmmssfff"); // // Set AmountCash for cash out, and AmountPurchase for purchase/refund // int amtPurchase = (txnType == "C") ? 0 : (int)(decimal.Parse(txtAmount.Text) * 100); // int amtCash = (txnType == "C") ? (int)(decimal.Parse(txtAmount.Text) * 100) : 0; // // var requestContent = new { Request = new { txnType, amtPurchase, amtCash, txnRef } }; // var currentSessionId = Guid.NewGuid().ToString(); // // // var request = new HttpRequestMessage(HttpMethod.Post, $"{basePosApiUri}/sessions/{currentSessionId}/transaction?async=false") // { // Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestContent), System.Text.Encoding.UTF8, "application/json") // }; // request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token); // HttpResponseMessage httpResponse = await client.SendAsync(request); // httpResponse.EnsureSuccessStatusCode(); // // var apiResponse = Newtonsoft.Json.JsonConvert.DeserializeObject<ApiResponse<TransactionResponse>>(await httpResponse.Content.ReadAsStringAsync()); // var r = apiResponse.Response; // // HideDialog(); // // ShowNotification( // $"TRANSACTION {(r.Success ? "OK" : "FAILED")}", // $"{r.ResponseCode} {r.ResponseText}", // "", // r.Success ? NotificationType.Success : NotificationType.Error, // true // ); // } #region PC-EFTPOS EVENTS void OnTransaction(EFTTransactionResponse r) { HideDialog(); ShowNotification( $"TRANSACTION {(r.Success ? "OK" : "FAILED")}", $"{r.ResponseCode} {r.ResponseText}", "", r.Success ? NotificationType.Success : NotificationType.Error, true ); }
public Task StopAsync(CancellationToken cancellationToken) { if (transaction == null) { transaction = new EFTTransactionResponse() { Success = false }; } timer?.Change(Timeout.Infinite, 0); return(Task.CompletedTask); }
public async Task <ActionResult <EFTTransactionResponse> > PostTransactionAsync([FromBody] float amount) { var sessionId = Guid.NewGuid(); var url = appSettings.Server + $"sessions/{sessionId}/transaction"; var request = new ApiRequest <EFTTransactionRequest>() { Request = new EFTTransactionRequest() { TxnType = "P", TxnRef = RandomStr.RandomString(TRX_RND_STR_LENGTH), AmtPurchase = Convert.ToInt32(amount * DOLLAR_TO_CENT), Merchant = appSettings.Merchant, Application = appSettings.Application }, Notification = new Notification { Uri = appSettings.NotificationUri } }; if (string.IsNullOrEmpty(token)) { token = (await GetTokenAsync())?.Token; } apiClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); apiClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token); HttpContent content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json"); try { var response = await apiClient.PostAsync(url, content); if (response != null && response.IsSuccessStatusCode) { var apiResponse = await response.Content.ReadAsAsync <ApiResponse <EFTTransactionResponse> >(); if (apiResponse != null && apiResponse.Response != null) { return(apiResponse.Response); } } } catch { using (var s = new TimedHostedService(sessionId, apiClient, token)) { using (var cts = new CancellationTokenSource(TRX_EXPIRATION_MINS)) { await s.StartAsync(cts.Token); EFTTransactionResponse txn = null; while (txn == null) { txn = s.GetTransaction(); await Task.Delay(WAIT_PERIOD_SEC); if (cts.IsCancellationRequested) { await s.StopAsync(cts.Token); } } await s.StopAsync(cts.Token); if (txn == null || !txn.Success) { return(BadRequest()); } return(txn); } } } return(BadRequest()); }
public async Task <ActionResult <EFTTransactionResponse> > PostTransactionAsync([FromBody] TransactionRequest transaction) { if (transaction == null || transaction.Amount <= 0 || string.IsNullOrEmpty(transaction.TxnType)) { return(BadRequest()); } var sessionId = Guid.NewGuid(); var url = appSettings.Server + $"sessions/{sessionId}/transaction"; var request = new ApiRequest <EFTTransactionRequest>(); var application = "00"; if (!string.IsNullOrEmpty(transaction.Merchant) && transaction.Merchant != "00") { application = "02"; } request.Request = new EFTTransactionRequest() { TxnType = string.IsNullOrEmpty(transaction.TxnType) ? "P" : transaction.TxnType, ReceiptAutoPrint = "0", TxnRef = RandomStr.RandomString(TRX_RND_STR_LENGTH), AmtPurchase = Convert.ToInt32(transaction.Amount * DOLLAR_TO_CENT), Merchant = string.IsNullOrEmpty(transaction.Merchant) ? appSettings.Merchant : transaction.Merchant, Application = application }; request.Notification = new Notification { Uri = appSettings.NotificationUri }; // if refund if (string.Equals(transaction.TxnType, "R")) { int.TryParse(transaction.Merchant, out int merchant); if (merchant > 0) // Means the refund is going through TPP extension { if (!string.IsNullOrEmpty(transaction.RefundReference)) { dynamic purchaseData = new Newtonsoft.Json.Linq.JObject(); purchaseData.REF = transaction.RefundReference; request.Request.PurchaseAnalysisData = purchaseData; } else { return(BadRequest()); } } } if (string.IsNullOrEmpty(token)) { token = (await GetTokenAsync())?.Token; } if (string.IsNullOrEmpty(token)) { return(Unauthorized()); } apiClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); apiClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token); HttpContent content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json"); try { var response = await apiClient.PostAsync(url, content); if (response.IsSuccessStatusCode) { var apiResponse = await response.Content.ReadAsAsync <ApiResponse <EFTTransactionResponse> >(); if (apiResponse?.Response != null) { return(apiResponse.Response); } } } catch { //Start timer for background service using (var s = new TimedHostedService(sessionId, apiClient, token)) { using (var cts = new CancellationTokenSource(TimeSpan.FromMinutes(3))) { await s.StartAsync(cts.Token); EFTTransactionResponse txn = null; while (txn == null) { txn = s.GetTransaction(); await Task.Delay(TimeSpan.FromSeconds(WAIT_PERIOD_SEC)); if (cts.IsCancellationRequested) { await s.StopAsync(cts.Token); } } await s.StopAsync(cts.Token); if (txn == null || !txn.Success) { return(BadRequest()); } return(txn); } } } return(BadRequest()); }