From 51daf1e7ffe17b14b9e626cf0e153d0edd3226b1 Mon Sep 17 00:00:00 2001 From: shanji <18996038927@163.com> Date: Fri, 24 Feb 2023 17:11:24 +0800 Subject: [PATCH] 1 --- .../APIServices/PurchaseProductAPIService.cs | 46 ++++++- BBWY.Client/App.xaml.cs | 6 + BBWY.Client/BBWY.Client.csproj | 1 + .../Ware/BindingPurchaseProductViewModel.cs | 125 +++++++++--------- .../ViewModels/Ware/WareManagerViewModel.cs | 2 +- .../PlatformSDK/JDBusiness.cs | 1 - BBWY.Test/Program.cs | 68 +++++----- BBWY.sln | 10 ++ QuanTan.SDK/Client/BaseClient.cs | 58 ++++++++ QuanTan.SDK/Client/QuanTanProductClient.cs | 17 +++ QuanTan.SDK/Extensions/EncryptionExtension.cs | 85 ++++++++++++ QuanTan.SDK/Model/Request/QuanTanBaseParam.cs | 25 ++++ .../Product/QuanTanProductResponse.cs | 51 +++++++ QuanTan.SDK/Model/Response/QuanTanResponse.cs | 16 +++ QuanTan.SDK/Model/Vender/Supplier.cs | 11 ++ QuanTan.SDK/QuanTan.SDK.csproj | 16 +++ 16 files changed, 432 insertions(+), 106 deletions(-) create mode 100644 QuanTan.SDK/Client/BaseClient.cs create mode 100644 QuanTan.SDK/Client/QuanTanProductClient.cs create mode 100644 QuanTan.SDK/Extensions/EncryptionExtension.cs create mode 100644 QuanTan.SDK/Model/Request/QuanTanBaseParam.cs create mode 100644 QuanTan.SDK/Model/Response/Product/QuanTanProductResponse.cs create mode 100644 QuanTan.SDK/Model/Response/QuanTanResponse.cs create mode 100644 QuanTan.SDK/Model/Vender/Supplier.cs create mode 100644 QuanTan.SDK/QuanTan.SDK.csproj diff --git a/BBWY.Client/APIServices/PurchaseProductAPIService.cs b/BBWY.Client/APIServices/PurchaseProductAPIService.cs index 911acddb..ab80e86d 100644 --- a/BBWY.Client/APIServices/PurchaseProductAPIService.cs +++ b/BBWY.Client/APIServices/PurchaseProductAPIService.cs @@ -4,6 +4,7 @@ using BBWY.Common.Http; using BBWY.Common.Models; using Microsoft.Extensions.Caching.Memory; using Newtonsoft.Json.Linq; +using QuanTan.SDK.Client; using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -21,6 +22,9 @@ namespace BBWY.Client.APIServices private string oneBoundKey = "t5060712539"; private string oneBoundSecret = "20211103"; + private string qtAppId = "BBWY2023022001"; + private string qtAppSecret = "908e131365d5448ca651ba20ed7ddefe"; + private TimeSpan purchaseProductCacheTimeSpan; //private TimeSpan _1688SessionIdTimeSpan; @@ -28,7 +32,9 @@ namespace BBWY.Client.APIServices private IDictionary _1688ProductDetailRequestHeader; - public PurchaseProductAPIService(RestApiService restApiService, IMemoryCache memoryCache) + private QuanTanProductClient quanTanProductClient; + + public PurchaseProductAPIService(RestApiService restApiService, IMemoryCache memoryCache, QuanTanProductClient quanTanProductClient) { this.restApiService = restApiService; this.memoryCache = memoryCache; @@ -41,8 +47,7 @@ namespace BBWY.Client.APIServices { "Accept-Language","zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6"} }; purchaseProductCacheTimeSpan = TimeSpan.FromDays(1); - //_1688SessionIdTimeSpan = TimeSpan.FromMinutes(10); - //productChaches = new ConcurrentDictionary purchaseSchemeProductSkus)>(); + this.quanTanProductClient = quanTanProductClient; } public (Purchaser purchaser, IList purchaseSchemeProductSkus)? GetProductInfo(Platform platform, string productId, string skuId, string purchaseProductId, PurchaseOrderMode priceMode, PurchaseProductAPIMode apiMode) @@ -155,9 +160,8 @@ namespace BBWY.Client.APIServices { case Platform.阿里巴巴: return LoadFrom1688Spider(platform, productId, skuId, purchaseProductId, priceMode); - case Platform.拼多多: - - break; + case Platform.拳探: + return LoadFromQTSpider(platform, productId, skuId, purchaseProductId, priceMode); } return null; } @@ -249,5 +253,35 @@ namespace BBWY.Client.APIServices return null; } } + + private (Purchaser purchaser, IList purchaseSchemeProductSkus)? LoadFromQTSpider(Platform platform, string productId, string skuId, string purchaseProductId, PurchaseOrderMode priceMode) + { + try + { + var response = quanTanProductClient.GetProductInfo(purchaseProductId, qtAppId, qtAppSecret); + if (response.Status != 200) + return null; + return (new Purchaser() + { + Id = response.Data.Supplier.VenderId, + Name = response.Data.Supplier.VerdenName, + Location = response.Data.Supplier.Location + }, response.Data.ProductSku.Select(qtsku => new PurchaseSchemeProductSku() + { + ProductId = productId, + SkuId = skuId, + PurchaseProductId = purchaseProductId, + Price = qtsku.Price, + Title = qtsku.Title, + PurchaseSkuId = qtsku.SkuId, + PurchaseSkuSpecId = string.Empty, + Logo = qtsku.Logo + }).ToList()); + } + catch + { + return null; + } + } } } diff --git a/BBWY.Client/App.xaml.cs b/BBWY.Client/App.xaml.cs index 7a6cd3ca..c927f624 100644 --- a/BBWY.Client/App.xaml.cs +++ b/BBWY.Client/App.xaml.cs @@ -5,6 +5,7 @@ using BBWY.Common.Http; using BBWY.Common.Models; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using QuanTan.SDK.Client; using System; using System.Diagnostics; using System.IO; @@ -108,6 +109,11 @@ namespace BBWY.Client serviceCollection.AddMapper(new MappingProfile()); serviceCollection.AddTransient<_1688PreviewPurchaseViewModel>(); + + #region 注册拳探SDK相关类 + serviceCollection.AddSingleton(); + #endregion + ServiceProvider = serviceCollection.BuildServiceProvider(); #region 启动本机WebSocket服务 diff --git a/BBWY.Client/BBWY.Client.csproj b/BBWY.Client/BBWY.Client.csproj index 9d709acc..0d326741 100644 --- a/BBWY.Client/BBWY.Client.csproj +++ b/BBWY.Client/BBWY.Client.csproj @@ -49,6 +49,7 @@ + diff --git a/BBWY.Client/ViewModels/Ware/BindingPurchaseProductViewModel.cs b/BBWY.Client/ViewModels/Ware/BindingPurchaseProductViewModel.cs index b0f63189..7e84d263 100644 --- a/BBWY.Client/ViewModels/Ware/BindingPurchaseProductViewModel.cs +++ b/BBWY.Client/ViewModels/Ware/BindingPurchaseProductViewModel.cs @@ -19,14 +19,17 @@ namespace BBWY.Client.ViewModels { #region Properties private GlobalContext globalContext; - private OneBoundAPIService oneBoundAPIService; private PurchaseService purchaseService; private PurchaseProductAPIService purchaseProductAPIService; private string purchaserName; private bool isLoading; - //public Product Product { get; set; } + private Platform purchasePlatform; + + + private IDictionary urlPatternDictionary; + public IList ProductSkuList { get; set; } @@ -35,6 +38,8 @@ namespace BBWY.Client.ViewModels public string PurchaserLocation { get; set; } public bool IsLoading { get => isLoading; set { Set(ref isLoading, value); } } + public Platform PurchasePlatform { get => purchasePlatform; set { Set(ref purchasePlatform, value); } } + #endregion #region ICommands @@ -58,10 +63,9 @@ namespace BBWY.Client.ViewModels #endregion #region Methods - public BindingPurchaseProductViewModel(PurchaseProductAPIService purchaseProductAPIService, OneBoundAPIService oneBoundAPIService, PurchaseService purchaseService, GlobalContext globalContext) + public BindingPurchaseProductViewModel(PurchaseProductAPIService purchaseProductAPIService, PurchaseService purchaseService, GlobalContext globalContext) { this.globalContext = globalContext; - this.oneBoundAPIService = oneBoundAPIService; this.purchaseService = purchaseService; this.purchaseProductAPIService = purchaseProductAPIService; ClosingCommand = new RelayCommand(Closing); @@ -73,14 +77,20 @@ namespace BBWY.Client.ViewModels SavePurchaseSchemeCommand = new RelayCommand(SavePurchaseScheme); SearchPurchaseSkuNameCommand = new RelayCommand(SearchPurchaseSkuName); ClearPurchaseSkuNameCommand = new RelayCommand(ClearPurchaseSkuName); + urlPatternDictionary = new Dictionary() + { + { Platform.阿里巴巴,@"^(https://detail.1688.com/offer/(\d+).html)[^\s]*" }, + { Platform.拳探, @"^(https://qt.qiyue666.com/goods_detail/(\d+))(\?\w*)?$" } + }; } - public void SetData(IList productSkuList, string purchaserId, string purchaserName) + public void SetData(IList productSkuList, string purchaserId, string purchaserName, Platform purchasePlatform) { this.ProductSkuList = productSkuList; //this.Product = product; this.PurchaserId = purchaserId; this.PurchaserName = purchaserName; + this.PurchasePlatform = purchasePlatform; } protected override void Load() @@ -88,48 +98,48 @@ namespace BBWY.Client.ViewModels if (!string.IsNullOrEmpty(PurchaserId)) { IsLoading = true; - Task.Factory.StartNew(() => purchaseService.GetPurchaseSchemeList(ProductSkuList.Select(s => s.Id).ToList(), PurchaserId, globalContext.User.Shop.ShopId)).ContinueWith(r => - { - var apiResponse = r.Result; - if (!apiResponse.Success) - { - App.Current.Dispatcher.BeginInvoke((Action)delegate - { - MessageBox.Show(apiResponse.Msg, "查询采购方案"); - }); - IsLoading = false; - return; - } - - var purchaseSchemeList = apiResponse.Data; - - var waitList = new List(); - foreach (var sku in ProductSkuList) - { - //当前SKU下当前采购商的采购方案 - var apiScheme = purchaseSchemeList.FirstOrDefault(s => s.SkuId == sku.Id && s.PurchaserId == PurchaserId); - - if (apiScheme == null) - continue; - - sku.SelectedPurchaseScheme = PurchaseScheme.Convert(apiScheme); - var ewh = new ManualResetEvent(false); - waitList.Add(ewh); - - Task.Factory.StartNew(() => - { - foreach (var purchaseSchemeProduct in sku.SelectedPurchaseScheme.PurchaseSchemeProductList) - { - purchaseSchemeProduct.IsEditing = false; - LoadPurchaseProduct(sku.SelectedPurchaseScheme.PurchasePlatform, purchaseSchemeProduct, purchaseSchemeProduct.PurchaseProductId, null, out _); - } - ewh.Set(); - ewh.Dispose(); - }); - } - WaitHandle.WaitAll(waitList.ToArray()); - IsLoading = false; - }); + Task.Factory.StartNew(() => purchaseService.GetPurchaseSchemeList(ProductSkuList.Select(s => s.Id).ToList(), PurchaserId, globalContext.User.Shop.ShopId, purchasePlatform: PurchasePlatform)).ContinueWith(r => + { + var apiResponse = r.Result; + if (!apiResponse.Success) + { + App.Current.Dispatcher.BeginInvoke((Action)delegate + { + MessageBox.Show(apiResponse.Msg, "查询采购方案"); + }); + IsLoading = false; + return; + } + + var purchaseSchemeList = apiResponse.Data; + + var waitList = new List(); + foreach (var sku in ProductSkuList) + { + //当前SKU下当前采购商的采购方案 + var apiScheme = purchaseSchemeList.FirstOrDefault(s => s.SkuId == sku.Id && s.PurchaserId == PurchaserId); + + if (apiScheme == null) + continue; + + sku.SelectedPurchaseScheme = PurchaseScheme.Convert(apiScheme); + var ewh = new ManualResetEvent(false); + waitList.Add(ewh); + + Task.Factory.StartNew(() => + { + foreach (var purchaseSchemeProduct in sku.SelectedPurchaseScheme.PurchaseSchemeProductList) + { + purchaseSchemeProduct.IsEditing = false; + LoadPurchaseProduct(sku.SelectedPurchaseScheme.PurchasePlatform, purchaseSchemeProduct, purchaseSchemeProduct.PurchaseProductId, null, out _); + } + ewh.Set(); + ewh.Dispose(); + }); + } + WaitHandle.WaitAll(waitList.ToArray()); + IsLoading = false; + }); } } @@ -243,20 +253,6 @@ namespace BBWY.Client.ViewModels // }).ToList(); //} - private string GetSkuLogo(JToken skuJToken, JArray prop_img) - { - if (!prop_img.HasValues) - return "pack://application:,,,/Resources/Images/defaultItem.png"; - var properties = skuJToken.Value("properties").Split(';', StringSplitOptions.RemoveEmptyEntries); - foreach (var p in properties) - { - var imgJToken = prop_img.FirstOrDefault(g => g.Value("properties") == p); - if (imgJToken != null) - return imgJToken.Value("url"); - } - return "pack://application:,,,/Resources/Images/defaultItem.png"; - } - private void AddPurchaseProduct(ProductSku productSku) { if (productSku.PurchaseSchemeList.Count > 4) @@ -271,7 +267,7 @@ namespace BBWY.Client.ViewModels { ProductId = productSku.ProductId, SkuId = productSku.Id, - PurchasePlatform = Platform.阿里巴巴 + PurchasePlatform = PurchasePlatform }; } else if (productSku.SelectedPurchaseScheme.PurchaseSchemeProductList.Count >= 4) @@ -309,7 +305,10 @@ namespace BBWY.Client.ViewModels MessageBox.Show("商品url不能为空"); return; } - var match = Regex.Match(purchaseSchemeProduct.PurchaseUrl, @"^(https://detail.1688.com/offer/(\d+).html)[^\s]*"); + + urlPatternDictionary.TryGetValue(PurchasePlatform, out string pattern); + + var match = Regex.Match(purchaseSchemeProduct.PurchaseUrl, pattern); if (!match.Success) { MessageBox.Show("未能识别的url"); diff --git a/BBWY.Client/ViewModels/Ware/WareManagerViewModel.cs b/BBWY.Client/ViewModels/Ware/WareManagerViewModel.cs index b9995e9f..b7719248 100644 --- a/BBWY.Client/ViewModels/Ware/WareManagerViewModel.cs +++ b/BBWY.Client/ViewModels/Ware/WareManagerViewModel.cs @@ -306,7 +306,7 @@ namespace BBWY.Client.ViewModels private void OpenBindingView(Product product, string purchaserId, string purchaserName) { var skuList = product.SkuList; - bindingPurchaseProduct.SetData(skuList, purchaserId, purchaserName); + bindingPurchaseProduct.SetData(skuList, purchaserId, purchaserName, product.SelectedPurchasePlatformModel); var bindingView = new Views.Ware.BindingPurchaseProduct(); var r = bindingView.ShowDialog(); if (r == true) diff --git a/BBWY.Server.Business/PlatformSDK/JDBusiness.cs b/BBWY.Server.Business/PlatformSDK/JDBusiness.cs index 9bbac574..98e238f5 100644 --- a/BBWY.Server.Business/PlatformSDK/JDBusiness.cs +++ b/BBWY.Server.Business/PlatformSDK/JDBusiness.cs @@ -208,7 +208,6 @@ namespace BBWY.Server.Business public override IList GetOrderList(SearchPlatformOrderRequest searchOrderRequest) { - //logger.Info($"searchOrderRequest ${JsonConvert.SerializeObject(searchOrderRequest)}"); if (searchOrderRequest.StartDate == null || searchOrderRequest.EndDate == null) throw new BusinessException("缺少开始/结束日期"); if ((searchOrderRequest.EndDate.Value - searchOrderRequest.StartDate.Value).TotalDays > 30) diff --git a/BBWY.Test/Program.cs b/BBWY.Test/Program.cs index b5c38256..1c1c895c 100644 --- a/BBWY.Test/Program.cs +++ b/BBWY.Test/Program.cs @@ -45,44 +45,42 @@ namespace BBWY.Test //var token = "44c19a1c1fbd4641957e6e8985ed1358jmtl"; //森王玩具 - //var qtAppId = "BBWY2023022001"; - //var qtAppSecret = "908e131365d5448ca651ba20ed7ddefe"; - //var url = "https://qt.qiyue666.com/api/platform/product/spu/208"; - //var callTime = DateTime.Now.ToString("yyyyMMddHHmmss"); - //var randomNum = new Random().Next(100000, 999999).ToString(); - //var p = new object[] { }; + var qtAppId = "BBWY2023022001"; + var qtAppSecret = "908e131365d5448ca651ba20ed7ddefe"; + var url = "https://qt.qiyue666.com/api/platform/product/spu/208"; + var callTime = DateTime.Now.ToString("yyyyMMddHHmmss"); + var randomNum = new Random().Next(100000, 999999).ToString(); + var p = new object[] { }; - //var jmStr = JsonConvert.SerializeObject(new QuanTanSignParam() - //{ - // appId = qtAppId, - // appSecret = qtAppSecret, - // callTime = callTime, - // _params = JsonConvert.SerializeObject(p), - // randomNum = randomNum - //}); - //var md5Str = Md5Encrypt(jmStr); - //var qtToken = $"{qtAppId}-{callTime}-{md5Str}-{randomNum}"; - - //var qtRequestParam = new QuanTanRequestParam() - //{ - // Params = p, - // token = qtToken - //}; - //using (var httpClient = new HttpClient()) - //{ - // using (var request = new HttpRequestMessage(HttpMethod.Post, url)) - // { - // request.Content = new StringContent(JsonConvert.SerializeObject(qtRequestParam), Encoding.UTF8, "application/json"); + var jmStr = JsonConvert.SerializeObject(new QuanTanSignParam() + { + appId = qtAppId, + appSecret = qtAppSecret, + callTime = callTime, + _params = JsonConvert.SerializeObject(p), + randomNum = randomNum + }); + var md5Str = Md5Encrypt(jmStr); + var qtToken = $"{qtAppId}-{callTime}-{md5Str}-{randomNum}"; - // using (var response = httpClient.SendAsync(request).Result) - // { - // var result = response.Content.ReadAsStringAsync().Result; - // Console.WriteLine(result); - // } - // } - //} + var qtRequestParam = new QuanTanRequestParam() + { + Params = p, + token = qtToken + }; + using (var httpClient = new HttpClient()) + { + using (var request = new HttpRequestMessage(HttpMethod.Post, url)) + { + request.Content = new StringContent(JsonConvert.SerializeObject(qtRequestParam), Encoding.UTF8, "application/json"); - + using (var response = httpClient.SendAsync(request).Result) + { + var result = response.Content.ReadAsStringAsync().Result; + Console.WriteLine(result); + } + } + } Console.ReadKey(); } diff --git a/BBWY.sln b/BBWY.sln index dd60519f..68d82160 100644 --- a/BBWY.sln +++ b/BBWY.sln @@ -42,6 +42,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InDll2", "InDll2\InDll2.csp EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BBWY.WebSocket.Server", "BBWY.WebSocket.Server\BBWY.WebSocket.Server.csproj", "{4E08D6A8-5670-4890-B775-2A10017201FD}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuanTan.SDK", "QuanTan.SDK\QuanTan.SDK.csproj", "{49263249-1802-4BF1-9268-B80E9D69BCFC}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -162,6 +164,14 @@ Global {4E08D6A8-5670-4890-B775-2A10017201FD}.Release|Any CPU.Build.0 = Release|Any CPU {4E08D6A8-5670-4890-B775-2A10017201FD}.Release|x86.ActiveCfg = Release|Any CPU {4E08D6A8-5670-4890-B775-2A10017201FD}.Release|x86.Build.0 = Release|Any CPU + {49263249-1802-4BF1-9268-B80E9D69BCFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {49263249-1802-4BF1-9268-B80E9D69BCFC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {49263249-1802-4BF1-9268-B80E9D69BCFC}.Debug|x86.ActiveCfg = Debug|Any CPU + {49263249-1802-4BF1-9268-B80E9D69BCFC}.Debug|x86.Build.0 = Debug|Any CPU + {49263249-1802-4BF1-9268-B80E9D69BCFC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {49263249-1802-4BF1-9268-B80E9D69BCFC}.Release|Any CPU.Build.0 = Release|Any CPU + {49263249-1802-4BF1-9268-B80E9D69BCFC}.Release|x86.ActiveCfg = Release|Any CPU + {49263249-1802-4BF1-9268-B80E9D69BCFC}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/QuanTan.SDK/Client/BaseClient.cs b/QuanTan.SDK/Client/BaseClient.cs new file mode 100644 index 00000000..ff53861d --- /dev/null +++ b/QuanTan.SDK/Client/BaseClient.cs @@ -0,0 +1,58 @@ +using BBWY.Common.Http; +using Newtonsoft.Json; +using QuanTan.SDK.Extensions; +using QuanTan.SDK.Model.Request; +using QuanTan.SDK.Model.Response; +using System; +using System.Net.Http; + +namespace QuanTan.SDK.Client +{ + public class BaseClient + { + protected RestApiService restApiService; + + protected readonly string host = "https://qt.qiyue666.com/"; + + public BaseClient(RestApiService restApiService) + { + this.restApiService = restApiService; + } + + public QuanTanResponse SendRequest(string apiPath, object param, string appId, string appSecret) + { + var callTime = DateTime.Now.ToString("yyyyMMddHHmmss"); + var randomNum = new Random(Guid.NewGuid().GetHashCode()).Next(100000, 999999).ToString(); + if (param == null) + param = new object[] { }; + + var jmStr = JsonConvert.SerializeObject(new QuanTanSignParam() + { + appId = appId, + appSecret = appSecret, + callTime = callTime, + _params = JsonConvert.SerializeObject(param), + randomNum = randomNum + }); + var md5Str = jmStr.Md5Encrypt(); + var qtToken = $"{appId}-{callTime}-{md5Str}-{randomNum}"; + var requestParam = new QuanTanRequestParam() + { + Params = param, + token = qtToken + }; + + try + { + var restApiResult = restApiService.SendRequest(host, apiPath, requestParam, null, HttpMethod.Post); + if (restApiResult.StatusCode != System.Net.HttpStatusCode.OK) + throw new Exception(restApiResult.Content); + return JsonConvert.DeserializeObject>(restApiResult.Content); + } + catch (Exception ex) + { + return new QuanTanResponse() { Status = 0, Message = ex.Message }; + } + } + } +} diff --git a/QuanTan.SDK/Client/QuanTanProductClient.cs b/QuanTan.SDK/Client/QuanTanProductClient.cs new file mode 100644 index 00000000..ceba7462 --- /dev/null +++ b/QuanTan.SDK/Client/QuanTanProductClient.cs @@ -0,0 +1,17 @@ +using BBWY.Common.Http; +using QuanTan.SDK.Model.Response; +using QuanTan.SDK.Model.Response.Product; +namespace QuanTan.SDK.Client +{ + public class QuanTanProductClient : BaseClient + { + public QuanTanProductClient(RestApiService restApiService) : base(restApiService) + { + } + + public QuanTanResponse GetProductInfo(string productId, string appId, string appSecret) + { + return SendRequest($"api/platform/product/spu/{productId}", null, appId, appSecret); + } + } +} diff --git a/QuanTan.SDK/Extensions/EncryptionExtension.cs b/QuanTan.SDK/Extensions/EncryptionExtension.cs new file mode 100644 index 00000000..abd451a8 --- /dev/null +++ b/QuanTan.SDK/Extensions/EncryptionExtension.cs @@ -0,0 +1,85 @@ +using System; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Text; + +namespace QuanTan.SDK.Extensions +{ + public static class EncryptionExtension + { + + public static string Md5Encrypt(this string originStr) + { + using (var md5 = MD5.Create()) + { + return string.Join(string.Empty, md5.ComputeHash(Encoding.UTF8.GetBytes(originStr)).Select(x => x.ToString("x2"))); + } + } + + //AES加密 传入,要加密的串和, 解密key + public static string AESEncrypt(this string input) + { + var key = "dataplatform2019"; + var ivStr = "1012132405963708"; + + var encryptKey = Encoding.UTF8.GetBytes(key); + var iv = Encoding.UTF8.GetBytes(ivStr); //偏移量,最小为16 + using (var aesAlg = Aes.Create()) + { + using (var encryptor = aesAlg.CreateEncryptor(encryptKey, iv)) + { + using (var msEncrypt = new MemoryStream()) + { + using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, + CryptoStreamMode.Write)) + + using (var swEncrypt = new StreamWriter(csEncrypt)) + { + swEncrypt.Write(input); + } + var decryptedContent = msEncrypt.ToArray(); + + return Convert.ToBase64String(decryptedContent); + } + } + } + } + + public static string AESDecrypt(this string cipherText) + { + var fullCipher = Convert.FromBase64String(cipherText); + + var ivStr = "1012132405963708"; + var key = "dataplatform2019"; + + var iv = Encoding.UTF8.GetBytes(ivStr); + var decryptKey = Encoding.UTF8.GetBytes(key); + + using (var aesAlg = Aes.Create()) + { + using (var decryptor = aesAlg.CreateDecryptor(decryptKey, iv)) + { + string result; + using (var msDecrypt = new MemoryStream(fullCipher)) + { + using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) + { + using (var srDecrypt = new StreamReader(csDecrypt)) + { + result = srDecrypt.ReadToEnd(); + } + } + } + + return result; + } + } + } + + public static string Base64Encrypt(this string originStr) + { + return Convert.ToBase64String(Encoding.UTF8.GetBytes(originStr)); + } + } +} diff --git a/QuanTan.SDK/Model/Request/QuanTanBaseParam.cs b/QuanTan.SDK/Model/Request/QuanTanBaseParam.cs new file mode 100644 index 00000000..beaf64f7 --- /dev/null +++ b/QuanTan.SDK/Model/Request/QuanTanBaseParam.cs @@ -0,0 +1,25 @@ +using Newtonsoft.Json; + +namespace QuanTan.SDK.Model.Request +{ + public class QuanTanSignParam + { + public string appId { get; set; } + public string appSecret { get; set; } + + public string callTime { get; set; } + + [JsonProperty(PropertyName = "params")] + public object _params { get; set; } + + public string randomNum { get; set; } + } + + public class QuanTanRequestParam + { + [JsonProperty(PropertyName = "params")] + public object Params { get; set; } + + public string token { get; set; } + } +} diff --git a/QuanTan.SDK/Model/Response/Product/QuanTanProductResponse.cs b/QuanTan.SDK/Model/Response/Product/QuanTanProductResponse.cs new file mode 100644 index 00000000..56bb3bab --- /dev/null +++ b/QuanTan.SDK/Model/Response/Product/QuanTanProductResponse.cs @@ -0,0 +1,51 @@ +using QuanTan.SDK.Model.Vender; +using System; +using System.Collections.Generic; +using System.Text; + +namespace QuanTan.SDK.Model.Response.Product +{ + public class QuanTanProductResponse + { + public Supplier Supplier { get; set; } + + public QuanTanProduct Product { get; set; } + + public IList ProductSku { get; set; } + } + + public class QuanTanProduct + { + public string ProductId { get; set; } + /// + /// 商品名称(完整标题) + /// + public string ProductName { get; set; } + /// + /// 商品简介 + /// + public string ProductBrief { get; set; } + public decimal Price { get; set; } + public string UnitName { get; set; } + public string Image { get; set; } + //public string Sliderimage { get; set; } + public string VideoLink { get; set; } + public string Stock { get; set; } + public string Context { get; set; } + } + + public class QuanTanProductSku + { + public string SkuId { get; set; } + public string ProductId { get; set; } + public string Title { get; set; } + public string Logo { get; set; } + public decimal Price { get; set; } + //public decimal RetailPrice { get; set; } + public int Stock { get; set; } + //public decimal Volume { get; set; } + //public string weight { get; set; } + public string BarCode { get; set; } + //public string skuArr { get; set; } + } +} diff --git a/QuanTan.SDK/Model/Response/QuanTanResponse.cs b/QuanTan.SDK/Model/Response/QuanTanResponse.cs new file mode 100644 index 00000000..9ded1815 --- /dev/null +++ b/QuanTan.SDK/Model/Response/QuanTanResponse.cs @@ -0,0 +1,16 @@ +namespace QuanTan.SDK.Model.Response +{ + public class QuanTanResponse + { + public int Status { get; set; } + + public string Message { get; set; } + + public object Data { get; set; } + } + + public class QuanTanResponse : QuanTanResponse + { + public new T Data { get; set; } + } +} diff --git a/QuanTan.SDK/Model/Vender/Supplier.cs b/QuanTan.SDK/Model/Vender/Supplier.cs new file mode 100644 index 00000000..35ea87e6 --- /dev/null +++ b/QuanTan.SDK/Model/Vender/Supplier.cs @@ -0,0 +1,11 @@ +namespace QuanTan.SDK.Model.Vender +{ + public class Supplier + { + public string Location { get; set; } + + public string VenderId { get; set; } + + public string VerdenName { get; set; } + } +} diff --git a/QuanTan.SDK/QuanTan.SDK.csproj b/QuanTan.SDK/QuanTan.SDK.csproj new file mode 100644 index 00000000..a5ff008a --- /dev/null +++ b/QuanTan.SDK/QuanTan.SDK.csproj @@ -0,0 +1,16 @@ + + + + netstandard2.1 + enable + + + + + + + + + + +