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