private async Task <bool> CreatePayment(PaymentRequest request, ResponseData <PaymentDoc> response, SqlConnection conn, SqlTransaction tx) { Share.Payment payment = new Share.Payment(); payment.Id = 0; payment.Status = Share.PaymentStatus.Accounted; //payment.DocumentName = response.Response.Id; //payment.DocumentNumber = response.Response.Id; //payment.DocumentDate = DateTime.ParseExact(response.Response.CapturedAt, "O", CultureInfo.InvariantCulture).Date; payment.ExternalId = response.Response.Id; payment.DataSource = "YDXKAS"; payment.Provider = "YKSBER"; payment.OriginalAmount = request.Amount; payment.ReceivedAmount = decimal.Floor(request.Amount * 96M) / 100M; payment.PaymentDateTime = request.CreateDateTime; payment.IsTimeSpecified = true; payment.ArrivalDateTime = DateTime.Now; payment.Fio = ""; payment.Address = ""; payment.Purpose = response.Response.Description; payment.PlaceId = request.Place.Id; payment.EmployeeId = request.EmployeeId; payment.RawData = response.ResponseJson; bool result = await this._shareService.ProceedPayment(payment, conn, tx); if (result) { request.PaymentId = payment.Id; } return(result); }
private async Task <(CreatePaymentResult, Share.Payment, Exception)> CreatePayment(PaymentRequest request, SqlConnection conn, SqlTransaction tx) { Share.Payment payment = new Share.Payment(); try { payment.Id = 0; payment.Status = Share.PaymentStatus.Approved; //payment.DocumentName = response.Response.Id; //payment.DocumentNumber = response.Response.Id; //payment.DocumentDate = DateTime.ParseExact(response.Response.CapturedAt, "O", CultureInfo.InvariantCulture).Date; payment.ExternalId = request.OrderId; payment.DataSource = "SBBACQ"; payment.Provider = request.PaymentProvider; payment.OriginalAmount = request.Amount; payment.ReceivedAmount = decimal.Floor(request.Amount * 98M) / 100M; payment.PaymentDateTime = request.CreateDateTime; payment.IsTimeSpecified = true; payment.ArrivalDateTime = DateTime.Now; payment.Fio = ""; payment.Address = ""; payment.Purpose = ""; payment.PlaceId = request.PlaceId; payment.EmployeeId = request.EmployeeId; payment.RawData = JsonConvert.SerializeObject(request); if (await this._shareService.ProceedPayment(payment, conn, tx)) { request.PaymentId = payment.Id; return(CreatePaymentResult.Success, payment, null); } else { return(CreatePaymentResult.Duplicate, payment, null); } } catch (Exception ex) { string exStr = ex.ToString(); _logger.LogError(exStr); Helper.SaveDiagMessage(_sqlServer, DiagOptions.Tech, "SbAcquiringHostedService.CreatePayment: " + exStr, _logger); return(CreatePaymentResult.Fail, payment, ex); } }
private async Task ProcessRequest(PaymentRequest request, SqlConnection conn) { CreatePaymentResult result; Share.Payment payment = null; Exception exception = null; using (SqlTransaction tx = conn.BeginTransaction()) { (result, payment, exception) = await this.CreatePayment(request, conn, tx); if (result == CreatePaymentResult.Success) { await CompleteRequest(request, conn, tx); } else if (result == CreatePaymentResult.Fail) { await FailedToCompleteRequest(request, conn, tx); } tx.Commit(); } DiagOptions o = DiagOptions.Tech; string message; if (result == CreatePaymentResult.Success) { o = DiagOptions.Tech | DiagOptions.Biz; message = "SbAcq: Платёж " + payment.Id.ToString() + (payment.Status == Share.PaymentStatus.Approved ? " успешно проведён" : " ожидает подтверждения") + ": " + payment.RawData; } else if (result == CreatePaymentResult.Duplicate) { message = "SbAcq: Платёж уже обработан: " + payment.RawData; } else { message = "SbAcq: Ошибка \"" + exception.Message + "\" при проведении платежа: " + payment.RawData; } Helper.SaveDiagMessage(_sqlServer, o, message, _logger); }