#include #include #include #include"StringUtil.h" #include"NetworkApi.h" #include "JsonUtil.h" #include #include #include #include "md5.h" #include #include #include string NetworkApi::_TRADE_SERVER_ADDR = string("111.230.16.67"); int NetworkApi::_TRADE_SERVER_PORT = 10009; string NetworkApi::_COMMON_SERVER_ADDR = string("111.230.16.67"); int NetworkApi::_COMMON_SERVER_PORT = 9001; string NetworkApi::get_rquest_id() { string requestIdStr; std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); // ½«µ±Ç°Ê±¼äµãת»»Îªtime_tÀàÐÍ std::time_t currentTime = std::chrono::system_clock::to_time_t(now); requestIdStr.append("_").append(std::to_string(currentTime)).append("_"); // Éú³ÉËæ»úÊý std::random_device rd; std::mt19937 rng(rd()); std::uniform_int_distribution intDist(1, 100000); // Éú³É·¶Î§ÔÚ1-100Ö®¼äµÄÕûÊý int randomInt = intDist(rng); requestIdStr.append(std::to_string(randomInt)); return requestIdStr; } string NetworkApi::get_sign(rapidjson::Document& document) { //¼ÆËãÇ©Ãû std::list strList; for (rapidjson::Value::ConstMemberIterator itr = document.MemberBegin(); itr != document.MemberEnd(); ++itr) { std::cout << "¼ü: " << itr->name.GetString() << ", Öµ: "; if (itr->value.IsObject() || itr->value.IsArray()) { //Èç¹ûÊǶÔÏó rapidjson::StringBuffer buffer; rapidjson::Writer writer(buffer); itr->value.Accept(writer); std::string jsonString = buffer.GetString(); strList.push_back(string(itr->name.GetString()).append("=").append(jsonString)); } else { if (itr->value.IsString()) { strList.push_back(string(itr->name.GetString()).append("=").append(itr->value.GetString())); } else if (itr->value.IsInt()) { strList.push_back(string(itr->name.GetString()).append("=").append(std::to_string(itr->value.GetInt()))); } } } strList.sort(); strList.push_back("%Yeshi2014@#."); string src = ""; int index = 0; for (std::list::iterator el = strList.begin(); el != strList.end(); el++) { src.append(*el); index++; if (index != strList.size()) { src.append("&"); } } //MD5 //cout << "¼ÓÃÜǰ×Ö·û´®£º" < writer(buffer); document.Accept(writer); std::string jsonString = buffer.GetString(); try { return SocketManager::sendMsg(jsonString.c_str()); } catch (...) { throw L"ÍøÂçÇëÇó³ö´í"; } } std::string NetworkApi::base_trade_request(std::string data) { rapidjson::Document document; document.Parse(data.c_str()); string requestIdStr = string(document["type"].GetString()).append(get_rquest_id()); rapidjson::Document::AllocatorType& allocator = document.GetAllocator(); // Ìí¼Ó request_id ×Ö¶Î rapidjson::Value requestId(rapidjson::kStringType); requestId.SetString(requestIdStr.c_str(), allocator); document.AddMember("request_id", requestId, allocator); // Ìí¼ÓÇ©Ãû£¬sign string sign = get_sign(document); rapidjson::Value signV(rapidjson::kStringType); signV.SetString(sign.c_str(), allocator); document.AddMember("sign", signV, allocator); rapidjson::StringBuffer buffer; rapidjson::Writer writer(buffer); document.Accept(writer); std::string jsonString = buffer.GetString(); //·¢ËÍÊý¾Ý std::stringstream ss; ss << std::setw(8) << std::setfill('0') << jsonString.length(); std::string length_str =string("##").append( ss.str()); std::string fstr = length_str.append(jsonString); try { return SocketManager::sendMsg(_TRADE_SERVER_ADDR, _TRADE_SERVER_PORT, fstr.c_str()); } catch (...) { throw L"ÍøÂçÇëÇó³ö´í"; } } void NetworkApi::__request(std::string code, int type) { rapidjson::StringBuffer buf; rapidjson::PrettyWriter writer(buf); writer.StartObject(); writer.Key("type"); writer.Int(type); writer.Key("data"); writer.StartObject(); writer.Key("codes"); writer.StartArray(); writer.String(code.c_str()); writer.EndArray(); writer.EndObject(); writer.EndObject(); const char* json_content = buf.GetString(); string result = base_request(std::string(json_content)); //JSON½âÎö rapidjson::GenericDocument> root = JsonUtil::parseUTF16(result); if (root[_T("code")].GetInt() != 0) { throw wstring(root[_T("msg")].GetString()); } } std::list NetworkApi::__request_list(int type) { rapidjson::StringBuffer buf; rapidjson::PrettyWriter writer(buf); writer.StartObject(); writer.Key("type"); writer.Int(type); writer.EndObject(); const char* json_content = buf.GetString(); string result = base_request(std::string(json_content)); wstring wresult = StringUtil::Unescape(result); rapidjson::GenericDocument> root; root.Parse(wresult.c_str()); std::list resultList; if (root[_T("code")].GetInt() == 0) { for (rapidjson::SizeType i = 0; i < root[_T("data")].GetArray().Size(); i++) { resultList.push_back(root[_T("data")].GetArray()[i].GetString()); } } return resultList; } //»ñÈ¡´úÂë¼òÒªÐÅÏ¢ wstring NetworkApi::getCodeDesc(std::string code) { rapidjson::StringBuffer buf; rapidjson::PrettyWriter writer(buf); writer.StartObject(); writer.Key("type"); writer.Int(430); writer.Key("data"); writer.StartObject(); writer.Key("code"); writer.String(code.c_str()); writer.EndObject(); writer.EndObject(); const char* json_content = buf.GetString(); std::string result = base_request(std::string(json_content)); cout << "´úÂëÐÅÏ¢£º" << result << endl;; wstring wresult = StringUtil::Unescape(result); rapidjson::GenericDocument> root; root.Parse(wresult.c_str()); if (root[_T("code")].GetInt() == 0) { wstring c = root[_T("data")][_T("code_info")].GetArray()[0].GetString(); wstring name = L""; if (!root[_T("data")][_T("code_info")].GetArray()[1].IsNull()) { name = root[_T("data")][_T("code_info")].GetArray()[1].GetString(); } wstring desc = root[_T("data")][_T("desc")].GetString(); wstring fresult; fresult.append(c).append(L" ").append(name).append(L" ").append(desc); return fresult; } throw L"ÉÐδ»ñÈ¡µ½ÄÚÈÝ"; } // ÉèÖý»Ò×״̬ void NetworkApi::set_buy_state(bool is_open) { rapidjson::StringBuffer buf; rapidjson::PrettyWriter writer(buf); writer.StartObject(); writer.Key("type"); writer.Int(501); writer.Key("data"); writer.StartObject(); writer.Key("open"); writer.Bool(is_open); writer.EndObject(); writer.EndObject(); const char* json_content = buf.GetString(); base_request(std::string(json_content)); } // »ñÈ¡ÂòÈë״̬ bool NetworkApi::get_buy_state() { rapidjson::StringBuffer buf; rapidjson::PrettyWriter writer(buf); writer.StartObject(); writer.Key("type"); writer.Int(502); writer.Key("data"); writer.StartObject(); writer.EndObject(); writer.EndObject(); const char* json_content = buf.GetString(); string result = base_request(std::string(json_content)); //JSON½âÎö rapidjson::GenericDocument> root = JsonUtil::parseUTF16(result); if (root[_T("code")].GetInt() != 0) { throw wstring(root[_T("msg")].GetString()); } else { return root[_T("data")][_T("can_buy")].GetBool(); } } // »ñÈ¡ÂòÈëģʽ int NetworkApi::get_buy_mode() { rapidjson::StringBuffer buf; rapidjson::PrettyWriter writer(buf); writer.StartObject(); writer.Key("type"); writer.Int(504); writer.Key("data"); writer.StartObject(); writer.EndObject(); writer.EndObject(); const char* json_content = buf.GetString(); string result = base_request(std::string(json_content)); //JSON½âÎö rapidjson::GenericDocument> root = JsonUtil::parseUTF16(result); if (root[_T("code")].GetInt() != 0) { throw wstring(root[_T("msg")].GetString()); } else { return root[_T("data")][_T("mode")].GetInt(); } } //ÉèÖÃÂòÈëģʽ void NetworkApi::set_buy_mode(int mode) { rapidjson::StringBuffer buf; rapidjson::PrettyWriter writer(buf); writer.StartObject(); writer.Key("type"); writer.Int(503); writer.Key("data"); writer.StartObject(); writer.Key("mode"); writer.Int(mode); writer.EndObject(); writer.EndObject(); const char* json_content = buf.GetString(); string result = base_request(std::string(json_content)); //JSON½âÎö rapidjson::GenericDocument> root = JsonUtil::parseUTF16(result); if (root[_T("code")].GetInt() != 0) { throw wstring(root[_T("msg")].GetString()); } } // ¼Ó°×Ãûµ¥ void NetworkApi::add_white(string code) { __request(code, 202); } //¼ÓºÚÃûµ¥ void NetworkApi::add_black(string code) { __request(code, 201); } // ¼ÓÔÝÍ£ÂòÈë void NetworkApi::add_pause_buy(string code) { __request(code, 411); } //¼ÓÏëÂò void NetworkApi::add_want_buy(string code) { __request(code, 401); } // ÒÆ³ý°×Ãûµ¥ void NetworkApi::remove_white(string code) { __request(code, 204); } //ÒÆ³ýºÚÃûµ¥ void NetworkApi::remove_black(string code) { __request(code, 203); } // ÒÆ³ýÔÝÍ£ÂòÈë void NetworkApi::remove_pause_buy(string code) { __request(code, 412); } //ÒÆ³ýÏëÂò void NetworkApi::remove_want_buy(string code) { __request(code, 402); } //°×Ãûµ¥Áбí std::list NetworkApi::list_white() { return __request_list(302); } //ºÚÃûµ¥Áбí std::list NetworkApi::list_black() { return __request_list(301); } // ÔÝÍ£ÂòÈëÁбí std::list NetworkApi::list_pause_buy() { return __request_list(413); } //ÏëÂòÁбí std::list NetworkApi::list_want_buy() { return __request_list(403); } // ²éѯÊÇ·ñ¿ÉÒÔ³·µ¥ bool NetworkApi::get_can_cancel_buy(string code) { try { __request(code, 420); return TRUE; } catch (...) { return FALSE; } } // ÂòÈë void NetworkApi::buy(std::string code, int volume, string price) { rapidjson::StringBuffer buf; rapidjson::PrettyWriter writer(buf); writer.StartObject(); writer.Key("type"); writer.String("buy"); writer.Key("data"); writer.StartObject(); writer.Key("code"); writer.String(code.c_str()); writer.Key("volume"); writer.Int(volume); writer.Key("price"); writer.String(price.c_str()); writer.EndObject(); writer.EndObject(); const char* json_content = buf.GetString(); string result = base_trade_request(std::string(json_content)); //JSON½âÎö rapidjson::GenericDocument> root = JsonUtil::parseUTF16(result); if (!root.IsObject()) { throw wstring(L"JSON½âÎö³ö´í"); } if (root[_T("code")].GetInt() != 0) { throw wstring(root[_T("msg")].GetString()); } } // Âô³ö void NetworkApi::sell(string code, int volume, string price, bool forceSell) { rapidjson::StringBuffer buf; rapidjson::PrettyWriter writer(buf); writer.StartObject(); writer.Key("type"); writer.String("sell"); writer.Key("data"); writer.StartObject(); writer.Key("code"); writer.String(code.c_str()); writer.Key("volume"); writer.Int(volume); writer.Key("price"); writer.String(price.c_str()); writer.Key("force"); writer.Int(forceSell ? 1 : 0); writer.EndObject(); writer.EndObject(); const char* json_content = buf.GetString(); string result = base_trade_request(std::string(json_content)); //JSON½âÎö rapidjson::GenericDocument> root = JsonUtil::parseUTF16(result); if (!root.IsObject()) { throw wstring(L"JSON½âÎö³ö´í"); } if (root[_T("code")].GetInt() != 0) { throw wstring(root[_T("msg")].GetString()); } } string NetworkApi::list_delegate_records(CString updateTime,bool canCancel) { rapidjson::StringBuffer buf; rapidjson::PrettyWriter writer(buf); writer.StartObject(); writer.Key("type"); writer.String("delegate_list"); writer.Key("data"); writer.StartObject(); writer.Key("update_time"); writer.String(StringUtil::cstring2String (updateTime).c_str()); writer.Key("can_cancel"); writer.Int(canCancel ? 1 : 0); writer.EndObject(); writer.EndObject(); const char* json_content = buf.GetString(); string result = base_trade_request(std::string(json_content)); return result; } void NetworkApi::cancel_order(CString code, CString orderSysID,CString accountID) { rapidjson::StringBuffer buf; rapidjson::PrettyWriter writer(buf); writer.StartObject(); writer.Key("type"); writer.String("cancel_order"); writer.Key("data"); writer.StartObject(); writer.Key("code"); writer.String(StringUtil::cstring2String(code).c_str()); writer.Key("orderSysID"); writer.String(StringUtil::cstring2String(orderSysID).c_str()); writer.Key("accountId"); writer.String(StringUtil::cstring2String(accountID).c_str()); writer.EndObject(); writer.EndObject(); const char* json_content = buf.GetString(); string result = base_trade_request(std::string(json_content)); rapidjson::GenericDocument> root = JsonUtil::parseUTF16(result); if (root.IsObject() ) { if (root[L"code"].GetInt() == 0) { return ; } else { throw CString(root[L"msg"].GetString()); } } else { throw CString(L"json½âÎö³ö´í"); } return ; } // ³·µ¥ void NetworkApi::cancel_buy(CString code) { return cancel_order(code, L"",L""); }