|
#include<codecvt>
|
#include<list>
|
#include<string>
|
#include"StringUtil.h"
|
#include"NetworkApi.h"
|
#include "JsonUtil.h"
|
#include <chrono>
|
#include <ctime>
|
#include <random>
|
#include "md5.h"
|
#include <sstream>
|
#include <iostream>
|
#include <iomanip>
|
|
|
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<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) {
|
std::cout << "¼ü: " << itr->name.GetString() << ", Öµ: ";
|
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;
|
}
|
|
|
//ÍøÂçÇëÇó
|
std::string NetworkApi::base_request(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();
|
|
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<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 L"ÍøÂçÇëÇó³ö´í";
|
}
|
}
|
|
void NetworkApi::__request(std::string code, int type) {
|
rapidjson::StringBuffer buf;
|
rapidjson::PrettyWriter<rapidjson::StringBuffer> 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<rapidjson::UTF16<>> root = JsonUtil::parseUTF16(result);
|
if (root[_T("code")].GetInt() != 0) {
|
throw wstring(root[_T("msg")].GetString());
|
}
|
|
}
|
|
std::list<wstring> NetworkApi::__request_list(int type) {
|
rapidjson::StringBuffer buf;
|
rapidjson::PrettyWriter<rapidjson::StringBuffer> 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<rapidjson::UTF16<>> root;
|
root.Parse(wresult.c_str());
|
std::list<wstring> 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<rapidjson::StringBuffer> 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<rapidjson::UTF16<>> 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<rapidjson::StringBuffer> 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<rapidjson::StringBuffer> 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<rapidjson::UTF16<>> 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<rapidjson::StringBuffer> 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<rapidjson::UTF16<>> 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<rapidjson::StringBuffer> 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<rapidjson::UTF16<>> 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<wstring> NetworkApi::list_white() {
|
return __request_list(302);
|
}
|
//ºÚÃûµ¥Áбí
|
std::list<wstring> NetworkApi::list_black() {
|
return __request_list(301);
|
}
|
// ÔÝÍ£ÂòÈëÁбí
|
std::list<wstring> NetworkApi::list_pause_buy() {
|
return __request_list(413);
|
}
|
//ÏëÂòÁбí
|
std::list<wstring> 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<rapidjson::StringBuffer> 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<rapidjson::UTF16<>> 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<rapidjson::StringBuffer> 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<rapidjson::UTF16<>> 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<rapidjson::StringBuffer> 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<rapidjson::StringBuffer> 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<rapidjson::UTF16<>> 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"");
|
}
|