#include "../pch/pch.h" #include "CZhipuziHttpClient.h" #include "rapidjson/document.h" #include "rapidjson/prettywriter.h" #include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h" using namespace rapidjson; #include "../helper/MD5.h" CZhipuziHttpClient CZhipuziHttpClient::m_client; CZhipuziHttpClient::CZhipuziHttpClient() { } CZhipuziHttpClient::~CZhipuziHttpClient() { } void CZhipuziHttpClient::Init(std::string username, std::string password) { m_client.m_username = username; m_client.m_password = password; } bool CZhipuziHttpClient::Login(std::string& errmsg) { std::map params; std::string response; bool ret = m_client.Request("/login/login", params, response); if (!ret) { //网络请求出错 LOG_INFO("network failed!"); errmsg = "network failed!"; return false; } LOG_INFO("response:" << response.c_str()); rapidjson::Document document; document.Parse(response.c_str()); if (!document.IsObject()) { LOG_INFO("message 非法!"); errmsg = "message 非法!"; return false; } rapidjson::Value& v_errcode = document["errcode"]; int errcode = v_errcode.GetInt(); if (errcode > 0) { LOG_INFO("login failed! message:" << document["errmsg"].GetString()); errmsg = std::string(document["errmsg"].GetString()); return false; } LOG_INFO("login success!"); return true; } bool CZhipuziHttpClient::Request(std::string url, std::map params, std::string& response) { std::string timestamp = to_string(time(NULL)); std::string nonce = "12345"; std::string machinecode = "e6bc5694877b2aec"; std::string lwm_appid = "84b19199fd221a78c491cd553cbb4ab7"; std::string open_secret = "#repast!@#AfAS#@!"; std::string upper_passowrd = m_password; transform(upper_passowrd.begin(), upper_passowrd.end(), upper_passowrd.begin(), ::toupper); //先添加默认参数,用于计算签名 params["machinecode"] = machinecode; params["username"] = m_username; params["password"] = upper_passowrd; params["lwm_appid"] = "84b19199fd221a78c491cd553cbb4ab7"; params["nonce"] = nonce; params["timestamp"] = timestamp; //计算签名 std::string postString; for (std::map::iterator it = params.begin(); it != params.end(); ) { postString += it->first + "=" + it->second; it++; if (it != params.end()) { postString += "&"; } } LOG_INFO("postString:" << postString.c_str()); //用于计算签名的临时变量 string tmp = md5(postString); tmp += open_secret; std::string sign = md5(tmp); transform(sign.begin(), sign.end(), sign.begin(), ::toupper); LOG_INFO("sign:" << sign.c_str()); //加上签名,去掉url,计算post params["sign"] = sign; postString = ""; for (std::map::iterator it = params.begin(); it != params.end(); ) { postString += it->first + "=" + it->second; it++; if (it != params.end()) { postString += "&"; } } LOG_INFO("postString:" << postString.c_str()); int ret = m_httpClient.Posts(m_url + url, postString, response, NULL); LOG_INFO("response:" << response.c_str()); if (ret == 0) { //ret为0表示没有出错 return true; } return false; /* rapidjson::Document doc; doc.SetObject(); rapidjson::Document::AllocatorType &allocator = doc.GetAllocator(); //获取分配器 doc.AddMember(rapidjson::StringRef("useranme"), rapidjson::StringRef(m_username.c_str()), allocator); doc.AddMember(rapidjson::StringRef("timestamp"), rapidjson::StringRef(timestamp.c_str()), allocator); doc.AddMember(rapidjson::StringRef("nonce"), rapidjson::StringRef(nonce.c_str()), allocator); doc.AddMember(rapidjson::StringRef("machinecode"), rapidjson::StringRef(machinecode.c_str()), allocator); rapidjson::StringBuffer buffer; rapidjson::Writer writer(buffer); doc.Accept(writer); std::string json = std::string(buffer.GetString()); LOG_INFO("json:" << json.c_str());*/ }