/* * Сценарий обработки: * клиент -> /sign * бот <- "введите текст для подписи" [флаг = ожидаю текст] * клиент -> {текст} * бот <- "защифрованное сообщение" [флаг = текст принял] * * */ public async Task ExecuteAsync(CommandArgs args) { //обработка флагов состояний if (args.CommandText == string.Empty) { signStateFlag[args.FromId] = SignState.SendCommand; Logger.Information($"Received command /sign from user {args.FromName}"); } else if (signStateFlag.TryGetValue(args.FromId, out var state)) { if (state == SignState.WaitText) { signStateFlag[args.FromId] = SignState.SendText; Logger.Information($"Received text for sign from user {args.FromName}"); } } else { await Bot.SendTextMessageAsync(args.ChatId, $"Неизвестная команда.{Environment.NewLine}Для справки используй /help"); return; } switch (signStateFlag[args.FromId]) { //прислали /sign case SignState.SendCommand: await Bot.SendTextMessageAsync(args.ChatId, $"Введи строку для генерации подписи"); Logger.Information($"Send to {args.FromName} message to WaitText"); signStateFlag[args.FromId] = SignState.WaitText; break; //прислали строку для подписи case SignState.SendText: //await Bot.SendTextMessageAsync(args.ChatId, args.CommandText.GetHashCode().ToString()); await Bot.SendTextMessageAsync(args.ChatId, SignHash.CkassaMD5(args.CommandText.ToString())); Logger.Information($"Send to {args.FromName} sign text"); signStateFlag.Remove(args.FromId); break; } }
public ActionResult SignFile(HttpPostedFileBase file) { if (file == null) { return(RedirectToAction("Index", new { mesg = $"Chọn tệp cần ký để tiếp tục" })); } var accessToken = Session["access_token"] as string; if (string.IsNullOrEmpty(accessToken)) { return(RedirectToAction("Index", new { mesg = $"Get access_token để tiếp tục" })); } #region Bước 1: Lấy danh sách chữ ký số trên hệ thống VNPT Ký số var userCert = _getAccoutCert(accessToken); if (userCert == null) { return(RedirectToAction("Index", new { mesg = $"Lỗi: {GetLastError()}" })); } // TODO: Bổ sung chức năng chọn chữ ký số cho người dùng string certID = userCert.ID; #endregion #region Bước 2: Lấy thông tin thanh toán giao dịch var servicePack = _getAccoutServicePack(accessToken); if (servicePack == null) { return(RedirectToAction("Index", new { mesg = $"Lỗi: {GetLastError()}" })); } string servicePackID = servicePack.ID; #endregion #region Đọc dữ liệu cần ký file upload Filetype fileType = null; byte[] unsignData; string signedFile = ""; using (Stream inputStream = file.InputStream) { try { if (!(inputStream is MemoryStream memoryStream)) { memoryStream = new MemoryStream(); inputStream.CopyTo(memoryStream); } unsignData = memoryStream.ToArray(); fileType = GetFileType(unsignData, file); if (fileType == null) { return(RedirectToAction("Index", new { mesg = "Định dạng chưa được hỗ trợ" })); } signedFile = file.FileName.Replace($".{fileType.Extension}", $"_signed.{fileType.Extension}"); } catch (Exception ex) { return(RedirectToAction("Index", new { mesg = $"Không thể phân tích dữ liệu cần ký: {ex.Message}" })); } } #endregion #region Bước 4: Ký dữ liệu byte[] signedBytes = null; switch (fileType.Extension) { case "pdf": signedBytes = SignHash.SignHashPdf(unsignData, servicePackID, certID, _parseCert(userCert.CertBase64), accessToken); break; case "xml": signedBytes = SignHash.SignHashXml(unsignData, servicePackID, certID, _parseCert(userCert.CertBase64), accessToken); break; case "docx": case "xlsx": case "pptx": signedBytes = SignHash.SignHashOffice(unsignData, servicePackID, certID, _parseCert(userCert.CertBase64), accessToken); break; } if (signedBytes == null) { return(RedirectToAction("Index", new { mesg = $"Lỗi ký số: {GetLastError()}" })); } #endregion return(File(signedBytes, System.Net.Mime.MediaTypeNames.Application.Octet, signedFile)); }