54 lines
2.0 KiB
C#
54 lines
2.0 KiB
C#
using Apimanager_backend.Dtos;
|
||
using Newtonsoft.Json;
|
||
using System.Security.Cryptography;
|
||
using System.Text;
|
||
|
||
namespace Apimanager_backend.Tools
|
||
{
|
||
public static class EpayHelper
|
||
{
|
||
/// <summary>
|
||
/// 创建签名
|
||
/// </summary>
|
||
public static string CreateSign(Dictionary<string, string> 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();
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 发起API支付(返回 json)
|
||
/// </summary>
|
||
public static async Task<EpayResponse?> ApiPayAsync(Dictionary<string, string> 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);
|
||
return JsonConvert.DeserializeObject<EpayResponse>(await response.Content.ReadAsStringAsync());
|
||
}
|
||
|
||
/// <summary>
|
||
/// 校验签名(通常用于异步通知/页面跳转)
|
||
/// </summary>
|
||
public static bool VerifySign(Dictionary<string, string> parameters, string key)
|
||
{
|
||
if (!parameters.TryGetValue("sign", out string originalSign)) return false;
|
||
string newSign = CreateSign(parameters, key);
|
||
return originalSign.Equals(newSign, StringComparison.OrdinalIgnoreCase);
|
||
}
|
||
}
|
||
}
|