shanji 2 years ago
parent
commit
51daf1e7ff
  1. 46
      BBWY.Client/APIServices/PurchaseProductAPIService.cs
  2. 6
      BBWY.Client/App.xaml.cs
  3. 1
      BBWY.Client/BBWY.Client.csproj
  4. 125
      BBWY.Client/ViewModels/Ware/BindingPurchaseProductViewModel.cs
  5. 2
      BBWY.Client/ViewModels/Ware/WareManagerViewModel.cs
  6. 1
      BBWY.Server.Business/PlatformSDK/JDBusiness.cs
  7. 68
      BBWY.Test/Program.cs
  8. 10
      BBWY.sln
  9. 58
      QuanTan.SDK/Client/BaseClient.cs
  10. 17
      QuanTan.SDK/Client/QuanTanProductClient.cs
  11. 85
      QuanTan.SDK/Extensions/EncryptionExtension.cs
  12. 25
      QuanTan.SDK/Model/Request/QuanTanBaseParam.cs
  13. 51
      QuanTan.SDK/Model/Response/Product/QuanTanProductResponse.cs
  14. 16
      QuanTan.SDK/Model/Response/QuanTanResponse.cs
  15. 11
      QuanTan.SDK/Model/Vender/Supplier.cs
  16. 16
      QuanTan.SDK/QuanTan.SDK.csproj

46
BBWY.Client/APIServices/PurchaseProductAPIService.cs

@ -4,6 +4,7 @@ using BBWY.Common.Http;
using BBWY.Common.Models; using BBWY.Common.Models;
using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Caching.Memory;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using QuanTan.SDK.Client;
using System; using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
@ -21,6 +22,9 @@ namespace BBWY.Client.APIServices
private string oneBoundKey = "t5060712539"; private string oneBoundKey = "t5060712539";
private string oneBoundSecret = "20211103"; private string oneBoundSecret = "20211103";
private string qtAppId = "BBWY2023022001";
private string qtAppSecret = "908e131365d5448ca651ba20ed7ddefe";
private TimeSpan purchaseProductCacheTimeSpan; private TimeSpan purchaseProductCacheTimeSpan;
//private TimeSpan _1688SessionIdTimeSpan; //private TimeSpan _1688SessionIdTimeSpan;
@ -28,7 +32,9 @@ namespace BBWY.Client.APIServices
private IDictionary<string, string> _1688ProductDetailRequestHeader; private IDictionary<string, string> _1688ProductDetailRequestHeader;
public PurchaseProductAPIService(RestApiService restApiService, IMemoryCache memoryCache) private QuanTanProductClient quanTanProductClient;
public PurchaseProductAPIService(RestApiService restApiService, IMemoryCache memoryCache, QuanTanProductClient quanTanProductClient)
{ {
this.restApiService = restApiService; this.restApiService = restApiService;
this.memoryCache = memoryCache; 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"} { "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); purchaseProductCacheTimeSpan = TimeSpan.FromDays(1);
//_1688SessionIdTimeSpan = TimeSpan.FromMinutes(10); this.quanTanProductClient = quanTanProductClient;
//productChaches = new ConcurrentDictionary<string, (Purchaser purchaser, IList<PurchaseSchemeProductSku> purchaseSchemeProductSkus)>();
} }
public (Purchaser purchaser, IList<PurchaseSchemeProductSku> purchaseSchemeProductSkus)? GetProductInfo(Platform platform, string productId, string skuId, string purchaseProductId, PurchaseOrderMode priceMode, PurchaseProductAPIMode apiMode) public (Purchaser purchaser, IList<PurchaseSchemeProductSku> purchaseSchemeProductSkus)? GetProductInfo(Platform platform, string productId, string skuId, string purchaseProductId, PurchaseOrderMode priceMode, PurchaseProductAPIMode apiMode)
@ -155,9 +160,8 @@ namespace BBWY.Client.APIServices
{ {
case Platform.: case Platform.:
return LoadFrom1688Spider(platform, productId, skuId, purchaseProductId, priceMode); return LoadFrom1688Spider(platform, productId, skuId, purchaseProductId, priceMode);
case Platform.: case Platform.:
return LoadFromQTSpider(platform, productId, skuId, purchaseProductId, priceMode);
break;
} }
return null; return null;
} }
@ -249,5 +253,35 @@ namespace BBWY.Client.APIServices
return null; return null;
} }
} }
private (Purchaser purchaser, IList<PurchaseSchemeProductSku> 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;
}
}
} }
} }

6
BBWY.Client/App.xaml.cs

@ -5,6 +5,7 @@ using BBWY.Common.Http;
using BBWY.Common.Models; using BBWY.Common.Models;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using QuanTan.SDK.Client;
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
@ -108,6 +109,11 @@ namespace BBWY.Client
serviceCollection.AddMapper(new MappingProfile()); serviceCollection.AddMapper(new MappingProfile());
serviceCollection.AddTransient<_1688PreviewPurchaseViewModel>(); serviceCollection.AddTransient<_1688PreviewPurchaseViewModel>();
#region 注册拳探SDK相关类
serviceCollection.AddSingleton<QuanTanProductClient>();
#endregion
ServiceProvider = serviceCollection.BuildServiceProvider(); ServiceProvider = serviceCollection.BuildServiceProvider();
#region 启动本机WebSocket服务 #region 启动本机WebSocket服务

1
BBWY.Client/BBWY.Client.csproj

@ -49,6 +49,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\BBWY.Common\BBWY.Common.csproj" /> <ProjectReference Include="..\BBWY.Common\BBWY.Common.csproj" />
<ProjectReference Include="..\BBWY.Controls\BBWY.Controls.csproj" /> <ProjectReference Include="..\BBWY.Controls\BBWY.Controls.csproj" />
<ProjectReference Include="..\QuanTan.SDK\QuanTan.SDK.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

125
BBWY.Client/ViewModels/Ware/BindingPurchaseProductViewModel.cs

@ -19,14 +19,17 @@ namespace BBWY.Client.ViewModels
{ {
#region Properties #region Properties
private GlobalContext globalContext; private GlobalContext globalContext;
private OneBoundAPIService oneBoundAPIService;
private PurchaseService purchaseService; private PurchaseService purchaseService;
private PurchaseProductAPIService purchaseProductAPIService; private PurchaseProductAPIService purchaseProductAPIService;
private string purchaserName; private string purchaserName;
private bool isLoading; private bool isLoading;
//public Product Product { get; set; } private Platform purchasePlatform;
private IDictionary<Platform, string> urlPatternDictionary;
public IList<ProductSku> ProductSkuList { get; set; } public IList<ProductSku> ProductSkuList { get; set; }
@ -35,6 +38,8 @@ namespace BBWY.Client.ViewModels
public string PurchaserLocation { get; set; } public string PurchaserLocation { get; set; }
public bool IsLoading { get => isLoading; set { Set(ref isLoading, value); } } public bool IsLoading { get => isLoading; set { Set(ref isLoading, value); } }
public Platform PurchasePlatform { get => purchasePlatform; set { Set(ref purchasePlatform, value); } }
#endregion #endregion
#region ICommands #region ICommands
@ -58,10 +63,9 @@ namespace BBWY.Client.ViewModels
#endregion #endregion
#region Methods #region Methods
public BindingPurchaseProductViewModel(PurchaseProductAPIService purchaseProductAPIService, OneBoundAPIService oneBoundAPIService, PurchaseService purchaseService, GlobalContext globalContext) public BindingPurchaseProductViewModel(PurchaseProductAPIService purchaseProductAPIService, PurchaseService purchaseService, GlobalContext globalContext)
{ {
this.globalContext = globalContext; this.globalContext = globalContext;
this.oneBoundAPIService = oneBoundAPIService;
this.purchaseService = purchaseService; this.purchaseService = purchaseService;
this.purchaseProductAPIService = purchaseProductAPIService; this.purchaseProductAPIService = purchaseProductAPIService;
ClosingCommand = new RelayCommand<System.ComponentModel.CancelEventArgs>(Closing); ClosingCommand = new RelayCommand<System.ComponentModel.CancelEventArgs>(Closing);
@ -73,14 +77,20 @@ namespace BBWY.Client.ViewModels
SavePurchaseSchemeCommand = new RelayCommand(SavePurchaseScheme); SavePurchaseSchemeCommand = new RelayCommand(SavePurchaseScheme);
SearchPurchaseSkuNameCommand = new RelayCommand<PurchaseSchemeProduct>(SearchPurchaseSkuName); SearchPurchaseSkuNameCommand = new RelayCommand<PurchaseSchemeProduct>(SearchPurchaseSkuName);
ClearPurchaseSkuNameCommand = new RelayCommand<PurchaseSchemeProduct>(ClearPurchaseSkuName); ClearPurchaseSkuNameCommand = new RelayCommand<PurchaseSchemeProduct>(ClearPurchaseSkuName);
urlPatternDictionary = new Dictionary<Platform, string>()
{
{ Platform.,@"^(https://detail.1688.com/offer/(\d+).html)[^\s]*" },
{ Platform., @"^(https://qt.qiyue666.com/goods_detail/(\d+))(\?\w*)?$" }
};
} }
public void SetData(IList<ProductSku> productSkuList, string purchaserId, string purchaserName) public void SetData(IList<ProductSku> productSkuList, string purchaserId, string purchaserName, Platform purchasePlatform)
{ {
this.ProductSkuList = productSkuList; this.ProductSkuList = productSkuList;
//this.Product = product; //this.Product = product;
this.PurchaserId = purchaserId; this.PurchaserId = purchaserId;
this.PurchaserName = purchaserName; this.PurchaserName = purchaserName;
this.PurchasePlatform = purchasePlatform;
} }
protected override void Load() protected override void Load()
@ -88,48 +98,48 @@ namespace BBWY.Client.ViewModels
if (!string.IsNullOrEmpty(PurchaserId)) if (!string.IsNullOrEmpty(PurchaserId))
{ {
IsLoading = true; IsLoading = true;
Task.Factory.StartNew(() => purchaseService.GetPurchaseSchemeList(ProductSkuList.Select(s => s.Id).ToList(), PurchaserId, globalContext.User.Shop.ShopId)).ContinueWith(r => Task.Factory.StartNew(() => purchaseService.GetPurchaseSchemeList(ProductSkuList.Select(s => s.Id).ToList(), PurchaserId, globalContext.User.Shop.ShopId, purchasePlatform: PurchasePlatform)).ContinueWith(r =>
{ {
var apiResponse = r.Result; var apiResponse = r.Result;
if (!apiResponse.Success) if (!apiResponse.Success)
{ {
App.Current.Dispatcher.BeginInvoke((Action)delegate App.Current.Dispatcher.BeginInvoke((Action)delegate
{ {
MessageBox.Show(apiResponse.Msg, "查询采购方案"); MessageBox.Show(apiResponse.Msg, "查询采购方案");
}); });
IsLoading = false; IsLoading = false;
return; return;
} }
var purchaseSchemeList = apiResponse.Data; var purchaseSchemeList = apiResponse.Data;
var waitList = new List<EventWaitHandle>(); var waitList = new List<EventWaitHandle>();
foreach (var sku in ProductSkuList) foreach (var sku in ProductSkuList)
{ {
//当前SKU下当前采购商的采购方案 //当前SKU下当前采购商的采购方案
var apiScheme = purchaseSchemeList.FirstOrDefault(s => s.SkuId == sku.Id && s.PurchaserId == PurchaserId); var apiScheme = purchaseSchemeList.FirstOrDefault(s => s.SkuId == sku.Id && s.PurchaserId == PurchaserId);
if (apiScheme == null) if (apiScheme == null)
continue; continue;
sku.SelectedPurchaseScheme = PurchaseScheme.Convert(apiScheme); sku.SelectedPurchaseScheme = PurchaseScheme.Convert(apiScheme);
var ewh = new ManualResetEvent(false); var ewh = new ManualResetEvent(false);
waitList.Add(ewh); waitList.Add(ewh);
Task.Factory.StartNew(() => Task.Factory.StartNew(() =>
{ {
foreach (var purchaseSchemeProduct in sku.SelectedPurchaseScheme.PurchaseSchemeProductList) foreach (var purchaseSchemeProduct in sku.SelectedPurchaseScheme.PurchaseSchemeProductList)
{ {
purchaseSchemeProduct.IsEditing = false; purchaseSchemeProduct.IsEditing = false;
LoadPurchaseProduct(sku.SelectedPurchaseScheme.PurchasePlatform, purchaseSchemeProduct, purchaseSchemeProduct.PurchaseProductId, null, out _); LoadPurchaseProduct(sku.SelectedPurchaseScheme.PurchasePlatform, purchaseSchemeProduct, purchaseSchemeProduct.PurchaseProductId, null, out _);
} }
ewh.Set(); ewh.Set();
ewh.Dispose(); ewh.Dispose();
}); });
} }
WaitHandle.WaitAll(waitList.ToArray()); WaitHandle.WaitAll(waitList.ToArray());
IsLoading = false; IsLoading = false;
}); });
} }
} }
@ -243,20 +253,6 @@ namespace BBWY.Client.ViewModels
// }).ToList(); // }).ToList();
//} //}
private string GetSkuLogo(JToken skuJToken, JArray prop_img)
{
if (!prop_img.HasValues)
return "pack://application:,,,/Resources/Images/defaultItem.png";
var properties = skuJToken.Value<string>("properties").Split(';', StringSplitOptions.RemoveEmptyEntries);
foreach (var p in properties)
{
var imgJToken = prop_img.FirstOrDefault(g => g.Value<string>("properties") == p);
if (imgJToken != null)
return imgJToken.Value<string>("url");
}
return "pack://application:,,,/Resources/Images/defaultItem.png";
}
private void AddPurchaseProduct(ProductSku productSku) private void AddPurchaseProduct(ProductSku productSku)
{ {
if (productSku.PurchaseSchemeList.Count > 4) if (productSku.PurchaseSchemeList.Count > 4)
@ -271,7 +267,7 @@ namespace BBWY.Client.ViewModels
{ {
ProductId = productSku.ProductId, ProductId = productSku.ProductId,
SkuId = productSku.Id, SkuId = productSku.Id,
PurchasePlatform = Platform. PurchasePlatform = PurchasePlatform
}; };
} }
else if (productSku.SelectedPurchaseScheme.PurchaseSchemeProductList.Count >= 4) else if (productSku.SelectedPurchaseScheme.PurchaseSchemeProductList.Count >= 4)
@ -309,7 +305,10 @@ namespace BBWY.Client.ViewModels
MessageBox.Show("商品url不能为空"); MessageBox.Show("商品url不能为空");
return; 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) if (!match.Success)
{ {
MessageBox.Show("未能识别的url"); MessageBox.Show("未能识别的url");

2
BBWY.Client/ViewModels/Ware/WareManagerViewModel.cs

@ -306,7 +306,7 @@ namespace BBWY.Client.ViewModels
private void OpenBindingView(Product product, string purchaserId, string purchaserName) private void OpenBindingView(Product product, string purchaserId, string purchaserName)
{ {
var skuList = product.SkuList; var skuList = product.SkuList;
bindingPurchaseProduct.SetData(skuList, purchaserId, purchaserName); bindingPurchaseProduct.SetData(skuList, purchaserId, purchaserName, product.SelectedPurchasePlatformModel);
var bindingView = new Views.Ware.BindingPurchaseProduct(); var bindingView = new Views.Ware.BindingPurchaseProduct();
var r = bindingView.ShowDialog(); var r = bindingView.ShowDialog();
if (r == true) if (r == true)

1
BBWY.Server.Business/PlatformSDK/JDBusiness.cs

@ -208,7 +208,6 @@ namespace BBWY.Server.Business
public override IList<JToken> GetOrderList(SearchPlatformOrderRequest searchOrderRequest) public override IList<JToken> GetOrderList(SearchPlatformOrderRequest searchOrderRequest)
{ {
//logger.Info($"searchOrderRequest ${JsonConvert.SerializeObject(searchOrderRequest)}");
if (searchOrderRequest.StartDate == null || searchOrderRequest.EndDate == null) if (searchOrderRequest.StartDate == null || searchOrderRequest.EndDate == null)
throw new BusinessException("缺少开始/结束日期"); throw new BusinessException("缺少开始/结束日期");
if ((searchOrderRequest.EndDate.Value - searchOrderRequest.StartDate.Value).TotalDays > 30) if ((searchOrderRequest.EndDate.Value - searchOrderRequest.StartDate.Value).TotalDays > 30)

68
BBWY.Test/Program.cs

@ -45,44 +45,42 @@ namespace BBWY.Test
//var token = "44c19a1c1fbd4641957e6e8985ed1358jmtl"; //森王玩具 //var token = "44c19a1c1fbd4641957e6e8985ed1358jmtl"; //森王玩具
//var qtAppId = "BBWY2023022001"; var qtAppId = "BBWY2023022001";
//var qtAppSecret = "908e131365d5448ca651ba20ed7ddefe"; var qtAppSecret = "908e131365d5448ca651ba20ed7ddefe";
//var url = "https://qt.qiyue666.com/api/platform/product/spu/208"; var url = "https://qt.qiyue666.com/api/platform/product/spu/208";
//var callTime = DateTime.Now.ToString("yyyyMMddHHmmss"); var callTime = DateTime.Now.ToString("yyyyMMddHHmmss");
//var randomNum = new Random().Next(100000, 999999).ToString(); var randomNum = new Random().Next(100000, 999999).ToString();
//var p = new object[] { }; var p = new object[] { };
//var jmStr = JsonConvert.SerializeObject(new QuanTanSignParam() var jmStr = JsonConvert.SerializeObject(new QuanTanSignParam()
//{ {
// appId = qtAppId, appId = qtAppId,
// appSecret = qtAppSecret, appSecret = qtAppSecret,
// callTime = callTime, callTime = callTime,
// _params = JsonConvert.SerializeObject(p), _params = JsonConvert.SerializeObject(p),
// randomNum = randomNum randomNum = randomNum
//}); });
//var md5Str = Md5Encrypt(jmStr); var md5Str = Md5Encrypt(jmStr);
//var qtToken = $"{qtAppId}-{callTime}-{md5Str}-{randomNum}"; 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");
// using (var response = httpClient.SendAsync(request).Result) var qtRequestParam = new QuanTanRequestParam()
// { {
// var result = response.Content.ReadAsStringAsync().Result; Params = p,
// Console.WriteLine(result); 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(); Console.ReadKey();
} }

10
BBWY.sln

@ -42,6 +42,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InDll2", "InDll2\InDll2.csp
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BBWY.WebSocket.Server", "BBWY.WebSocket.Server\BBWY.WebSocket.Server.csproj", "{4E08D6A8-5670-4890-B775-2A10017201FD}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BBWY.WebSocket.Server", "BBWY.WebSocket.Server\BBWY.WebSocket.Server.csproj", "{4E08D6A8-5670-4890-B775-2A10017201FD}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuanTan.SDK", "QuanTan.SDK\QuanTan.SDK.csproj", "{49263249-1802-4BF1-9268-B80E9D69BCFC}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU 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|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.ActiveCfg = Release|Any CPU
{4E08D6A8-5670-4890-B775-2A10017201FD}.Release|x86.Build.0 = 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 EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

58
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<T> SendRequest<T>(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<QuanTanResponse<T>>(restApiResult.Content);
}
catch (Exception ex)
{
return new QuanTanResponse<T>() { Status = 0, Message = ex.Message };
}
}
}
}

17
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<QuanTanProductResponse> GetProductInfo(string productId, string appId, string appSecret)
{
return SendRequest<QuanTanProductResponse>($"api/platform/product/spu/{productId}", null, appId, appSecret);
}
}
}

85
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));
}
}
}

25
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; }
}
}

51
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<QuanTanProductSku> ProductSku { get; set; }
}
public class QuanTanProduct
{
public string ProductId { get; set; }
/// <summary>
/// 商品名称(完整标题)
/// </summary>
public string ProductName { get; set; }
/// <summary>
/// 商品简介
/// </summary>
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; }
}
}

16
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<T> : QuanTanResponse
{
public new T Data { get; set; }
}
}

11
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; }
}
}

16
QuanTan.SDK/QuanTan.SDK.csproj

@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\BBWY.Common\BBWY.Common.csproj" />
</ItemGroup>
</Project>
Loading…
Cancel
Save