#include "NetworkApi.h"
|
#include <chrono>
|
#include <random>
|
#include "md5.h"
|
#include "SocketManager.h"
|
|
string NetworkApi::_TRADE_SERVER_ADDR ="43.138.167.68";
|
int NetworkApi::_TRADE_SERVER_PORT = 11008;
|
string NetworkApi::_COMMON_SERVER_ADDR;
|
int NetworkApi::_COMMON_SERVER_PORT;
|
|
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<int> 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<string> strList;
|
for (rapidjson::Value::ConstMemberIterator itr = document.MemberBegin(); itr != document.MemberEnd(); ++itr) {
|
if (itr->value.IsObject() || itr->value.IsArray()) {
|
//Èç¹ûÊǶÔÏó
|
rapidjson::StringBuffer buffer;
|
rapidjson::Writer<rapidjson::StringBuffer> 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<string>::iterator el = strList.begin(); el != strList.end(); el++) {
|
src.append(*el);
|
index++;
|
if (index != strList.size()) {
|
src.append("&");
|
}
|
}
|
//MD5
|
//cout << "¼ÓÃÜǰ×Ö·û´®£º" <<src << endl;
|
string md5 = MD5(src).toStr();
|
return md5;
|
}
|
|
|
void NetworkApi::set_server_info(string trade_addr, int trade_port, string common_addr, int common_port)
|
{
|
_TRADE_SERVER_ADDR = trade_addr;
|
_TRADE_SERVER_PORT = trade_port;
|
_COMMON_SERVER_ADDR = common_addr;
|
_COMMON_SERVER_PORT = common_port;
|
}
|
|
std::string NetworkApi::load_request_data(std::string data)
|
{
|
rapidjson::Document document;
|
document.Parse(data.c_str());
|
string requestIdStr = (document["type"].IsInt() ? std::to_string(document["type"].GetInt()) : 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<rapidjson::StringBuffer> 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);
|
return fstr;
|
}
|
|
|
//ÍøÂçÇëÇó
|
std::string NetworkApi::base_request(std::string data) {
|
std::string fstr = load_request_data(data);
|
try {
|
return SocketManager::sendMsg(_COMMON_SERVER_ADDR, _COMMON_SERVER_PORT, fstr.c_str());
|
}
|
catch (...) {
|
throw L"ÍøÂçÇëÇó³ö´í";
|
}
|
}
|
|
std::string NetworkApi::base_trade_request(std::string data)
|
{
|
rapidjson::Document document;
|
document.Parse(data.c_str());
|
string requestIdStr = document["type"].IsInt()? to_string(document["type"].GetInt()) : 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<rapidjson::StringBuffer> 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 wstring(L"ÍøÂçÇëÇó³ö´í");
|
}
|
}
|