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