跳转到内容

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

Released under the MIT License.