| | |
| | | using MES.Service.Models; |
| | | using Microsoft.IdentityModel.Tokens; |
| | | using NewPdaSqlServer.Controllers; |
| | | using NewPdaSqlServer.DB; |
| | | using NewPdaSqlServer.Dto.service; |
| | | using NewPdaSqlServer.entity; |
| | | using NewPdaSqlServer.util; |
| | | using Newtonsoft.Json; |
| | | using SqlSugar; |
| | | using System.Net; |
| | | using System.Net; |
| | | using System.Security.Cryptography; |
| | | using System.Text; |
| | | using static Azure.Core.HttpHeader; |
| | | using System.Security.Cryptography; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Net.Security; |
| | | using System.Security.Cryptography.X509Certificates; |
| | | using NewPdaSqlServer.DB; |
| | | using Newtonsoft.Json; |
| | | using Org.BouncyCastle.Crypto.Parameters; |
| | | using Org.BouncyCastle.Security; |
| | | |
| | |
| | | |
| | | public class OAJyService : RepositoryNoEntity |
| | | { |
| | | private readonly HttpClient _client = new HttpClient(); |
| | | |
| | | private const string APPID = "303233EF-AC39-40C1-8364-AC989C6258A5"; |
| | | |
| | | private const string SECRET = "30b41949-bcfb-48f8-9847-feb6e043fe72"; |
| | | |
| | | // private const string SPK = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApobID/gwmD9OofMG1gEcE94NCMeTYUq1cam/7ADZmxHCVpF143GaHWhqDdY0TTVbcUElsQ71DzAG2j3itWlIJBK5fVGwCo3sPpAvUDdKMh+Uivcp7yxdy/IDRA/PS4JARuEyM4cVJLhIOU2KnSlbIkheeoDkDgfaxu9kKrWnozJLiYraVTVDz9PdRX7fQdP+Zu/xB9txAGw4kvOm9HwgrzaSRdZEhisTJ5yyoNW/dLXtWKXA0cKhKOOIFu12TOrv/It6hl1ShTUuy79Pa51M9Oc2dEfVs1tluNXPWo1uFXQbBaJxdqZEJJlK7iW2uQFIao2O4XFHYThwy2+6116LtwIDAQAB"; |
| | | private const string HOST = "http://192.168.1.149:8099"; |
| | | |
| | | private const string SPK = @"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApobID/gwmD9OofMG1gEcE94NCMeTYUq1cam/7ADZmxHCVpF143GaHWhqDdY0TTVbcUElsQ71DzAG2j3itWlIJBK5fVGwCo3sPpAvUDdKMh+Uivcp7yxdy/IDRA/PS4JARuEyM4cVJLhIOU2KnSlbIkheeoDkDgfaxu9kKrWnozJLiYraVTVDz9PdRX7fQdP+Zu/xB9txAGw4kvOm9HwgrzaSRdZEhisTJ5yyoNW/dLXtWKXA0cKhKOOIFu12TOrv/It6hl1ShTUuy79Pa51M9Oc2dEfVs1tluNXPWo1uFXQbBaJxdqZEJJlK7iW2uQFIao2O4XFHYThwy2+6116LtwIDAQAB"; |
| | | private const string SPK = |
| | | @"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApobID/gwmD9OofMG1gEcE94NCMeTYUq1cam/7ADZmxHCVpF143GaHWhqDdY0TTVbcUElsQ71DzAG2j3itWlIJBK5fVGwCo3sPpAvUDdKMh+Uivcp7yxdy/IDRA/PS4JARuEyM4cVJLhIOU2KnSlbIkheeoDkDgfaxu9kKrWnozJLiYraVTVDz9PdRX7fQdP+Zu/xB9txAGw4kvOm9HwgrzaSRdZEhisTJ5yyoNW/dLXtWKXA0cKhKOOIFu12TOrv/It6hl1ShTUuy79Pa51M9Oc2dEfVs1tluNXPWo1uFXQbBaJxdqZEJJlK7iW2uQFIao2O4XFHYThwy2+6116LtwIDAQAB"; |
| | | |
| | | |
| | | public static class RsaHelper |
| | | { |
| | | public static string Encrypt(string plainText, string publicKeyPem) |
| | | { |
| | | //// 将PEM格式的公钥转换为XML格式 |
| | | //var rsa = RSA.Create(); |
| | | //rsa.ImportFromPem(publicKeyPem); // 使用.NET 5+ 内置PEM解析方法 |
| | | |
| | | //var parameters = rsa.ExportParameters(false); |
| | | //string publicKeyXml = $"<RSAKeyValue><Modulus>{Convert.ToBase64String(parameters.Modulus)}</Modulus><Exponent>{Convert.ToBase64String(parameters.Exponent)}</Exponent></RSAKeyValue>"; |
| | | |
| | | //using var rsaProvider = new RSACryptoServiceProvider(); |
| | | //rsaProvider.FromXmlString(publicKeyXml); // 使用转换后的XML格式公钥 |
| | | |
| | | //var data = Encoding.UTF8.GetBytes(plainText); |
| | | //var encrypted = rsaProvider.Encrypt(data, false); |
| | | //return Convert.ToBase64String(encrypted); |
| | | |
| | | RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKeyPem)); |
| | | string XML = string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>", |
| | | Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()), |
| | | Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned())); |
| | | string encryptedContent = string.Empty; |
| | | using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) |
| | | { |
| | | rsa.FromXmlString(XML); |
| | | byte[] encryptedData = rsa.Encrypt(Encoding.Default.GetBytes(plainText), false); |
| | | encryptedContent = Convert.ToBase64String(encryptedData); |
| | | } |
| | | return encryptedContent; |
| | | } |
| | | } |
| | | private readonly HttpClient _client = new(); |
| | | |
| | | public string PostDataSSL(string url, |
| | | Dictionary<string, string> parameters, |
| | | Dictionary<string, string> headers) |
| | | Dictionary<string, string> parameters, |
| | | Dictionary<string, string> headers) |
| | | { |
| | | var request = new HttpRequestMessage(HttpMethod.Post, url); |
| | | |
| | | foreach (var header in headers) |
| | | { |
| | | request.Headers.Add(header.Key, header.Value); |
| | | } |
| | | |
| | | // 如果需要表单参数 |
| | | if (parameters.Count > 0) |
| | | { |
| | | request.Content = new FormUrlEncodedContent(parameters); |
| | | } |
| | | |
| | | var response = _client.SendAsync(request).Result; |
| | | return response.Content.ReadAsStringAsync().Result; |
| | |
| | | |
| | | public string GetToken() |
| | | { |
| | | |
| | | var userId = "1268"; |
| | | var encryptedUserId = RsaHelper.Encrypt(userId, SPK); |
| | | ; |
| | |
| | | if (!string.IsNullOrEmpty(response)) |
| | | { |
| | | var res = JsonConvert.DeserializeObject<dynamic>(response); |
| | | if (res.status == "true") |
| | | { |
| | | return res.token.ToString(); |
| | | } |
| | | if (res.status == "true") return res.token.ToString(); |
| | | } |
| | | |
| | | return "token不存在!"; |
| | | } |
| | | catch (Exception ex) |
| | |
| | | try |
| | | { |
| | | // 参数校验 |
| | | if (query == null) throw new ArgumentNullException(nameof(query), "参数对象不能为null"); |
| | | if (query == null) |
| | | throw new ArgumentNullException(nameof(query), "参数对象不能为null"); |
| | | //if (query.workflowId == null) throw new ArgumentException("workflowId不能为空"); |
| | | //if (query.mainData == null) throw new ArgumentException("mainData不能为空"); |
| | | |
| | |
| | | // detailDataDict = ((IEnumerable<KeyValuePair<string, object>>)query.detailData) |
| | | // .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); |
| | | //} |
| | | |
| | | |
| | | // 加密处理 |
| | | var userId = "1268"; |
| | | var encryptedUserId = RsaHelper.Encrypt(userId, SPK); |
| | | string strToken = GetToken(); |
| | | var strToken = GetToken(); |
| | | |
| | | |
| | | // 替换原有的测mainDataDict试数据构建 |
| | | mainDataDict = BuildMainDataFromQuery(query); |
| | | |
| | | |
| | | |
| | | // 调用方法增加userid请求头 |
| | | var result = SubmitWorkflowRequest( |
| | | token: strToken, |
| | | workflowId: 379, |
| | | mainData: mainDataDict, |
| | | strToken, |
| | | 379, |
| | | mainDataDict, |
| | | requestName: "MES->OA测试流程标题", |
| | | otherParams:null, |
| | | remark:"Test", |
| | | requestLevel:"", |
| | | encryptedUserId: encryptedUserId // 新增参数 |
| | | otherParams: null, |
| | | remark: "Test", |
| | | requestLevel: "", |
| | | encryptedUserId: encryptedUserId // 新增参数 |
| | | ); |
| | | return result; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | // 更详细的错误处理 |
| | | return new { |
| | | return new |
| | | { |
| | | status = -1, |
| | | message = $"完整错误信息:{ex.ToString()}" // 显示完整堆栈 |
| | | message = $"完整错误信息:{ex}" // 显示完整堆栈 |
| | | }; |
| | | } |
| | | } |
| | | |
| | | // 修改方法签名 |
| | | public dynamic SubmitWorkflowRequest( |
| | | string token, |
| | | string token, |
| | | int workflowId, |
| | | Dictionary<string, object> mainData, |
| | | string encryptedUserId, // 用户id |
| | | string encryptedUserId, // 用户id |
| | | Dictionary<string, object> detailData = null, |
| | | Dictionary<string, object> otherParams = null, |
| | | string remark = "", |
| | |
| | | { |
| | | try |
| | | { |
| | | ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true; |
| | | ServicePointManager.ServerCertificateValidationCallback += |
| | | (s, cert, chain, sslPolicyErrors) => true; |
| | | ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; |
| | | |
| | | var url = new Uri($"{HOST}/api/workflow/paService/doCreateRequest"); |
| | | var request = WebRequest.Create(url) as HttpWebRequest; |
| | | request.Method = "POST"; |
| | | request.Timeout = 20000; |
| | | request.ContentType = "application/x-www-form-urlencoded"; // 修改为JSON格式 |
| | | request.ContentType = |
| | | "application/x-www-form-urlencoded"; // 修改为JSON格式 |
| | | |
| | | // 构建请求头 |
| | | request.Headers.Set("appid", APPID); |
| | | request.Headers.Set("token", token); |
| | | request.Headers.Set("Content-Type", "application/x-www-form-urlencoded"); |
| | | request.Headers.Set("Content-Type", |
| | | "application/x-www-form-urlencoded"); |
| | | request.Headers.Set("userId", encryptedUserId); |
| | | // 假设需要加密的userid从其他地方获取,这里需要补充获取逻辑 |
| | | |
| | |
| | | { |
| | | //["userId"] = "1268", |
| | | ["workflowId"] = workflowId, |
| | | ["mainData"] = new List<Dictionary<string, object>> { mainData }, // 包装成数组 |
| | | ["mainData"] = |
| | | new List<Dictionary<string, object>> { mainData }, // 包装成数组 |
| | | ["detailData"] = null, |
| | | ["otherParams"] = otherParams ?? new Dictionary<string, object>(), |
| | | ["otherParams"] = |
| | | otherParams ?? new Dictionary<string, object>(), |
| | | ["remark"] = remark, |
| | | ["requestLevel"] = requestLevel, |
| | | ["requestName"] = requestName |
| | |
| | | |
| | | // 序列化请求体 |
| | | var jsonBody = JsonConvert.SerializeObject(requestBody); |
| | | byte[] byteData = Encoding.UTF8.GetBytes(jsonBody); |
| | | var byteData = Encoding.UTF8.GetBytes(jsonBody); |
| | | |
| | | // 发送请求 |
| | | using (var stream = request.GetRequestStream()) |
| | |
| | | using (var reader = new StreamReader(stream, Encoding.UTF8)) |
| | | { |
| | | var responseJson = reader.ReadToEnd(); |
| | | var result = JsonConvert.DeserializeObject<dynamic>(responseJson); |
| | | |
| | | var result = |
| | | JsonConvert.DeserializeObject<dynamic>(responseJson); |
| | | |
| | | // 添加状态码检查 |
| | | if (response.StatusCode != HttpStatusCode.OK || result.code != "SUCCESS") |
| | | { |
| | | if (response.StatusCode != HttpStatusCode.OK || |
| | | result.code != "SUCCESS") |
| | | throw new Exception($"流程提交失败:{result.errMsg}"); |
| | | } |
| | | |
| | | |
| | | return new |
| | | { |
| | | code = result.code, |
| | | data = result.data, |
| | | errMsg = result.errMsg |
| | | result.code, |
| | | result.data, |
| | | result.errMsg |
| | | }; |
| | | } |
| | | } |
| | |
| | | using (var reader = new StreamReader(stream)) |
| | | { |
| | | var errorDetails = reader.ReadToEnd(); |
| | | throw new Exception($"请求失败 [Status: {response.StatusCode}]: {errorDetails}"); |
| | | throw new Exception( |
| | | $"请求失败 [Status: {response.StatusCode}]: {errorDetails}"); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | |
| | | { |
| | | // 表结构定义 |
| | | ["tableDBName"] = "formtable_main_33", |
| | | ["workflowRequestTableRecords"] = new List<Dictionary<string, object>> |
| | | { |
| | | new Dictionary<string, object> |
| | | ["workflowRequestTableRecords"] = |
| | | new List<Dictionary<string, object>> |
| | | { |
| | | ["recordOrder"] = 0, |
| | | ["workflowRequestTableFields"] = new List<Dictionary<string, object>> |
| | | new() |
| | | { |
| | | new Dictionary<string, object> { ["fieldName"] = "wlbm", ["fieldValue"] = "1.01.01.001" }, |
| | | new Dictionary<string, object> { ["fieldName"] = "khgys", ["fieldValue"] = "陈雪年" }, |
| | | new Dictionary<string, object> { ["fieldName"] = "jzmcwlmc", ["fieldValue"] = "顶盖" }, |
| | | new Dictionary<string, object> { ["fieldName"] = "bhgpqxms", ["fieldValue"] = "外观不合格,尺寸不合格,颜色不符合" }, |
| | | new Dictionary<string, object> { ["fieldName"] = "dhdhmes", ["fieldValue"] = "MES001" } |
| | | ["recordOrder"] = 0, |
| | | ["workflowRequestTableFields"] = |
| | | new List<Dictionary<string, object>> |
| | | { |
| | | new() |
| | | { |
| | | ["fieldName"] = "wlbm", |
| | | ["fieldValue"] = "1.01.01.001" |
| | | }, |
| | | new() |
| | | { |
| | | ["fieldName"] = "khgys", |
| | | ["fieldValue"] = "陈雪年" |
| | | }, |
| | | new() |
| | | { |
| | | ["fieldName"] = "jzmcwlmc", |
| | | ["fieldValue"] = "顶盖" |
| | | }, |
| | | new() |
| | | { |
| | | ["fieldName"] = "bhgpqxms", |
| | | ["fieldValue"] = "外观不合格,尺寸不合格,颜色不符合" |
| | | }, |
| | | new() |
| | | { |
| | | ["fieldName"] = "dhdhmes", |
| | | ["fieldValue"] = "MES001" |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | |
| | | return mainData; |
| | | } |
| | | |
| | | // 辅助方法用于安全添加属性 |
| | | private void TryAddProperty(Dictionary<string, object> dict, string key, object value) |
| | | private void TryAddProperty(Dictionary<string, object> dict, string key, |
| | | object value) |
| | | { |
| | | if (value != null) |
| | | if (value != null) dict[key] = value; |
| | | } |
| | | |
| | | |
| | | public static class RsaHelper |
| | | { |
| | | public static string Encrypt(string plainText, string publicKeyPem) |
| | | { |
| | | dict[key] = value; |
| | | //// 将PEM格式的公钥转换为XML格式 |
| | | //var rsa = RSA.Create(); |
| | | //rsa.ImportFromPem(publicKeyPem); // 使用.NET 5+ 内置PEM解析方法 |
| | | |
| | | //var parameters = rsa.ExportParameters(false); |
| | | //string publicKeyXml = $"<RSAKeyValue><Modulus>{Convert.ToBase64String(parameters.Modulus)}</Modulus><Exponent>{Convert.ToBase64String(parameters.Exponent)}</Exponent></RSAKeyValue>"; |
| | | |
| | | //using var rsaProvider = new RSACryptoServiceProvider(); |
| | | //rsaProvider.FromXmlString(publicKeyXml); // 使用转换后的XML格式公钥 |
| | | |
| | | //var data = Encoding.UTF8.GetBytes(plainText); |
| | | //var encrypted = rsaProvider.Encrypt(data, false); |
| | | //return Convert.ToBase64String(encrypted); |
| | | |
| | | var publicKeyParam = |
| | | (RsaKeyParameters)PublicKeyFactory.CreateKey( |
| | | Convert.FromBase64String(publicKeyPem)); |
| | | var XML = string.Format( |
| | | "<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>", |
| | | Convert.ToBase64String(publicKeyParam.Modulus |
| | | .ToByteArrayUnsigned()), |
| | | Convert.ToBase64String(publicKeyParam.Exponent |
| | | .ToByteArrayUnsigned())); |
| | | var encryptedContent = string.Empty; |
| | | using (var rsa = new RSACryptoServiceProvider()) |
| | | { |
| | | rsa.FromXmlString(XML); |
| | | var encryptedData = |
| | | rsa.Encrypt(Encoding.Default.GetBytes(plainText), false); |
| | | encryptedContent = Convert.ToBase64String(encryptedData); |
| | | } |
| | | |
| | | return encryptedContent; |
| | | } |
| | | } |
| | | } |