南骏 池
2025-04-25 610782d5127af072b204792f4c9e38911498e61e
1.携客云初步demo
已添加3个文件
已修改2个文件
332 ■■■■■ 文件已修改
Controllers/Warehouse/MesXkyController.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
NewPdaSqlServer.csproj 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/QC/OAJyService.cs 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Warehouse/MesXkyService.cs 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
util/XkyApiHelper.cs 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/Warehouse/MesXkyController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
using System.Dynamic;
using Microsoft.AspNetCore.Mvc;
using NewPdaSqlServer.Dto.service;
using NewPdaSqlServer.entity;
using NewPdaSqlServer.service.QC;
using NewPdaSqlServer.util;
using Newtonsoft.Json.Linq;
namespace NewPdaSqlServer.Controllers.Warehouse;
[Route("api/[controller]")]
[ApiController]
public class MesXkyController : ControllerBase
{
    MesXkyService m = new MesXkyService();
    [HttpPost("GetXkyDhd")]
    public ResponseResult GetXkyDhd([FromBody] string JsonObj)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos = m.GetXkyDHD(JsonObj);
            var tbBillList = resultInfos;
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = tbBillList
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
}
NewPdaSqlServer.csproj
@@ -10,9 +10,12 @@
        <PackageReference Include="Masuit.Tools.Core" Version="2024.5.8" />
        <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.8" />
        <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.10" />
        <PackageReference Include="Portable.BouncyCastle" Version="1.9.0" />
        <PackageReference Include="SqlSugarCore" Version="5.1.4.169" />
        <PackageReference Include="Swashbuckle.AspNetCore" Version="6.8.0" />
        <PackageReference Include="System.Data.SqlClient" Version="4.8.6" />
        <PackageReference Include="System.Security.Cryptography.X509Certificates" Version="4.3.2" />
        <PackageReference Include="System.Security.Cryptography.Xml" Version="9.0.4" />
    </ItemGroup>
</Project>
service/QC/OAJyService.cs
@@ -11,6 +11,13 @@
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 Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
namespace NewPdaSqlServer.service.QC;
@@ -23,34 +30,39 @@
    // 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 = @"-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApobID/gwmD9OofMG1gEc
E94NCMeTYUq1cam/7ADZmxHCVpF143GaHWhqDdY0TTVbcUElsQ71DzAG2j3itWlI
JBK5fVGwCo3sPpAvUDdKMh+Uivcp7yxdy/IDRA/PS4JARuEyM4cVJLhIOU2KnSlb
IkheeoDkDgfaxu9kKrWnozJLiYraVTVDz9PdRX7fQdP+Zu/xB9txAGw4kvOm9Hwg
rzaSRdZEhisTJ5yyoNW/dLXtWKXA0cKhKOOIFu12TOrv/It6hl1ShTUuy79Pa51M
9Oc2dEfVs1tluNXPWo1uFXQbBaJxdqZEJJlK7iW2uQFIao2O4XFHYThwy2+6116L
twIDAQAB
-----END PUBLIC KEY-----";
    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解析方法
            //// å°†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>";
            //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格式公钥
            //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 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;
        }
    }
@@ -196,7 +208,7 @@
            //}
    
            // åŠ å¯†å¤„ç†
            var userId = "FRadmin";
            var userId = "1268";
            var encryptedUserId = RsaHelper.Encrypt(userId, SPK);
            string strToken = GetToken();
@@ -249,13 +261,13 @@
            var request = WebRequest.Create(url) as HttpWebRequest;
            request.Method = "POST";
            request.Timeout = 20000;
            request.ContentType = "application/json; charset=utf-8";  // ä¿®æ”¹ä¸ºJSON格式
            request.ContentType = "application/x-www-form-urlencoded";  // ä¿®æ”¹ä¸ºJSON格式
            // æž„建请求头
            request.Headers.Add("appid", APPID);
            request.Headers.Add("token", token);
            request.Headers.Add("Content-Type", APPID);
            request.Headers.Add("userId", encryptedUserId);
            request.Headers.Set("appid", APPID);
            request.Headers.Set("token", token);
            request.Headers.Set("Content-Type", "application/x-www-form-urlencoded");
            request.Headers.Set("userId", encryptedUserId);
            // å‡è®¾éœ€è¦åŠ å¯†çš„userid从其他地方获取,这里需要补充获取逻辑
            // æž„建请求体
service/Warehouse/MesXkyService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
using MES.Service.Models;
using Microsoft.IdentityModel.Tokens;
using MySqlConnector;
using NewPdaSqlServer.Controllers;
using NewPdaSqlServer.DB;
using NewPdaSqlServer.Dto.service;
using NewPdaSqlServer.entity;
using NewPdaSqlServer.util;
using Newtonsoft.Json;
using SqlSugar;
using System.Collections;
using System.Data;
using System.Net;
using System.Net.Http.Headers;
using System.Security.Cryptography;
using System.Text;
using static Azure.Core.HttpHeader;
namespace NewPdaSqlServer.service.QC;
public class MesXkyService : RepositoryNoEntity
{
    public bool XKY_GET_DHD(dynamic entity)
    {
        string ErrorMsg = "";
        ApiCommonParam Apiparam = ApiCommonParam.NewApiCommon();
        try
        {
            string data_inserted = "";
            ArrayList SQLStringList = new ArrayList();
            // var client = new HttpClient();
            var url = "https://openapi.xiekeyun.com/delivery/getNoList.json";
            HttpClient httpClient = new HttpClient();
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            string json = "{\"commonParam\":" + JsonConvert.SerializeObject(Apiparam) + ",\"body\":" + data_inserted + "}";
            byte[] postData = Encoding.UTF8.GetBytes(json);
            // åˆ›å»ºè¯·æ±‚对象
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://openapi.xiekeyun.com/delivery/getNoList.json");
            request.Method = "POST";
            request.ContentType = "application/json";
            request.ContentLength = postData.Length;
            // å‘送请求数据
            using (Stream stream = request.GetRequestStream())
            {
                stream.Write(postData, 0, postData.Length);
            }
            dynamic responseJson;
            // å‘送请求并获取响应
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            using (Stream stream = response.GetResponseStream())
            using (StreamReader reader = new StreamReader(stream))
            {
                string result2 = reader.ReadToEnd();
                responseJson = JsonConvert.DeserializeObject(result2);
            }
        }
        catch (Exception ex)
        {
            ErrorMsg = ex.Message;
            return false;
        }
        return true;
    }
    public dynamic GetXkyDHD(dynamic entity)
    {
       return XKY_GET_DHD(entity);
    }
}
util/XkyApiHelper.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,150 @@
using Newtonsoft.Json;
using System.Text;
using NewPdaSqlServer.util;
using System.Security.Cryptography;
namespace NewPdaSqlServer.util
{
    /// SignUnit ç­¾åå±žæ€§å¸¸é‡ç±»
    public class SignConst
    {
        public SignConst()
        {
            //this.appKey = "变量_AppKey";
            //this.operateCompanyCode = "变量_operateCompanyCode";
            //this.ownerCompanyCode = "变量_ownerCompanyCode";
            //this.appSecret = "变量_appSecret";
            this.appKey = "86d3ae868978beff0d39948c420ec4ff";
            this.operateCompanyCode = "52265397";
            this.ownerCompanyCode = "52265397";
            this.appSecret = "978f5b950aefc3c1e0d4a56a562b0f8c";
            this.version = "1.0";
        }
        public string appKey { get; set; }
        public string version { get; set; }
        public string operateCompanyCode { get; set; }
        public string ownerCompanyCode { get; set; }
        public string appSecret { get; set; }
    }
}
namespace NewPdaSqlServer.util
{
    /// API相关参数定义的全局类
    public partial class ApiGlobal
    {
        public ApiGlobal() { }
        /// åˆå§‹åŒ–
        public static void Init()
        {
            signConst = new SignConst();
        }
        public static SignConst signConst { get; set; }
    }
}
namespace NewPdaSqlServer.util
{
    /// SignUtils ç­¾åå·¥å…·ç±»
    public class SignUtils
    {
        public static MD5 md5 = MD5.Create();
        public static string buildCurrentSign(IDictionary<string, string> parameters, String appSecret)
        {
            try
            {
                string secret = ":" + appSecret;
                IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters, StringComparer.Ordinal);
                IEnumerator<KeyValuePair<string, string>> dem = sortedParams.GetEnumerator();
                StringBuilder query = new StringBuilder();
                while (dem.MoveNext())
                {
                    string key = dem.Current.Key;
                    string value = dem.Current.Value;
                    if (key == "sign")
                    {
                        continue;
                    }
                    if (!string.IsNullOrEmpty(key))
                    {
                        query.Append(value).Append(":");
                    }
                }
                string strvalue = query.ToString().TrimEnd(':') + secret;
                return MD5Encrypt32(strvalue);
            }
            catch (Exception)
            {
                throw new Exception("签名异常!");
            }
        }
        public static string MD5Encrypt32(string text)
        {
            string pwd = "";
            // åŠ å¯†åŽæ˜¯ä¸€ä¸ªå­—èŠ‚ç±»åž‹çš„æ•°ç»„ï¼Œè¿™é‡Œè¦æ³¨æ„ç¼–ç UTF8/Unicode的选择 
            byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(text));
            // é€šè¿‡ä½¿ç”¨å¾ªçŽ¯ï¼Œå°†å­—èŠ‚ç±»åž‹çš„æ•°ç»„è½¬æ¢ä¸ºå­—ç¬¦ä¸²ï¼Œæ­¤å­—ç¬¦ä¸²æ˜¯å¸¸è§„å­—ç¬¦æ ¼å¼åŒ–æ‰€å¾—
            for (int i = 0; i < s.Length; i++)
            {
                //将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符
                pwd = pwd + s[i].ToString("x2");
            }
            return pwd.ToString().ToLower();
        }
        public static long GetTimestamp(DateTime d)
        {
            TimeSpan ts = d.ToUniversalTime() - new DateTime(1970, 1, 1);
            return (long)ts.TotalSeconds;     //精确到秒
        }
    }
}
namespace NewPdaSqlServer.util
{
    /// ApiCommonParam API请求对应的Common参数类
    public class ApiCommonParam
    {
        public ApiCommonParam() { }
        public ApiCommonParam(string appKey, string version, string operateCompanyCode, string ownerCompanyCode, long timestamps)
        {
            this.appKey = appKey;
            this.version = version;
            this.operateCompanyCode = operateCompanyCode;
            this.ownerCompanyCode = ownerCompanyCode;
            this.timestamps = timestamps;
        }
        public string appKey { get; set; }//appKey
        public string version { get; set; }//接口版本
        public string ownerCompanyCode { get; set; }//数据所属公司编码
        public string operateCompanyCode { get; set; }//操作者所属公司编码
        public string sign { get; set; }//签名
        public long timestamps { get; set; }//请求的时间戳
        public object reserver { get; set; }//扩展字段
        /// æž„造对象
        public static ApiCommonParam NewApiCommon()
        {
            //构造对象
            ApiCommonParam param = new ApiCommonParam(ApiGlobal.signConst.appKey, ApiGlobal.signConst.version, ApiGlobal.signConst.operateCompanyCode, ApiGlobal.signConst.ownerCompanyCode, SignUtils.GetTimestamp(DateTime.Now));
            //计算签名&赋值
            var jsonParam = JsonConvert.SerializeObject(param);
            //JavaScriptSerializer json = new JavaScriptSerializer();
            //string jsonParam = json.Serialize(param);
            var paramDict = JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonParam);
            param.sign = SignUtils.buildCurrentSign(paramDict, ApiGlobal.signConst.appSecret);
            return param;
        }
    }
}