← 返回文档首页

⚡ C++ 对接

使用 libcurl + OpenSSL 实现 MD5 签名和 HTTP 请求。

#include 
#include 
#include 
#include 
#include 

const std::string API_BASE = "https://你的域名";
const std::string USERNAME = "你的用户名";
const std::string APP_NAME = "a";
const std::string APP_KEY  = "32位程序密钥";

std::string md5_sign(const std::string& act, const std::string& card,
                     const std::string& mac, const std::string& app,
                     long ts, const std::string& key) {
    std::string raw = act + "|" + card + "|" + mac + "|" + app +
                      "|" + std::to_string(ts) + "|" + key;
    unsigned char digest[MD5_DIGEST_LENGTH];
    MD5((const unsigned char*)raw.c_str(), raw.size(), digest);
    char out[33];
    for (int i = 0; i < MD5_DIGEST_LENGTH; ++i)
        sprintf(out + i*2, "%02x", digest[i]);
    return std::string(out);
}

size_t write_cb(void* p, size_t s, size_t n, void* u) {
    ((std::string*)u)->append((char*)p, s*n);
    return s*n;
}

std::string call(const std::string& act, const std::string& card,
                 const std::string& mac) {
    long ts = std::chrono::duration_cast(
        std::chrono::system_clock::now().time_since_epoch()).count();
    std::string sign = md5_sign(act, card, mac, APP_NAME, ts, APP_KEY);
    char url[1024];
    snprintf(url, sizeof(url),
        "%s/kami/%s/check.php?act=%s&app=%s&card=%s&mac=%s&sign=%s&ts=%ld",
        API_BASE.c_str(), USERNAME.c_str(), act.c_str(), APP_NAME.c_str(),
        card.c_str(), mac.c_str(), sign.c_str(), ts);
    CURL* h = curl_easy_init();
    std::string buf;
    curl_easy_setopt(h, CURLOPT_URL, url);
    curl_easy_setopt(h, CURLOPT_WRITEFUNCTION, write_cb);
    curl_easy_setopt(h, CURLOPT_WRITEDATA, &buf);
    curl_easy_perform(h);
    curl_easy_cleanup(h);
    return buf;
}

int main() {
    std::string card = "ABCD-EFGH-JKLM-NPQR";
    std::string mac  = "MACHINE-CODE";
    std::cout << call("login", card, mac) << std::endl;
    while (true) {
        std::this_thread::sleep_for(std::chrono::seconds(55));
        std::string r = call("heartbeat", card, mac);
        if (r.find("\"code\":0") == std::string::npos) break;
    }
    return 0;
}