old_flsystem/类库/Api.Framework/Cps/BaseCpsApi.cs

257 lines
8.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//=============================================================
// 创建人:千年老妖
// 本页代码,均为原创。对未经许可擅自使用者,本人保留追究其法律责任的权利。
//==============================================================
using Api.Framework.Model;
using Api.Framework.Tools;
using Api.Framework.Utils;
using CsharpHttpHelper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace Api.Framework.Cps
{
/// <summary>
/// CpsApi基础类
/// </summary>
public class BaseCpsApi
{
/// <summary>
/// cps数据对象
/// </summary>
public fl_cps_member Member { get; protected set; }
private CpsToken _token = null;
private static SynchronizedDictionary<string, CpsToken> Tokens = new SynchronizedDictionary<string, CpsToken>();
/// <summary>
/// 删除Token缓存
/// </summary>
internal void ClearToken()
{
string key = $"{Member.username}_{(int)Member.cpstype}";
if (Tokens.ContainsKey(key)) Tokens.Remove(key);
_token = null;
}
/// <summary>
/// 获取重新获取token
/// </summary>
/// <returns></returns>
internal CpsToken GetToken()
{
try
{
for (int i = 0; i <= 5; i++)
{
var result = SendServer("get_token", new { username = Member.username, enc_result = true });
if (result != null)
{
LogHelper.GetSingleObj().Debug("新token", $"{Member.cpstype.ToString()} {Member.usernick}({Member.username})" + " " + JsonConvert.SerializeObject(result));
if (result.ok)
{
return HttpHelper.JsonToObject<CpsToken>(result.message.ToString()) as CpsToken;
}
else
return null;
}
Thread.Sleep(15);
}
}
catch (Exception ex)
{
throw ex;
}
return null;
}
/// <summary>
/// 重新获取Token
/// </summary>
/// <returns></returns>
internal bool RefToken()
{
#region xxx
//try
//{
// int number = 0;
//Next:
// number++;
// var result = SendServer("get_token", new { username = Member.username, enc_result = true });
// if (result == null && number <= 5)
// {
// Thread.Sleep(10);
// goto Next;
// }
// _token = HttpHelper.JsonToObject<CpsToken>(result.message.ToString()) as CpsToken;
// if (_token != null)
// {
// string key = $"{Member.username}_{(int)Member.cpstype}";
// if (Tokens.ContainsKey(key)) Tokens.Add(key, _token);
// else Tokens[key] = _token;
// }
//}
//catch (Exception ex)
//{
// throw ex;
//}
#endregion
#region
try
{
var new_token = GetToken();
if (new_token == null) return false;
//本机没有值拉取服务器Token
if (_token == null)
{
_token = new_token;
SetToken(_token);
if (Member != null) Member.is_valid = true;
return true;
}
else
{
//和本机一致,返回False 表示没有新Token
if (_token.access_token == new_token.access_token)
return false;
_token = new_token;
SetToken(_token);
if (Member != null)
Member.is_valid = true;
return true;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
LogHelper.GetSingleObj().Debug("", $"唯品会获取新的Token: username = {_token?.username},appid = {_token?.appid},access_token = {_token?.access_token}");
}
#endregion
return false;
}
/// <summary>
/// 设置Token
/// </summary>
/// <param name="cpsToken"></param>
private void SetToken(CpsToken cpsToken)
{
if (cpsToken != null)
{
string key = $"{Member.username}_{(int)Member.cpstype}";
if (!Tokens.ContainsKey(key)) Tokens.Add(key, cpsToken);
else Tokens[key] = cpsToken;
}
}
/// <summary>
/// 操作Token
/// </summary>
internal CpsToken Token
{
get
{
if (_token == null)
{
string key = $"{Member.username}_{(int)Member.cpstype}";
if (Tokens.ContainsKey(key)) _token = Tokens[key];
else RefToken();
}
return _token;
}
}
internal BaseCpsApi(fl_cps_member member)
{
this.Member = member;
//if (this.Member.cpstype == Enums.CpsType.阿里妈妈)
//{
// this.RefToken();
//}
}
/// <summary>
/// 请求报文
/// </summary>
/// <param name="method"></param>
/// <param name="target"></param>
/// <param name="param"></param>
/// <returns></returns>
public WebResult SendServer(string method, string target = "", object param = null)
{
if (string.IsNullOrEmpty(target))
{
var type = this.GetType();
if (type == typeof(AlimamaApi)) target = "alimama.asmx";
else if (type == typeof(PinduoduoApi)) target = "pinduoduo.asmx";
else if (type == typeof(JingdongApi)) target = "jingdong.asmx";
else if (type == typeof(WeipinhuiApi)) target = "weipinhui.asmx";
else if (type == typeof(DouyinApi)) target = "douyin.asmx";
else if (type == typeof(KuaiShouApi)) target = "kuaishou.asmx";
else throw new Exception("暂时不支持类型:" + target);
}
AuthEndpoint end = new AuthEndpoint()
{
Appid = CpsClient._appid,
Enckey = CpsClient._key,
Host = CpsClient._host + "api/" + target + "/send_data",
Method = method
};
if (param != null)
{
var _param = param.GetType().GetProperties();
foreach (var item in _param)
{
end.Param[item.Name] = item.GetValue(param);
}
}
HttpHelper http = new HttpHelper();
WebResult result = null;
try
{
result = http.SendData(end);
return result;
}
catch (Exception ex)
{
LogHelper.GetSingleObj().Error("cps请求异常",
ex.Message + $"{result?.message}");
if (ex.Message == "未将对象引用设置到对象的实例。")
return null;
else
throw ex;
}
finally
{
//LogHelper.GetSingleObj().Error("cps请求异常..", $"{result?.message} => {JsonConvert.SerializeObject(end)}");
}
}
/// <summary>
/// 发送API数据
/// </summary>
/// <param name="method">API接口</param>
/// <param name="param">参数</param>
/// <returns></returns>
public WebResult SendServer(string method, object param = null)
{
return SendServer(method, "", param);
}
}
}