ql_apimanager_backend/Apimanager_backend/Tools/EpayHelper.cs

54 lines
2.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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