using System.IO;
using System.Linq;
using System.Threading.Tasks;
using PaySharp.Core.Utils;
namespace PaySharp.Core
{
///
/// 网关通知的处理类,通过对返回数据的分析识别网关类型
///
internal static class NotifyProcess
{
///
/// 是否是Xml格式数据
///
///
private static bool IsXmlData => HttpUtil.ContentType == "text/xml" || HttpUtil.ContentType == "application/xml";
///
/// 是否是GET请求
///
///
private static bool IsGetRequest => HttpUtil.RequestType == "GET";
///
/// 获取网关
///
/// 网关列表
///
public static async Task GetGatewayAsync(IGateways gateways)
{
var gatewayData = await ReadNotifyDataAsync();
BaseGateway gateway = null;
foreach (var item in gateways.GetList())
{
if (ExistParameter(item.NotifyVerifyParameter, gatewayData))
{
if (item.Merchant.AppId == gatewayData
.GetStringValue(item.NotifyVerifyParameter.FirstOrDefault()))
{
gateway = item;
break;
}
}
}
if (gateway is null)
{
gateway = new NullGateway();
}
gateway.GatewayData = gatewayData;
return gateway;
}
///
/// 网关参数数据项中是否存在指定的所有参数名
///
/// 参数名数组
/// 网关数据
public static bool ExistParameter(string[] parmaName, GatewayData gatewayData)
{
var compareCount = 0;
foreach (var item in parmaName)
{
if (gatewayData.Exists(item))
{
compareCount++;
}
}
return compareCount == parmaName.Length;
}
///
/// 读取网关发回的数据
///
///
public static async Task ReadNotifyDataAsync()
{
var gatewayData = new GatewayData();
if (IsGetRequest)
{
gatewayData.FromUrl(HttpUtil.QueryString);
}
else
{
if (IsXmlData)
{
var reader = new StreamReader(HttpUtil.Body);
var xmlData = await reader.ReadToEndAsync();
gatewayData.FromXml(xmlData);
}
else
{
try
{
#if NETCOREAPP3_1
gatewayData.FromForm(HttpUtil.Form);
#else
gatewayData.FromNameValueCollection(HttpUtil.Form);
#endif
}
catch { }
}
}
return gatewayData;
}
}
}