技术文档

C# 对接卡密验证

签名校验 + 心跳机制,完整客户端实现

本文档提供 C# 语言调用卡密验证接口的完整实现,包含 MD5 签名生成、响应验签、时间戳防重放以及心跳参数 heart=1 的使用示例。

完整实现代码

以下 KamiClient 类封装了卡密验证的核心逻辑,支持异步调用,可直接集成到您的 .NET 项目中。

// C# 卡密验证客户端(.NET Standard 2.0+)
using System;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

public class KamiClient
{
    private readonly string _baseUrl;
    private readonly string _app;
    private readonly string _signKey;

    public KamiClient(string userName, string app, string signKey)
    {
        _baseUrl = $"https://www.keyt.cn/kami/{userName}/check.php";
        _app = app;
        _signKey = signKey;
    }

    private string Md5(string input)
    {
        using var md5 = MD5.Create();
        var bytes = Encoding.UTF8.GetBytes(input);
        var hash = md5.ComputeHash(bytes);
        return BitConverter.ToString(hash).Replace("-", "").ToLower();
    }

    private string VerifyResponse(string raw)
    {
        if (!raw.Contains("|sign=")) return null;
        var parts = raw.Split(new[] { "|sign=" }, StringSplitOptions.None);
        var body = parts[0];
        var sign = parts[1];

        var localSign = Md5(body + _signKey);
        if (localSign != sign) return null;

        var lastPipe = body.LastIndexOf('|');
        if (lastPipe == -1) return null;
        var tsStr = body.Substring(lastPipe + 1);
        if (!long.TryParse(tsStr, out var ts)) return null;
        var nowTs = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
        if (Math.Abs(nowTs - ts) > 120) return null;

        return body.Substring(0, lastPipe);
    }

    public async Task<string> VerifyCardAsync(string card, string mac)
    {
        var url = $"{_baseUrl}?card={card}&mac={mac}&app={_app}&heart=1&t={DateTimeOffset.UtcNow.ToUnixTimeSeconds()}";
        using var client = new HttpClient();
        var resp = await client.GetStringAsync(url);
        return VerifyResponse(resp);
    }
}

核心功能说明

  • MD5 签名Md5(body + _signKey) 确保响应未被篡改。
  • 时间戳防重放:校验返回内容中的时间戳,与本地 UTC 时间差值不超过 120 秒。
  • 心跳支持:请求 URL 中包含 heart=1 参数,用于保持会话活跃(具体逻辑依后端配置)。
  • 异步调用VerifyCardAsync 方法支持 async/await,适合 UI 或服务端编程。

提示: 使用前请将 userNameappsignKey 替换为后台分配的实际值。完整对接流程请参考 文档首页