C# 示例
此 C# 示例基于 .NET Core,使用 HttpClient 请求 API
签名类实现
csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
public static class Signature
{
public static string Sign(Dictionary<string, string> parameters, string apiToken)
{
var sorted = parameters
.Where(kv => kv.Key != "sign" && !string.IsNullOrEmpty(kv.Value))
.OrderBy(kv => kv.Key);
var sb = new StringBuilder();
sb.Append(apiToken);
foreach (var kv in sorted)
{
sb.Append($"&{kv.Key}={kv.Value}");
}
using (var md5 = MD5.Create())
{
var hash = md5.ComputeHash(Encoding.UTF8.GetBytes(sb.ToString()));
return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
}
}
}请求下单
以下是代收下单请求,代付请求相似
csharp
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
public class OrderRequest
{
private static readonly HttpClient client = new HttpClient();
public static async Task Main()
{
var parameters = new Dictionary<string, string>
{
{ "mch_id", "2050" }, // 商户ID
{ "trans_id", "E1763923463" }, // 交易ID
{ "channel", "bank" }, // 通道
{ "amount", "200000.00" }, // 金额
{ "currency", "VND" }, // 币种
{ "callback_url", "https://api.blackhole.com" }, // 回调地址
{ "remarks", "callme" }, // 备注
{ "nonce", Guid.NewGuid().ToString().Substring(0, 8) }, // 随机串
{ "timestamp", DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString() }
};
string apiToken = "0xFAKE_TOKENx0";
parameters["sign"] = Signature.Sign(parameters, apiToken);
var jsonContent = JsonSerializer.Serialize(parameters);
var content = new StringContent(jsonContent, Encoding.UTF8, "application/json");
try
{
var response = await client.PostAsync("http://接口域名/api/v1/mch/pmt-orders", content);
var responseBody = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
// todo: 请求失败处理
Console.WriteLine($"HTTP错误: {response.StatusCode}");
}
else
{
var result = JsonSerializer.Deserialize<Dictionary<string, object>>(responseBody);
if (result != null && result.TryGetValue("code", out var code) && Convert.ToInt32(code) == 200)
{
// todo: 请求成功处理
Console.WriteLine("请求成功");
}
else
{
// todo: 请求失败原因
Console.WriteLine($"失败原因: {result?["message"]}");
}
}
}
catch (Exception ex)
{
// todo: 异常处理
Console.WriteLine($"异常: {ex.Message}");
}
}
}