#pragma once ////////////////////////////////// HttpClient.cpp #include "StdAfx.h" #include "Shop.h" #include "AttemperEngineSink.h" #include "ShowTime.h" #include "GameServer.h" #include "GameServerDlg.h" #include "curl/curl.h" #include #include #include "ServiceUnits.h" #include "ChineseCode.h" #include "../Json/json.h" #include "JsonBusiness.h" #include "../../MessageDef/Pb_UserInfo.pb.h" #include "../../../../消息定义/CMD_Sparrow.h" #define BUFFER_SIZE 1024 #define NORMAL_CONNECT INTERNET_FLAG_KEEP_CONNECTION #define SECURE_CONNECT NORMAL_CONNECT | INTERNET_FLAG_SECURE #define NORMAL_REQUEST INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE #define SECURE_REQUEST NORMAL_REQUEST | INTERNET_FLAG_SECURE | INTERNET_FLAG_IGNORE_CERT_CN_INVALID HANDLE CHttpClient::m_hThread = NULL; unsigned CHttpClient::m_uiThreadID = 0; HANDLE CHttpClient::g_Event; // 触发事件句柄 CAttemperEngineSink* CHttpClient::pCAttemperEngineSink = NULL; //调度钩子 bool CHttpClient::m_bRun = true;// 关闭 std::unordered_map CHttpClient::GetData; CCriticalSection CHttpClient::m_CriticalSection; extern CGameServerApp theApp; void* CHttpClient::curl = NULL; CHttpClient::CHttpClient(LPCTSTR strAgent) : m_bDebug(false) { m_pSession = new CInternetSession(strAgent); INTERNET_PROXY_INFO ipi; ZeroMemory(&ipi, sizeof(ipi)); ipi.dwAccessType = INTERNET_OPEN_TYPE_DIRECT; ipi.lpszProxyBypass = NULL; m_pSession->SetOption(INTERNET_OPEN_TYPE_DIRECT, &ipi, sizeof(ipi), 0); m_pConnection = NULL; m_pFile = NULL; } CHttpClient::~CHttpClient(void) { Clear(); if (NULL != m_pSession) { m_pSession->Close(); delete m_pSession; m_pSession = NULL; } } void CHttpClient::Clear() { if (NULL != m_pFile) { m_pFile->Close(); delete m_pFile; m_pFile = NULL; } if (NULL != m_pConnection) { m_pConnection->Close(); delete m_pConnection; m_pConnection = NULL; } } int CHttpClient::ExecuteRequest(LPCTSTR strMethod, LPCTSTR strUrl, LPCTSTR strPostData, CString &strResponse, CString &Err) { CString strServer; CString strObject; DWORD dwServiceType; INTERNET_PORT nPort; strResponse = ""; Err = ""; AfxParseURL(strUrl, dwServiceType, strServer, strObject, nPort); if (AFX_INET_SERVICE_HTTP != dwServiceType && AFX_INET_SERVICE_HTTPS != dwServiceType) { return FAILURE; } try { m_pConnection = m_pSession->GetHttpConnection(strServer, dwServiceType == AFX_INET_SERVICE_HTTP ? NORMAL_CONNECT : SECURE_CONNECT, nPort); m_pFile = m_pConnection->OpenRequest(strMethod, strObject, NULL, 1, NULL, NULL, (dwServiceType == AFX_INET_SERVICE_HTTP ? NORMAL_REQUEST : SECURE_REQUEST)); //DWORD dwFlags; //m_pFile->QueryOption(INTERNET_OPTION_SECURITY_FLAGS, dwFlags); //dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA; ////set web server option //m_pFile->SetOption(INTERNET_OPTION_SECURITY_FLAGS, dwFlags); m_pFile->AddRequestHeaders(_T("Accept: *,*/*")); m_pFile->AddRequestHeaders(_T("Accept-Language: zh-cn")); m_pFile->AddRequestHeaders(_T("Content-Type: application/x-www-form-urlencoded")); m_pFile->AddRequestHeaders(_T("Accept-Encoding: gzip, deflate")); m_pFile->SendRequest(NULL, 0, (LPVOID)(LPCTSTR)strPostData, strPostData == NULL ? 0 : _tcslen(strPostData)); char szChars[BUFFER_SIZE + 1] = { 0 }; CStringA strRawResponse = ""; UINT nReaded = 0; while ((nReaded = m_pFile->Read((void*)szChars, BUFFER_SIZE)) > 0) { szChars[nReaded] = '\0'; strRawResponse += szChars; memset(szChars, 0, BUFFER_SIZE + 1); } int unicodeLen = MultiByteToWideChar(CP_UTF8, 0, strRawResponse, -1, NULL, 0); WCHAR *pUnicode = new WCHAR[unicodeLen + 1]; memset(pUnicode, 0, (unicodeLen + 1)*sizeof(wchar_t)); MultiByteToWideChar(CP_UTF8, 0, strRawResponse, -1, pUnicode, unicodeLen); CString cs(pUnicode); delete[]pUnicode; pUnicode = NULL; strResponse = cs; Clear(); } catch (CInternetException* e) { Clear(); DWORD dwErrorCode = e->m_dwError; e->Delete(); DWORD dwError = GetLastError(); //PRINT_LOG("dwError = %d", dwError, 0); if (ERROR_INTERNET_TIMEOUT == dwErrorCode) { Err.Format(_T("请求超时, LastError=%d"), dwErrorCode, dwError); return OUTTIME; } else { Err.Format(_T("请求失败, LastError=%d"), dwErrorCode, dwError); return FAILURE; } } return SUCCESS; } int CHttpClient::HttpGet(LPCTSTR strUrl, LPCTSTR strPostData, CString &strResponse, CString &Err) { return ExecuteRequest(_T("GET"), strUrl, strPostData, strResponse, Err); } int CHttpClient::HttpPost(LPCTSTR strUrl, LPCTSTR strPostData, CString &strResponse, CString &Err) { return ExecuteRequest(_T("POST"), strUrl, strPostData, strResponse, Err); } //添加 void CHttpClient::AddLog(DWORD dwSocketID, GETDUILIEBASE LogText) { CWHDataLocker lock(m_CriticalSection); if (!m_bRun) return; if (GetData.find(dwSocketID) == GetData.end()) { GETDUILIELIST mData; ZeroMemory(&mData, sizeof(mData)); mData.dDataList[0] = LogText; std::pair aa(dwSocketID, mData); GetData.insert(aa); if (pCAttemperEngineSink && pCAttemperEngineSink->IsJC(8888)) { if (LogText.CommendID == 1) { CString csTest; csTest.Format(_T("玩家(%s)添加了一条任务->%s"), LogText.bb.szName, _T("请求订单")); CShowTime aa(csTest, true, 99999, 99999); } else if (LogText.CommendID == 3) { CString csTest; csTest.Format(_T("玩家(%s)添加了一条任务->%s"), LogText.bb.szName, _T("绑定代理")); CShowTime aa(csTest, true, 99999, 99999); } else if (LogText.CommendID == 2) { CString csTest; csTest.Format(_T("玩家(%s)添加了一条任务->%s"), LogText.bb.szName, _T("获取订单列表")); CShowTime aa(csTest, true, 99999, 99999); } else if (LogText.CommendID == 4) { CString csTest; csTest.Format(_T("玩家(%d)添加了一条任务->%s"), LogText.dUserID, _T("分享朋友圈")); CShowTime aa(csTest, true, 99999, 99999); } else if (LogText.CommendID == 8) { CString csTest; csTest.Format(_T("玩家(%d)添加了一条任务->%s"), LogText.dUserID, _T("请求发送手机验证码")); CShowTime aa(csTest, true, 99999, 99999); } else if (LogText.CommendID == 9) { CString csTest; csTest.Format(_T("玩家(%d)添加了一条任务->%s"), LogText.dUserID, _T("校验落实验证码")); CShowTime aa(csTest, true, 99999, 99999); } else if (LogText.CommendID == 10) { CString csTest; csTest.Format(_T("玩家(%d)添加了一条任务->%s"), LogText.dUserID, _T("玩家自主解绑代理")); CShowTime aa(csTest, true, 99999, 99999); } else if (LogText.CommendID == 11) { CString csTest; csTest.Format(_T("玩家(%d)添加了一条任务->%s"), LogText.dUserID, _T("抽奖记录入库")); CShowTime aa(csTest, true, 99999, 99999); } else if (LogText.CommendID == 12) { CString csTest; csTest.Format(_T("玩家(%d)添加了一条任务->%s"), LogText.dUserID, _T("抽奖记录入库EX")); CShowTime aa(csTest, true, 99999, 99999); } } if (g_Event) SetEvent(g_Event); } else { std::unordered_map::iterator it = GetData.find(dwSocketID); GETDUILIELIST gTemp = it->second; //查询有没有这个命令 for (int i = 0; i < 10; i++) { if (gTemp.dDataList[i].CommendID == 0) continue; //重复命令,只能发送一次 if (gTemp.dDataList[i].CommendID == LogText.CommendID) return; } for (int i = 0; i < 10; i++) { if (gTemp.dDataList[i].CommendID == 0) { gTemp.dDataList[i] = LogText; GetData[dwSocketID] = gTemp; break; } } if (LogText.CommendID == 1) { CString csTest; csTest.Format(_T("玩家(%s)添加了大于一条任务->%s"), LogText.bb.szName, _T("请求订单")); CShowTime aa(csTest, true, 99999, 99999); } else if (LogText.CommendID == 3) { CString csTest; csTest.Format(_T("玩家(%s)添加了大于一条任务->%s"), LogText.bb.szName, _T("绑定代理")); CShowTime aa(csTest, true, 99999, 99999); } else if (LogText.CommendID == 2) { CString csTest; csTest.Format(_T("玩家(%s)添加了大于一条任务->%s"), LogText.bb.szName, _T("获取订单列表")); CShowTime aa(csTest, true, 99999, 99999); } else if (LogText.CommendID == 4) { CString csTest; csTest.Format(_T("玩家(%d)添加了大于一条任务->%s"), LogText.dUserID, _T("分享朋友圈")); CShowTime aa(csTest, true, 99999, 99999); } else if (LogText.CommendID == 8) { CString csTest; csTest.Format(_T("玩家(%d)添加了一条任务->%s"), LogText.dUserID, _T("获取手机验证码")); CShowTime aa(csTest, true, 99999, 99999); } else if (LogText.CommendID == 9) { CString csTest; csTest.Format(_T("玩家(%d)添加了一条任务->%s"), LogText.dUserID, _T("校验手机验证码")); CShowTime aa(csTest, true, 99999, 99999); } else if (LogText.CommendID == 10) { CString csTest; csTest.Format(_T("玩家(%d)添加了一条任务->%s"), LogText.dUserID, _T("玩家自主解绑代理")); CShowTime aa(csTest, true, 99999, 99999); } else if (LogText.CommendID == 11) { CString csTest; csTest.Format(_T("玩家(%d)添加了一条任务->%s"), LogText.dUserID, _T("抽奖记录入库")); CShowTime aa(csTest, true, 99999, 99999); } else if (LogText.CommendID == 12) { CString csTest; csTest.Format(_T("玩家(%d)添加了一条任务->%s"), LogText.dUserID, _T("抽奖记录入库EX")); CShowTime aa(csTest, true, 99999, 99999); } if (g_Event) SetEvent(g_Event); } } //获取 std::unordered_map CHttpClient::GetLog() { CWHDataLocker lock(m_CriticalSection);// std::unordered_map Ret = GetData; GetData.clear(); return Ret; } //获取数量 DWORD CHttpClient::GetCount() { CWHDataLocker lock(m_CriticalSection); return GetData.size(); } //启动 bool CHttpClient::start(CAttemperEngineSink* pSink) { if (m_hThread != NULL) return false; CString csEvent; //随机种子 srand(GetTickCount()); int iRand = rand()%9999; csEvent.Format(_T("MJ_HTTPGETDATA%d%d"), pSink->m_pGameServiceOption->wServerID, iRand); if (!g_Event) g_Event = CreateEvent(NULL, false, false, csEvent); //人工重置,有信号 m_bRun = true; pCAttemperEngineSink = pSink; m_hThread = (HANDLE)_beginthreadex(NULL, 0, &Runs, NULL, 0, &m_uiThreadID); return true; }; //结束 bool CHttpClient::end() { if (!m_hThread) return false; pCAttemperEngineSink = NULL; m_bRun = false; SetEvent(g_Event); return true; } // 进行Url编码 UTF-8 CString CHttpClient::UrlEncode(CString strUnicode) { LPCWSTR unicode = T2CW(strUnicode); int len = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, 0, 0, 0, 0); if (!len) return strUnicode; char *utf8 = new char[len + 1]; ZeroMemory(utf8, len + 1); char *utf8temp = utf8; WideCharToMultiByte(CP_UTF8, 0, unicode, -1, utf8, len + 1, 0, 0); utf8[len] = NULL; CString strTemp, strEncodeData; while (*utf8 != 0) { strTemp.Format(_T("%%%2x"), (BYTE)*utf8); strEncodeData += strTemp; ++utf8; } delete[]utf8temp; return CString(strEncodeData); } //运行 unsigned __stdcall CHttpClient::Runs(void* pParam) { if (g_Event == NULL) { _endthreadex(0); m_hThread = NULL; m_bRun = false; return 0; } CString strResponse; CString Err; if (curl == NULL) { curl = curl_easy_init(); } // 线程开始 while (m_bRun && WAIT_OBJECT_0 == WaitForSingleObject(g_Event, INFINITE)) //指定的对象为有信号状态,这里确实为有信号状态,直接往下执行 { std::unordered_map Ret = GetLog(); std::unordered_map::iterator it = Ret.begin(); if (pCAttemperEngineSink && pCAttemperEngineSink->IsJC(8888)) { CString csTest; csTest.Format(_T("支付线程获得获得信号,信号获得任务数=%d。"), Ret.size()); TCHAR szBuffer[600]; ZeroMemory(szBuffer, sizeof(TCHAR) * 600); StringCchCopy(szBuffer, 600, csTest); CShowTime aa(szBuffer, true, 99999, 99999); } CString csRet = _T(""); for (; it != Ret.end(); it++) { DWORD dStart = GetTickCount(); //构建请求 CString csGet; GETDUILIELIST getData = it->second; for (int i = 0; i < 10; i++) { switch (getData.dDataList[i].CommendID) { case 10000: // { csRet = OnExeInfo(CString(getData.dDataList[i].szUnionID), getData.dDataList[i].bb.szName, getData.dDataList[i].dwSocketID); break; } case 1: //请求订单编号 { csRet = OnGetDingDan(*((GETDUILIE *)getData.dDataList[i].szBuffer), CString(getData.dDataList[i].szUnionID), getData.dDataList[i].dwSocketID); break; } case 2://获取购买记录 { csRet = OnGetDingDanList(CString(getData.dDataList[i].szUnionID), getData.dDataList[i].dwSocketID); break; } case 3://绑定代理 { csRet = OnGetBangDing(CString(getData.dDataList[i].szUnionID), getData.dDataList[i].dwSocketID, ((CMD_GR_BangDing *)getData.dDataList[i].szBuffer)->dDaiLi, getData.dDataList[i].dUserID, getData.dDataList[i].bb.szName, getData.dDataList[i].bb.szImgHead); break; } case 4://分享通知 { csRet = OnGetShare(CString(getData.dDataList[i].szUnionID), 0, 0); } case 7://获取代理id { csRet = OnGetDaiLiID(CString(getData.dDataList[i].szUnionID), getData.dDataList[i].dUserID, getData.dDataList[i].dwSocketID, getData.dDataList[i].bb.szName); break; } case 8://获取手机验证码 { OnGetIphoneNumber(CString(getData.dDataList[i].szUnionID), getData.dDataList[i].dUserID, getData.dDataList[i].dwSocketID); break; } case 9://校验手机验证码,把dUserID当做了手机的验证码 { csRet = OnVerfIphoneNumberCode(CString(getData.dDataList[i].szUnionID), /*getData.dDataList[i].dUserID*/getData.dDataList[i].bb.szName, getData.dDataList[i].dwSocketID); break; } case 10://玩家自主解绑代理 { DWORD dwAccurency, dwDaiLiID; dwAccurency = _tstoi(getData.dDataList[i].bb.szImgHead); dwDaiLiID = _tstoi(getData.dDataList[i].bb.szName); OnUntieAgent(CString(getData.dDataList[i].szUnionID), getData.dDataList[i].dUserID, dwAccurency, dwDaiLiID, getData.dDataList[i].dwSocketID); break; } case 11://抽奖记录入库 { WORD wLotteryID = _tstoi(getData.dDataList[i].bb.szName); WORD wLotteryType = _tstoi(getData.dDataList[i].szUnionID); DWORD dwRecordID = stoi(getData.dDataList[i].szBuffer); OnLotteryResult(getData.dDataList[i].dUserID, wLotteryID, wLotteryType, CString(getData.dDataList[i].bb.szImgHead), dwRecordID, getData.dDataList[i].dwSocketID); break; } case 12://抽奖记录入库EX { DWORD dwRecordID = stoi(getData.dDataList[i].szBuffer); OnLotteryResultEx(getData.dDataList[i].dUserID, CString(getData.dDataList[i].bb.szName), CString(getData.dDataList[i].bb.szImgHead), CString(getData.dDataList[i].szUnionID), dwRecordID, getData.dDataList[i].dwSocketID); break; } case 13://战绩分享闲聊群 { OnFenXiangXianLiao(getData.dDataList[i].szUnionID, *((DBR_GR_ClubRecordXianLiao *)getData.dDataList[i].szBuffer)); break; } default: break; } } if (pCAttemperEngineSink && pCAttemperEngineSink->IsJC(8888)) { dStart = GetTickCount() - dStart; CString csTest; getData.dDataList[0].bb.szName[31] = 0x00; csTest.Format(_T("处理完成了(%s)的请求,耗时=%d。\r\n处理结果=%s"), getData.dDataList[0].bb.szName, dStart, csRet); CShowTime aa(csTest, true, 99999, 99999); } } Ret.clear(); if (pCAttemperEngineSink && pCAttemperEngineSink->IsJC(8888)) { CString csTest; csTest.Format(_T("处理完成,进入休眠。")); CShowTime aa(csTest, true, 99999, 99999); } } if (pCAttemperEngineSink && pCAttemperEngineSink->IsJC(8888)) { CString csTest; csTest.Format(_T("支付线程退出。")); CShowTime aa(csTest, true, 99999, 99999); } m_bRun = false; if (g_Event) { CloseHandle(g_Event); g_Event = NULL; } GetLog(); if (curl != NULL) { curl_easy_cleanup(curl); curl = NULL; } //_endthreadex(0); m_hThread = NULL; return 0; } // 获取订单编号 CString CHttpClient::OnGetDingDan(GETDUILIE Data, CString csUnionID, DWORD dwSocketID) { DWORD dStart = GetTickCount(); CString csGet; IServerUserItem * pUser = CHttpClient::pCAttemperEngineSink->GetBindUserItem(LOWORD(dwSocketID)); /*/// by yd 判断pUser是否为空 WORD deviceType = 0xFFFF; if (pUser != NULL) { deviceType = pUser->GetMobileUserMachineType(); }*/ CString HttpPath = _T(""); if (CServiceUnits::g_pServiceUnits) HttpPath = CServiceUnits::g_pServiceUnits->m_InitParameter.m_HttpPath; if (HttpPath == _T("")) { //HttpPath = _T("http://www.jiangn.net/"); HttpPath = _T("http://cycz.legaogame.com/"); } csGet.Format(_T("%sPay/CreatXMLPay"), HttpPath); HttpPath = csGet; csGet = _T(""); Data.ack.dwGameID = 305; CTime t = CTime::GetCurrentTime(); CString time = t.Format("%Y%m%d%H%M%S"); CString key = _T("VwZkLv0m0G^5T@2v"); CString stringSource = _T(""); CString stringTarget = _T(""); TCHAR strTemp[LEN_MD5]; stringSource.Format(_T("%d%d%d%d%s%d%d%d%s%s"), Data.ack.dwGameID, Data.dd.dProductId, Data.dd.jiage, 1, csUnionID, Data.ack.dUserID, Data.ack.dDaiLi, Data.dd.payflag, time, key); CWHEncrypt::MD5Encrypt(stringSource, strTemp); stringTarget.Format(_T("%s"), strTemp); csGet.Format(_T("serviceId=%d&productId=%d&productName=%s&unitPrice=%d&amount=%d&unionid=%s&userid=%d&agentid=%d&time=%s&sign=%s&clientIp=%s&payType=%d"), Data.ack.dwGameID, Data.dd.dProductId, UrlEncode(Data.dd.ProductName), Data.dd.jiage, 1, csUnionID, Data.ack.dUserID, Data.ack.dDaiLi, time, stringTarget, Data.ack.szClientAddr, Data.dd.payflag); if (pCAttemperEngineSink->IsJC(305)){ CTraceService::TraceString(HttpPath, TraceLevel_Normal); CTraceService::TraceString(csGet, TraceLevel_Normal); } std::string szUrl; std::string szParam; szUrl = CW2AEX<1024>(HttpPath).m_psz; szParam = CW2AEX<1024>(csGet).m_psz; std::string csRet; CHttpClient aa; //int iRet = aa.Get(szUrl, csRet); int iRet = aa.Post(szUrl, szParam, csRet); dStart = GetTickCount() - dStart; //CString bb = (CA2CTEX<2048>(csRet.c_str())).m_szBuffer; CString bb = CChineseCode::Utf8ToUnicode(csRet.c_str()); if (iRet != SUCCESS) { CString csTest; csTest.Format(_T("获取微信订单失败。请求耗时=%d。出错代码=%d。请求【%s】"), dStart, iRet, csGet); CShowTime aa(csTest, true, 99999, 99999); //失败写日志 StringCchCopy(Data.ack.szRet, 2048, _T("{\"Code\":\"2\",\"Msg\":\"失败\"}")); /* StringCchCopy(Data.ack.szRet, 2048, _T("0操作失败0"));*/ Data.ack.bLen = wcslen(Data.ack.szRet) + 1; //发送结果 if (pCAttemperEngineSink) pCAttemperEngineSink->OnTCPNetworkSubUserGetDingdanCallBack(Data, dwSocketID); return bb; } if (Data.ack.dUserID != 0 && pCAttemperEngineSink && pCAttemperEngineSink->IsJC(Data.ack.dUserID)) { CString csTest; if (bb.GetLength() > 512) { csTest.Format(_T("获取微信订单结果:%s。请求耗时=%d。请求【%s】"), bb.Mid(0, 512), dStart, csGet); } else { csTest.Format(_T("获取微信订单结果:%s。请求耗时=%d。请求【%s】"), bb, dStart, csGet); } TCHAR szBuffer[600]; ZeroMemory(szBuffer, sizeof(TCHAR) * 600); StringCchCopy(szBuffer, 600, csTest); CShowTime aa(szBuffer, true, 99999, 99999); } if (bb.GetLength() < 2048) { StringCchCopy(Data.ack.szRet, 2048, bb); Data.ack.bLen = wcslen(Data.ack.szRet) + 1; //发送结果 if (pCAttemperEngineSink) pCAttemperEngineSink->OnTCPNetworkSubUserGetDingdanCallBack(Data, dwSocketID); } else { //超长日志 /* StringCchCopy(Data.ack.szRet, 2048, _T("0操作失败0"));*/ StringCchCopy(Data.ack.szRet, 2048, _T("{\"Code\":\"1\",\"Msg\":\"失败\"}")); Data.ack.bLen = wcslen(Data.ack.szRet) + 1; //发送结果 if (pCAttemperEngineSink) pCAttemperEngineSink->OnTCPNetworkSubUserGetDingdanCallBack(Data, dwSocketID); } return bb; } // 获取订单列表 CString CHttpClient::OnGetDingDanList(CString csUnionID, DWORD dwSocketID) { CString csGet, Err; CString HttpPath = _T(""); if (CServiceUnits::g_pServiceUnits) HttpPath = CServiceUnits::g_pServiceUnits->m_InitParameter.m_HttpPath; if (HttpPath == _T("")) { HttpPath = _T("http://www.jiangn.net/"); } csGet.Format(_T("%sGetcyhddata.aspx?GetMyTrade_No=1&iPage=0&unionid=%s&pass=am8du5hua3zi1"), HttpPath,csUnionID); std::string szUrl; szUrl = CW2AEX<1024>(csGet).m_psz; std::string csRet; CHttpClient aa; int iRet = aa.Get(szUrl, csRet); CString bb = CChineseCode::Utf8ToUnicode(csRet.c_str()); //(CA2CTEX<2048>(csRet.c_str())).m_szBuffer; //发送结果 if (pCAttemperEngineSink) pCAttemperEngineSink->OnTCPNetworkSubUserGetDingdanListCallBack(bb, dwSocketID); return bb; } //分享通知 CString CHttpClient::OnGetShare(CString csUnionID, DWORD UserID, DWORD dwXinYong) { return L""; } // 绑定代理 CString CHttpClient::OnGetBangDing(CString csUnionID, DWORD dwSocketID, DWORD dDaiLi, DWORD dUserID, CString Name, CString Head) { DWORD dStart = GetTickCount(); #ifdef _TEST CString abc = L"1操作成功0"; //发送结果 if (pCAttemperEngineSink) pCAttemperEngineSink->OnTCPNetworkSubUserBangDingCallBack(abc, dwSocketID, dDaiLi); return abc; #endif CString csGet; IServerUserItem * pUser = CHttpClient::pCAttemperEngineSink->GetBindUserItem(LOWORD(dwSocketID)); /*/// by yd 判断pUser是否为空 WORD deviceType = 0xFFFF; if (pUser != NULL) { deviceType = pUser->GetMobileUserMachineType(); }*/ CString HttpPath = _T(""); if (CServiceUnits::g_pServiceUnits) HttpPath = CServiceUnits::g_pServiceUnits->m_InitParameter.m_HttpPath; if (HttpPath == _T("")) { //HttpPath = _T("http://www.jiangn.net/"); HttpPath = _T("http://cycz.legaogame.com/"); } csGet.Format(_T("%sUser/UserBindAgentXml"), HttpPath); HttpPath = csGet; csGet = _T(""); //测试用例 CTime t = CTime::GetCurrentTime(); CString time = t.Format("%Y%m%d%H%M%S"); CString key = _T("VwZkLv0m0G^5T@2v"); CString stringSource = _T(""); CString stringTarget = _T(""); TCHAR strTemp[LEN_MD5]; stringSource.Format(_T("%d%s%d%d%s%s"), 305, csUnionID, dDaiLi, dUserID, time, key); CWHEncrypt::MD5Encrypt(stringSource, strTemp); stringTarget.Format(_T("%s"), strTemp); csGet.Format(_T("serviceId=%d&unionId=%s&agentId=%d&userId=%d&headImg=%s&wxName=%s&time=%s&sign=%s"), 305, csUnionID, dDaiLi, dUserID, UrlEncode(Head), UrlEncode(Name), time, stringTarget); if (pCAttemperEngineSink->IsJC(305)){ CTraceService::TraceString(HttpPath, TraceLevel_Normal); //CTraceService::TraceString(stringTarget, TraceLevel_Normal); CTraceService::TraceString(csGet, TraceLevel_Normal); } std::string szUrl; std::string szParam; szUrl = CW2AEX<1024>(HttpPath).m_psz; szParam = CW2AEX<1024>(csGet).m_psz; std::string csRet; CHttpClient aa; //int iRet = aa.Get(szUrl, csRet); int iRet = aa.Post(szUrl, szParam, csRet); //CString bb = (CA2CTEX<2048>(csRet.c_str())).m_szBuffer; CString bb = CChineseCode::Utf8ToUnicode(csRet.c_str()); //(CA2CTEX<2048>(csRet.c_str())).m_szBuffer; dStart = GetTickCount() - dStart; if (iRet != SUCCESS) { //失败写日志 CString csTest; csTest.Format(_T("绑定代理请求失败。请求耗时=%d。出错代码=%d 请求【%s】,请求数据%s"), dStart, iRet, bb, csGet); CShowTime aa1(csTest, true, 99999, 99999); return bb; } if (dUserID != 0 && pCAttemperEngineSink && pCAttemperEngineSink->IsJC(dUserID)) { CString csTest; if (bb.GetLength() > 512) { csTest.Format(_T("获取绑定代理结果:%s。请求耗时=%d。请求【%s】"), bb.Mid(0, 512), dStart, csGet); } else { csTest.Format(_T("获取绑定代理结果:%s。请求耗时=%d。请求【%s】"), bb, dStart, csGet); } CShowTime aa1(csTest, true, 99999, 99999); } //发送结果 if (pCAttemperEngineSink) pCAttemperEngineSink->OnTCPNetworkSubUserBangDingCallBack(bb, dwSocketID, dDaiLi); return bb; } static int OnDebug(CURL *, curl_infotype itype, char * pData, size_t size, void *) { if (itype == CURLINFO_TEXT) { //printf("[TEXT]%s\n", pData); } else if (itype == CURLINFO_HEADER_IN) { printf("[HEADER_IN]%s\n", pData); } else if (itype == CURLINFO_HEADER_OUT) { printf("[HEADER_OUT]%s\n", pData); } else if (itype == CURLINFO_DATA_IN) { printf("[DATA_IN]%s\n", pData); } else if (itype == CURLINFO_DATA_OUT) { printf("[DATA_OUT]%s\n", pData); } return 0; } static size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid) { std::string* str = dynamic_cast((std::string *)lpVoid); if (NULL == str || NULL == buffer) { return -1; } char* pData = (char*)buffer; str->append(pData, size * nmemb); return nmemb; } int CHttpClient::Post(const std::string & strUrl, const std::string & strPost, std::string & strResponse) { CURLcode res; CURL* curl = curl_easy_init(); if (NULL == curl) { return CURLE_FAILED_INIT; } if (m_bDebug) { curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug); } curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str()); curl_easy_setopt(curl, CURLOPT_POST, 1); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strPost.c_str()); curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3); curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3); res = curl_easy_perform(curl); curl_easy_cleanup(curl); return res; } int CHttpClient::Get(const std::string & strUrl, std::string & strResponse) { CURLcode res; if (NULL == curl) { return CURLE_FAILED_INIT; } if (m_bDebug) { curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug); } struct curl_slist *headers = NULL; headers = curl_slist_append(headers, "Content-Type:application/x-www-form-urlencoded;charset=UTF-8"); headers = curl_slist_append(headers, "Accept:*/*"); headers = curl_slist_append(headers, "User-Agent:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; CIBA)"); headers = curl_slist_append(headers, "Connection:Keep-Alive"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str()); curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse); /** * 当多个线程都使用超时处理的时候,同时主线程中有sleep或是wait等操作。 * 如果不设置这个选项,libcurl将会发信号打断这个wait从而导致程序退出。 */ curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 5); curl_easy_setopt(curl, CURLOPT_TIMEOUT, 5); res = curl_easy_perform(curl); curl_slist_free_all(headers);//记得要释放 return res; } int CHttpClient::Posts(const std::string & strUrl, const std::string & strPost, std::string & strResponse, const char * pCaPath) { CURLcode res; CURL* curl = curl_easy_init(); if (NULL == curl) { return CURLE_FAILED_INIT; } if (m_bDebug) { curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug); } curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str()); curl_easy_setopt(curl, CURLOPT_POST, 1); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, strPost.c_str()); curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); if (NULL == pCaPath) { curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false); } else { //缺省情况就是PEM,所以无需设置,另外支持DER //curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM"); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true); curl_easy_setopt(curl, CURLOPT_CAINFO, pCaPath); } curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3); curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3); res = curl_easy_perform(curl); curl_easy_cleanup(curl); return res; } int CHttpClient::Gets(const std::string & strUrl, std::string & strResponse, const char * pCaPath) { CURLcode res; CURL* curl = curl_easy_init(); if (NULL == curl) { return CURLE_FAILED_INIT; } if (m_bDebug) { curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, OnDebug); } curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str()); curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); if (NULL == pCaPath) { curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false); } else { curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true); curl_easy_setopt(curl, CURLOPT_CAINFO, pCaPath); } curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 3); curl_easy_setopt(curl, CURLOPT_TIMEOUT, 3); res = curl_easy_perform(curl); curl_easy_cleanup(curl); return res; } /////////////////////////////////////////////////////////////////////////////////////////////// void CHttpClient::SetDebug(bool bDebug) { m_bDebug = bDebug; } //玩家自主解绑代理 //玩家自主解绑代理 CString CHttpClient::OnUntieAgent(CString csUnionID, DWORD dwUserID, DWORD dwAccurency, DWORD dwDaiLiID, DWORD dwSocketID) { CString csGet, Err; CString HttpPath = _T(""); if (CServiceUnits::g_pServiceUnits) HttpPath = CServiceUnits::g_pServiceUnits->m_InitParameter.m_HttpPath; if (HttpPath == _T("")) { HttpPath = _T("http://www.jiangn.net/"); } //http://10.25.210.43:50043/Getcyhddata.aspx?ReleaseAgentBanding=1&unionid=owbjBv_wBNd5_or8oD7nqmvmaaLQ&Userid=103951&pass=am8du5hua3zi1 csGet.Format(_T("%sGetcyhddata.aspx?ReleaseMember=1&Userid=%d&Accurency=%d&unionid=%s&Agent_Id=%d&pass=am8du5hua3zi1"), HttpPath, dwUserID, dwAccurency, csUnionID, dwDaiLiID); if (pCAttemperEngineSink && pCAttemperEngineSink->IsJC(404)) { CString strTip; strTip.Format(L"**玩家自主解绑代理请求:%s", csGet); CTraceService::TraceString(strTip, TraceLevel_Normal); } std::string szUrl; szUrl = CW2AEX<1024>(csGet).m_psz; std::string csRet; CHttpClient aa; int iRet = aa.Get(szUrl, csRet); CString bb = CChineseCode::Utf8ToUnicode(csRet.c_str()); //(CA2CTEX<2048>(csRet.c_str())).m_szBuffer;; if (iRet != SUCCESS) { //失败写日志 CString csTest; csTest.Format(_T("绑定代理请求失败。出错代码=%d 请求【%s】 ------%s---------"), iRet, bb, csGet); CShowTime aa1(csTest, true, 99999, 99999); return bb; } if (dwUserID != 0 && pCAttemperEngineSink && pCAttemperEngineSink->IsJC(dwUserID)) { CString csTest; if (bb.GetLength() > 512) { csTest.Format(_T("绑定代理请求结果:%s。请求【%s】"), bb.Mid(0, 512), csGet); } else { csTest.Format(_T("绑定代理请求结果:%s。请求【%s】"), bb, csGet); } CShowTime aa1(csTest, true, 99999, 99999); } //if (iRet != 0) //{ // CMD_GR_RequestFailure RequestFailure; // ZeroMemory(&RequestFailure, sizeof(RequestFailure)); // //设置变量 // RequestFailure.lErrorCode = iRet; // lstrcpyn(RequestFailure.szDescribeString, bb, CountArray(RequestFailure.szDescribeString)); // //发送数据 // WORD wDataSize = CountStringBuffer(RequestFailure.szDescribeString); // WORD wHeadSize = sizeof(RequestFailure) - sizeof(RequestFailure.szDescribeString); // //获取用户 // WORD wBindIndex = LOWORD(dwSocketID); // IServerUserItem * pIServerUserItem = pCAttemperEngineSink->GetBindUserItem(wBindIndex); // if (pIServerUserItem == NULL) return false; // pCAttemperEngineSink->SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_REQUEST_FAILURE, &RequestFailure, wHeadSize + wDataSize); //} if (pCAttemperEngineSink)pCAttemperEngineSink->OnTCPNetworkSubUserUntieAgentCallBack(bb, dwSocketID); return bb; } // 获取扫码绑定代码ID列表 CString CHttpClient::OnGetDaiLiID(CString csUnionID, DWORD dwUserID, DWORD dwSocketID, CString csUserName) { DWORD dStart = GetTickCount(); CString csGet, Err; CString HttpPath = _T(""); if (CServiceUnits::g_pServiceUnits) HttpPath = CServiceUnits::g_pServiceUnits->m_InitParameter.m_HttpPath; if (HttpPath == _T("")) { //HttpPath = _T("http://www.jiangn.net/"); HttpPath = _T("http://cycz.legaogame.com/"); } csGet.Format(_T("%sUser/GetUserBindingIdByUnionId"), HttpPath); HttpPath = csGet; csGet = _T(""); CTime t = CTime::GetCurrentTime(); CString time = t.Format("%Y%m%d%H%M%S"); CString key = _T("VwZkLv0m0G^5T@2v"); CString stringSource = _T(""); CString stringTarget = _T(""); TCHAR strTemp[LEN_MD5]; stringSource.Format(_T("%d%s%d%s%s"), KIND_ID, csUnionID, dwUserID, time, key); CWHEncrypt::MD5Encrypt(stringSource, strTemp); //生成加密串 stringTarget.Format(_T("%s"), strTemp); csGet.Format(_T("serviceId=%d&unionId=%s&userId=%d&username=%s&time=%s&sign=%s"), KIND_ID, csUnionID, dwUserID, UrlEncode(csUserName), time, stringTarget); std::string szUrl; std::string szParam; szUrl = CW2AEX<1024>(HttpPath).m_psz; szParam = CW2AEX<1024>(csGet).m_psz; std::string csRet; CHttpClient aa; //int iRet = aa.Get(szUrl, csRet); int iRet = aa.Post(szUrl, szParam, csRet); dStart = GetTickCount() - dStart; CString bb = CChineseCode::Utf8ToUnicode(csRet.c_str()); //解析返回的数据 Json::Reader m_reader; Json::Value m_root; std::string strbb(CW2A(bb.GetString())); if (!m_reader.parse(strbb, m_root)) return L""; if (pCAttemperEngineSink && pCAttemperEngineSink->IsJC(KIND_ID)) { CString strTip; TCHAR tString[10000] = L""; m_root.MByteToWChar(strbb.c_str(), tString, strbb.size() + 1); strTip.Format(L"校验请求:%s,Post:%s,返回数据:%s", csGet, HttpPath, tString);//新用户ID:%d,dwUserID, CTraceService::TraceString(strTip, TraceLevel_Normal); } int nCode = 0; if (m_root["Code"].isString()) { nCode = (INT)atoi(m_root["Code"].asString().c_str()); } else if (m_root["Code"].isInt()){ nCode = (INT)m_root["Code"].asInt(); } int AgentID = m_root["Body"]["AgentId"].asInt();//代理id if (iRet != SUCCESS) { CString csTest; csTest.Format(_T("获取代理绑定信息失败。请求耗时=%d。出错代码=%d。请求【%s】"), dStart, iRet, csGet); CShowTime aa(csTest, true, 99999, 99999); //失败写日志 return bb; } //发送结果 if (pCAttemperEngineSink && 0 != AgentID){ CMD_GR_GetDaiLiSaoMaResult saomSul; ZeroMemory(&saomSul, sizeof(CMD_GR_GetDaiLiSaoMaResult)); saomSul.dwBingID = AgentID; saomSul.dwUserID = dwUserID; pCAttemperEngineSink->OnSetAddBingIDAndCurrency(&saomSul, sizeof(CMD_GR_GetDaiLiSaoMaResult), dwSocketID); if (bb.Find(_T("\"Code\":\"0\"")) != -1) { //成功 更新 //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = CHttpClient::pCAttemperEngineSink->GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return bb; if (pIServerUserItem->GetUserInfo()) { pIServerUserItem->GetUserInfo()->dDaiLi = AgentID; } //查询更新数据库 pCAttemperEngineSink->OnTCPNetworkSubUseGetDaiLiInfo(NULL, 0, dwSocketID); } } return bb; } //获取验证码 bool CHttpClient::OnGetIphoneNumber(CString csIphoneNum, DWORD dwUserID, DWORD dwSocketID) { CString csGet, Err; CString HttpPath = _T(""); if (CServiceUnits::g_pServiceUnits) HttpPath = CServiceUnits::g_pServiceUnits->m_InitParameter.m_HttpPath2; csGet.Format(_T("%s/Sms/AliyunSendSms"), HttpPath); //csGet.Format(_T("http://192.168.0.223:8088/Sms/AliyunSendSms")); std::string szUrl; szUrl = CW2AEX<1024>(csGet).m_psz; std::string csRet; CString csPost; std::string szPost; char TimeScore[15] = { 0 }; time_t t; tm* local; //本地时间 t = time(NULL); local = localtime(&t); //转为本地时间 strftime(TimeScore, 64, "%Y%m%d%H%M%S", local); TimeScore[14] = '\0'; std::string strTime = TimeScore; CString csTime(strTime.c_str()); CString Key = _T(""); CString GameId = _T("305"); CString csMd5; csMd5.Format(_T("305%s%sf*4$oEmmHA@fuHVD"), csIphoneNum, csTime); TCHAR strMd5[LEN_MD5]; CWHEncrypt md5; md5.MD5Encrypt(csMd5, strMd5); csPost.Format(_T("GameId=305&Mobile=%s&Time=%s&Sign=%s"), csIphoneNum, csTime, strMd5); szPost = CW2AEX<1024>(csPost).m_psz; CHttpClient aa; int iRet = aa.Post(szUrl, szPost, csRet); //post请求 if (pCAttemperEngineSink && pCAttemperEngineSink->IsJC(305)) { CString strTip; strTip.Format(L"验证码请求:%s,Post:%s", csGet, csPost);//新用户ID:%d,dwUserID, CTraceService::TraceString(strTip, TraceLevel_Normal); } //解析返回的数据 Json::Reader m_reader; Json::Value m_root; if (!m_reader.parse(csRet, m_root)) return true; int nCode = (INT)m_root["Code"].asInt(); std:string strMsg = m_root["Msg"].asString(); CString strError = CChineseCode::Utf8ToUnicode(strMsg.c_str()); if (nCode != 0) { CMD_GR_RequestFailure RequestFailure; ZeroMemory(&RequestFailure, sizeof(RequestFailure)); //设置变量 RequestFailure.lErrorCode = nCode; lstrcpyn(RequestFailure.szDescribeString, strError, CountArray(RequestFailure.szDescribeString)); //发送数据 WORD wDataSize = CountStringBuffer(RequestFailure.szDescribeString); WORD wHeadSize = sizeof(RequestFailure) - sizeof(RequestFailure.szDescribeString); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = pCAttemperEngineSink->GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return false; UserInfo::PB_CS_S_RequestFailure Failure; Failure.set_lerrorcode(RequestFailure.lErrorCode); std::string szDescribeString = CW2AEX<1024>(RequestFailure.szDescribeString, CP_UTF8).m_psz; Failure.set_szdescribestring(szDescribeString); //发送数据 std::string pbdata = Failure.SerializePartialAsString(); return pCAttemperEngineSink->SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_REQUEST_FAILURE, (void*)pbdata.c_str(), pbdata.length()); } return true; } //校验手机验证码 CString CHttpClient::OnVerfIphoneNumberCode(CString csIphoneNum, /*DWORD dVerfCode,*/CString csVerfCode, DWORD dwSocketID) { CString csGet, Err; CString HttpPath = _T(""); if (CServiceUnits::g_pServiceUnits) HttpPath = CServiceUnits::g_pServiceUnits->m_InitParameter.m_HttpPath2; csGet.Format(_T("%s/Sms/AliyunValidateCode"), HttpPath); std::string szUrl; szUrl = CW2AEX<1024>(csGet).m_psz; std::string csRet; CString csPost; std::string szPost; char TimeScore[15] = { 0 }; time_t t; tm* local; //本地时间 t = time(NULL); local = localtime(&t); //转为本地时间 strftime(TimeScore, 64, "%Y%m%d%H%M%S", local); TimeScore[14] = '\0'; std::string strTime = TimeScore;//TimeScore; CString csTime(strTime.c_str()); //CString CsVerfCode; //CsVerfCode.Format(_T("%d"), dVerfCode); CString GameId = _T("305"); CString csMd5; csMd5.Format(_T("305%s%s%sf*4$oEmmHA@fuHVD"), csIphoneNum, csVerfCode, csTime); TCHAR strMd5[LEN_MD5]; CWHEncrypt md5; md5.MD5Encrypt(csMd5, strMd5); //生成加密串 csPost.Format(_T("GameId=305&Mobile=%s&Code=%s&Time=%s&Sign=%s"), csIphoneNum, csVerfCode, csTime, strMd5); //组装post入参 szPost = CW2AEX<1024>(csPost).m_psz; CHttpClient aa; int iRet = aa.Post(szUrl, szPost, csRet); //post请求 //CString bb = CChineseCode::Utf8ToUnicode(csRet.c_str()); if (pCAttemperEngineSink && pCAttemperEngineSink->IsJC(305)) { CString strTip; strTip.Format(L"校验请求:%s,Post:%s", csGet, csPost);//新用户ID:%d,dwUserID, CTraceService::TraceString(strTip, TraceLevel_Normal); } //解析返回的数据 Json::Reader m_reader; Json::Value m_root; if (!m_reader.parse(csRet, m_root)) return L""; int nCode = (INT)m_root["Code"].asInt(); std:string strMsg = m_root["Msg"].asString(); CString strError = CChineseCode::Utf8ToUnicode(strMsg.c_str()); if (nCode != 0) { CMD_GR_RequestFailure RequestFailure; ZeroMemory(&RequestFailure, sizeof(RequestFailure)); //设置变量 RequestFailure.lErrorCode = nCode; lstrcpyn(RequestFailure.szDescribeString, strError, CountArray(RequestFailure.szDescribeString)); //发送数据 WORD wDataSize = CountStringBuffer(RequestFailure.szDescribeString); WORD wHeadSize = sizeof(RequestFailure) - sizeof(RequestFailure.szDescribeString); //获取用户 WORD wBindIndex = LOWORD(dwSocketID); IServerUserItem * pIServerUserItem = pCAttemperEngineSink->GetBindUserItem(wBindIndex); if (pIServerUserItem == NULL) return strError; UserInfo::PB_CS_S_RequestFailure Failure; Failure.set_lerrorcode(RequestFailure.lErrorCode); std::string szDescribeString = CW2AEX<1024>(RequestFailure.szDescribeString, CP_UTF8).m_psz; Failure.set_szdescribestring(szDescribeString); //发送数据 std::string pbdata = Failure.SerializePartialAsString(); pCAttemperEngineSink->SendData(pIServerUserItem, MDM_GR_USER, SUB_GR_REQUEST_FAILURE, (void*)pbdata.c_str(), pbdata.length()); return strError; } //发送结果 if (pCAttemperEngineSink) pCAttemperEngineSink->OnTCPNetworkSubUserCheckVerifCodeCallBack(csIphoneNum, csVerfCode, dwSocketID); return strError; } //短信通知手机本节点运行详情 CString CHttpClient::OnExeInfo(CString csIphoneNum,CString csInfo, DWORD dwSocketID) { CString csGet, Err; CString HttpPath = _T(""); if (CServiceUnits::g_pServiceUnits) HttpPath = CServiceUnits::g_pServiceUnits->m_InitParameter.m_HttpPath2; csGet.Format(_T("%s/Sms/SendNoticeSms"), HttpPath); if (HttpPath == L"") { csGet.Format(_T("http://192.168.0.223:8088/Sms//SendNoticeSms")); } std::string szUrl; szUrl = CW2AEX<1024>(csGet).m_psz; std::string csRet; CString csPost; std::string szPost; char TimeScore[15] = { 0 }; time_t t; tm* local; //本地时间 t = time(NULL); local = localtime(&t); //转为本地时间 strftime(TimeScore, 64, "%Y%m%d%H%M%S", local); TimeScore[14] = '\0'; std::string strTime = TimeScore;//TimeScore; CString csTime(strTime.c_str()); /* *csIphoneNum = L"13246711966"; csInfo = L"香蕉"; 测试版 数据 */ CString csMd5; csMd5.Format(_T("%d%s%sf*4$oEmmHA@fuHVD"), KIND_ID, csIphoneNum, csTime); TCHAR strMd5[LEN_MD5]; CWHEncrypt md5; md5.MD5Encrypt(csMd5, strMd5); //生成加密串 csPost.Format(_T("GameId=%d&Mobile=%s&product=%s&Time=%s&Sign=%s"), KIND_ID, csIphoneNum, csInfo, csTime, strMd5); //组装post入参 szPost = CW2AEX<1024>(csPost).m_psz; CHttpClient aa; aa.Post(szUrl, szPost, csRet); //post请求 CString bb = CChineseCode::Utf8ToUnicode(csRet.c_str()); if (pCAttemperEngineSink && pCAttemperEngineSink->IsJC(KIND_ID)) { CString strTip; strTip.Format(L"【短信通知手机本节点运行详情】校验请求:%s,Post:%s", csGet, csPost);//新用户ID:%d,dwUserID, CTraceService::TraceString(strTip, TraceLevel_Normal); } return bb; } //抽奖记录入库 CString CHttpClient::OnLotteryResult(DWORD dwUserID, WORD wLotteryID, WORD wLotteryType, CString csIphoneNum, DWORD dwRecordID, DWORD dwSocketID) { CString csGet, Err; CString HttpPath = _T(""); if (CServiceUnits::g_pServiceUnits) HttpPath = CServiceUnits::g_pServiceUnits->m_InitParameter.m_HttpPath3; //HttpPath = _T("http://192.168.0.204:8080/"); if (HttpPath == _T("")) { HttpPath = _T("http://www.jiangn.net/"); } csGet.Format(_T("%s/api/GameZJ/GetGameZhongJiang"), HttpPath); std::string csRet; CString csPost; std::string szPost; //wLotteryID = 9; //csIphoneNum.Format(_T("%s"), _T("17755351974")); ////////////////////////// CString csMd5; csMd5.Format(_T("%d|%d|%s|%d|!@12$dai"), dwUserID, wLotteryID, csIphoneNum, pCAttemperEngineSink->m_pGameServiceOption->wGameID); TCHAR strMd5[LEN_MD5]; CWHEncrypt md5; md5.MD5Encrypt(csMd5, strMd5); //生成加密串 //////////////////////////// csGet.Format(_T("%s?UserId=%d&Id=%d&PhoneNumber=%s&SeverId=%d&Sign=%s"), csGet, dwUserID, wLotteryID, csIphoneNum, pCAttemperEngineSink->m_pGameServiceOption->wGameID, strMd5); //组装post入参 300 std::string strcsGet(CW2A(csGet.GetString())); csPost.Format(_T("RlId=%d"), dwRecordID); //组装post入参 szPost = CW2AEX<1024>(csPost).m_psz; CHttpClient aa; int iRet = aa.Post(strcsGet, szPost, csRet); //post请求 CString bb = CChineseCode::Utf8ToUnicode(csRet.c_str()); if (pCAttemperEngineSink && pCAttemperEngineSink->IsJC(305)) { CString strTip; strTip.Format(L"校验请求:%s,Post:%s", csGet, csPost);//新用户ID:%d,dwUserID, CTraceService::TraceString(strTip, TraceLevel_Normal); } //解析返回的数据 Json::Reader m_reader; Json::Value m_root; std::string strbb(CW2A(bb.GetString())); if (!m_reader.parse(strbb, m_root)) return L""; int nCode = (INT)m_root["State"].asInt(); std:string strMsg = m_root["ErrorMsg"].asString(); CString strError(strMsg.c_str());//CChineseCode::Utf8ToUnicode(strMsg.c_str()); if (nCode == 0) { //失败写日志 CString csTest; csTest.Format(_T("抽奖记录入库。出错代码=%d 请求【%s】"), iRet, strError); CShowTime aa1(csTest, true, 99999, 99999); return L""; } //成功更新发放标志 if (pCAttemperEngineSink && nCode == 1 && wLotteryType != 4) pCAttemperEngineSink->OnTCPNetworkSubUserLotteryResultCallBack(dwRecordID, dwSocketID); return L""; } CString CHttpClient::OnLotteryResultEx(DWORD dwUserID, CString csAddressee, CString csAddress, CString csIphoneNum, DWORD dwRecordID, DWORD dwSocketID) { CString csGet, Err; CString HttpPath = _T(""); if (CServiceUnits::g_pServiceUnits) HttpPath = CServiceUnits::g_pServiceUnits->m_InitParameter.m_HttpPath3; //HttpPath = _T("http://192.168.0.204:8080/"); if (HttpPath == _T("")) { HttpPath = _T("http://www.jiangn.net/"); } csGet.Format(_T("%s/api/GameZJ/UpdateZhongJiangRecord"), HttpPath); //std::string szUrl; //szUrl = CW2AEX<1024>(csGet).m_psz; std::string csRet; CString csPost; std::string szPost; CString csMd5; csMd5.Format(_T("%d%d%d%s!@12$dai"), pCAttemperEngineSink->m_pGameServiceOption->wGameID, dwUserID, dwRecordID, csIphoneNum); TCHAR strMd5[LEN_MD5]; CWHEncrypt md5; md5.MD5Encrypt(csMd5, strMd5); //生成加密串 //////////////////////////// csGet.Format(_T("%s?SeverId=%d&UserId=%d&RlId=%d&PhoneNumber=%s&Address=%s&Consignee=%s&Sign=%s"), csGet, pCAttemperEngineSink->m_pGameServiceOption->wGameID, dwUserID, dwRecordID, csIphoneNum, UrlEncode(csAddress.TrimRight()), UrlEncode(csAddressee.TrimRight()), strMd5); //组装post入参 300 std::string strcsGet = CW2AEX<1024>(csGet).m_psz;//(CW2A(csGet.GetString())); szPost = CW2AEX<1024>(csPost).m_psz; CHttpClient aa; int iRet = aa.Post(strcsGet, szPost, csRet); //post请求 CString bb = CChineseCode::Utf8ToUnicode(csRet.c_str()); if (pCAttemperEngineSink && pCAttemperEngineSink->IsJC(305)) { CString strTip; strTip.Format(L"校验请求:%s,Post:%s,iRet=%d,,csReslut=%s", csGet, csPost,iRet,bb);//新用户ID:%d,dwUserID, CTraceService::TraceString(strTip, TraceLevel_Normal); } //解析返回的数据 Json::Reader m_reader; Json::Value m_root; std::string strbb(CW2A(bb.GetString())); if (!m_reader.parse(strbb, m_root)) return L""; int nCode = (INT)m_root["State"].asInt(); std:string strMsg = m_root["ErrorMsg"].asString(); CString strError(strMsg.c_str()); if (nCode == 0) { //失败写日志 CString csTest; csTest.Format(_T("抽奖记录入库。出错代码=%d 请求【%s】"), iRet, strError); CShowTime aa1(csTest, true, 99999, 99999); return L""; } //成功更新发放标志 if (pCAttemperEngineSink) pCAttemperEngineSink->OnTCPNetworkSubUserLotteryResultCallBack(dwRecordID, dwSocketID); return L""; } //分享闲聊,俱乐部,桌子号,玩家信息 CString CHttpClient::OnFenXiangXianLiao(TCHAR WanFTitle[33], DBR_GR_ClubRecordXianLiao FenXiangRecord) { CString HttpPath = _T(""); if (CServiceUnits::g_pServiceUnits) HttpPath = CServiceUnits::g_pServiceUnits->m_InitParameter.m_HttpPath; CString csReqPost; if (HttpPath == _T("")) { HttpPath = _T("http://cycz.legaogame.com/"); } csReqPost.Format(_T("%sGroupRobot/ShareCard"), HttpPath); std::string szUrl, szAns_Err; szUrl = CW2AEX<1024>(csReqPost).m_psz; char TimeScore[15] = { 0 }; time_t t; tm* local; //本地时间 t = time(NULL); local = localtime(&t); //转为本地时间 strftime(TimeScore, 64, "%Y%m%d%H%M%S", local); TimeScore[14] = '\0'; std::string strTime = TimeScore;//TimeScore; CString csTime(strTime.c_str()); CString csMd5; csMd5.Format(_T("%d%sf*4$oEmmHA@fuHVD"), FenXiangRecord.dwClubID, csTime); TCHAR strMd5[LEN_MD5]; CWHEncrypt md5; md5.MD5Encrypt(csMd5, strMd5); //生成加密串 std::string strMd52 = CW2AEX<1024>(strMd5).m_psz; CJsonBusiness cjb; CString csPost; TCHAR TempWanFTitle[68]; char TimeScore2[17] = { 0 }; time_t t2; tm* local2; //本地时间 t2 = time(NULL); local2 = localtime(&t2); //转为本地时间 strftime(TimeScore2, 64, "%Y/%m/%d %H\:%M", local2); TimeScore2[16] = '\0'; std::string strTime2 = TimeScore2;//TimeScore; CString csTime2(strTime2.c_str()); _sntprintf(TempWanFTitle, CountArray(TempWanFTitle), TEXT("%s %s"), WanFTitle, csTime2); std::string szPost = cjb.GetInfoJson(305, TempWanFTitle, strTime, strMd52, FenXiangRecord); CHttpClient aa; int iRet = aa.Post(szUrl, szPost, szAns_Err); //post请求 CString CstrPost = CChineseCode::Utf8ToUnicode(szPost.c_str()); CString strError = CChineseCode::Utf8ToUnicode(szAns_Err.c_str()); if (pCAttemperEngineSink && pCAttemperEngineSink->IsJC(305)) { CString strTip; strTip.Format(L"校验请求:%s,Post:%s", strError, CstrPost);//新用户ID:%d,dwUserID, CTraceService::TraceString(strTip, TraceLevel_Normal); } //解析返回的数据 Json::Reader m_reader; Json::Value m_root; std::string strbb(CW2A(strError.GetString())); if (!m_reader.parse(strbb, m_root)) return L""; int nCode = (INT)m_root["errorCode"].asInt(); std:string strMsg = m_root["errorMessage"].asString(); strError = CChineseCode::Utf8ToUnicode(strMsg.c_str()); if (nCode != 0) { CString strTip; strTip.Format(L"分享失败%s,%s", strError, CstrPost); CTraceService::TraceString(strTip, TraceLevel_Warning); } //发送结果 return L""; }