using Apimanager_backend.Dtos; using Newtonsoft.Json; using System.Security.Cryptography; using System.Text; namespace Apimanager_backend.Tools { public static class EpayHelper { /// /// 创建签名 /// public static string CreateSign(Dictionary parameters, string key) { var sorted = parameters .Where(kv => !string.IsNullOrEmpty(kv.Value) && kv.Key != "sign" && kv.Key != "sign_type") .OrderBy(kv => kv.Key) .ToList(); string query = string.Join("&", sorted.Select(kv => $"{kv.Key}={kv.Value}")); string toSign = query + key; using (var md5 = MD5.Create()) { byte[] hash = md5.ComputeHash(Encoding.UTF8.GetBytes(toSign)); return BitConverter.ToString(hash).Replace("-", "").ToLower(); } } /// /// 发起API支付(返回 json) /// public static async Task ApiPayAsync(Dictionary parameters, string key,string baseUrl) { parameters["sign_type"] = "MD5"; parameters["sign"] = CreateSign(parameters, key); using var client = new HttpClient(); var content = new FormUrlEncodedContent(parameters); var response = await client.PostAsync($"{baseUrl}/mapi.php", content); var responseJson = await response.Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject(responseJson); } /// /// 校验签名(通常用于异步通知/页面跳转) /// public static bool VerifySign(Dictionary parameters, string key) { if (!parameters.TryGetValue("sign", out string originalSign)) return false; string newSign = CreateSign(parameters, key); return originalSign.Equals(newSign, StringComparison.OrdinalIgnoreCase); } } }