Commit a955dec6 by wuyang.zou

New Feature:

    1、Dll 生成订单号精确到毫秒级;
    2、订单请求报文超大,内存拷贝越界, 56个商品且每个商品有56个优惠折扣;
    3、请求报文中保护 PosIp

Version: 2.21.7.15
parent a0e5839e
No preview for this file type
......@@ -54,14 +54,20 @@ typedef struct {
int ischeck;
//区分simphony
int posType;
//host
string host;
//Upp Server Host
string svrHost;
// Pos Local Ip
string posIp;
// Pos Mac Address
string posMac;
} BaseInfo;
// Global Variable
BaseInfo global_info;
int initflag = 0;
BaseInfo global_info ;
// Flag: Dll Whether Had Been Loaded.
int initFlag = 0;
// 将 预编译固定赋值的宏定义 转换 成动态赋值的 全局变量;
string DES3_KEY_STR = "";
......@@ -272,12 +278,12 @@ int InitClient()
global_info.useRSA = atoi(tmp.c_str());
getline(istm, tmp);
global_info.posType = atoi(tmp.c_str());
getline(istm, global_info.host);
getline(istm, global_info.svrHost);
istm.close();
LOG() << "[**** 0 ****]---->InitClient: cretServerUrl: " << global_info.cretserverurl <<
"; serverurl:" << global_info.serverurl << "; longtime:" << global_info.longtimeout <<
"; shortime:" << global_info.shrottimeout << "; useRSA:" << global_info.useRSA <<
"; posType:" << global_info.posType << "; targetHost:" << global_info.host;
"; posType:" << global_info.posType << "; targetHost:" << global_info.svrHost;
LOG() <<"InitClientFun:: " <<"---->Memory privateKey: "<<global_info.localprivatekey
<<" ---->Memory publicKey: "<<global_info.serverpublickey;
......@@ -299,9 +305,9 @@ time_t subDay(time_t time1,int days)
// 处理POS请求数据:
// <1>先校验请求数据有效性; <2>转换Upp识别的请求类型; <3> 生成本地订单数据;
// <4> 整合请求 UppSvr 的请求数据; [第一次调用本dll 会更新 秘钥: GetRSACret -> SendMsg(*,*,*)]
int ProcessPosReqData(const char *indata, int *needcheck, int *reqType_i, string &in)
int ProcessPosReqData(const char *inReqData, int *needcheck, int *reqType_i, string &outPackData)
{
LOG() << "ProcessPosReqDataFun:: Begin-------->" << indata;
LOG() << "ProcessPosReqDataFun:: Begin-------->" << inReqData;
int type, rlt = 0;
*reqType_i = -1;
std::stringstream tmps, tmpkey, datastm;
......@@ -311,13 +317,13 @@ int ProcessPosReqData(const char *indata, int *needcheck, int *reqType_i, string
string transIdstr;
string date;
tmproot.Parse(indata);
tmproot.Parse(inReqData);
if ( tmproot.HasParseError() ) {
LOG() << "Parse error:: request json data exception !";
return 0;
}
root.Parse(indata);
root.Parse(inReqData);
if ( root.HasParseError() ) {
LOG() << "Parse error:: request json data exception !";
return 0;
......@@ -400,18 +406,23 @@ int ProcessPosReqData(const char *indata, int *needcheck, int *reqType_i, string
tmps << std::setw(2) << std::setfill('0') << t->tm_hour;
tmps << std::setw(2) << std::setfill('0') << t->tm_min;
tmps << std::setw(2) << std::setfill('0') << t->tm_sec;
//秒级 存在生成两笔订单, 故将订单号扩展到毫秒级;
SYSTEMTIME sysTime;
GetLocalTime(&sysTime);
tmps << std::setw(3) << std::setfill('0') << sysTime.wMilliseconds;
datastm << t->tm_year + 1900 << "-" << std::setw(2) << std::setfill('0') << t->tm_mon + 1 << "-";
datastm << std::setw(2) << std::setfill('0') << t->tm_mday;
LOG() << "ProcessPosReqDataFun:: Generate partnerOrderId: " << tmps.str();
// Dll Program First Be Loaded, Must GetRSACret From Upp Svr: 参数: 商户号 + 门店号 + Pos机编号 (获取证书 公私秘钥);
if ( initflag == 0 ) {
if (initFlag == 0 ) {
LOG() << "ProcessPosReqDataFun:: First Load Dll, Need GetRSACret From Upp Svr, Begin---->";
// Initialize Global Variable.
if ( GetRSACret( (int)partnerId.GetInt(), storeId.GetString(), stationId.GetString() ) == 1 ) {
LOG() << "ProcessPosReqDataFun:: First Load Dll, GetRSACret From Upp Svr Finished And Success";
initflag = 1;
initFlag = 1;
} else {
LOG() << "ProcessPosReqDataFun:: First Load Dll, GetRSACret From Upp Svr Failed";
}
......@@ -456,18 +467,18 @@ int ProcessPosReqData(const char *indata, int *needcheck, int *reqType_i, string
}
}
in = Tool::DocumentToString(tmproot);
outPackData = Tool::DocumentToString(tmproot);
LOG() << "ProcessPosReqDataFun:: Save Local Db Success, Then Request Upp Svr, ReqBody:" << in;
LOG() << "ProcessPosReqDataFun:: Save Local Db Success, Then Request Upp Svr, ReqBody:" << outPackData;
return 1;
}
//重组请求数据,并重新发送给支付服务器
int ReSendMsg(std::string in) {
LOG() << in.c_str();
//第一次发送给UppServer 失败后, 重组请求数据, 并重新发送给支付服务器
int ReSendMsg(std::string inReq) {
LOG() <<" ReSendMsg: "<< inReq.c_str();
global_info.recvbuf.clear();
Document root;
root.Parse<0>(in.c_str());
root.Parse<0>(inReq.c_str());
if ( root.HasParseError() ) {
global_info.error = string(ERROR_INDATA);
return 0;
......@@ -535,10 +546,10 @@ int ReSendMsg(std::string in) {
}
}
// 向 UppSvr 请求报文中添加成员: posType + dllVersion + serverUrl;
int addRequestExtraFields(string &tmpin) {
// 向 UppSvr 请求报文中添加成员: posType + dllVersion + serverUrl + posIp;
int addRequestExtraFields(string &tmpInOutData) {
Document root;
root.Parse(tmpin.c_str());
root.Parse(tmpInOutData.c_str());
if ( root.HasParseError() ) {
LOG() <<"Error:: addRequestExtraFields: "<< "transform error";
......@@ -554,7 +565,10 @@ int addRequestExtraFields(string &tmpin) {
if ( !root.HasMember(DLL_VER_KEY) )
root.AddMember(DLL_VER_KEY, Value().SetString(DLL_VERSION), root.GetAllocator() );
tmpin = Tool::DocumentToString(root);
if (!root.HasMember(POS_LOCAL_IP))
root.AddMember(POS_LOCAL_IP, Value().SetString( global_info.posIp.c_str(), strlen( global_info.posIp.c_str() ) ), root.GetAllocator());
tmpInOutData = Tool::DocumentToString(root);
return 1;
}
......@@ -593,22 +607,45 @@ __declspec(dllexport) int __stdcall GetValue(char *indata, char *outdata)
}
LOG() << "[**** 1 ****]---->Recv Pos Request:: json data:" << indata ;
char buf[MAX_BUF_LEN] = { 0 };
strcpy_s(buf, strlen(indata) + 1, indata);
// LOG() << "Temp Buff: " << buf;
string in(buf, MAX_BUF_LEN);
string tmpin = "";
// char buffer[MAX_BUF_LEN] = { 0 }; // Request Body Too Big: 56 Product, Each Have 31 Discount Items. Req Body Big 25600 Bytes;
// 申请 Heap 内存,这样就可以动态申请 非固定长度内存; 保证请求报文不被截断
int reqBodyLen = strlen(indata);
int retryMallocCount = 5;
char * buffer = (char *)malloc(reqBodyLen + 1 );
while ( NULL == buffer && retryMallocCount > 0 ) {
LOG() << " Malloc Heap Memory Size: " << reqBodyLen + 1 << " Bytes Faild, Retry count:" << retryMallocCount;
buffer = (char *)malloc(reqBodyLen + 1);
if ( buffer) {
LOG() << " Malloc Heap Memory Size: " << reqBodyLen + 1 << " Bytes Success, Buffer Point: " << buffer;
break;
}
retryMallocCount--;
}
// 判断是否 重试过程中申请内存成功;
if ( NULL == buffer || 0 == retryMallocCount) {
LOG() << " Malloc Heap Memory Size: " << reqBodyLen + 1 << " Bytes Still Faild, Then Return False To Pos , Retry count:" << retryMallocCount;
strcpy(outdata, ERROR_MALLOC_MEMORY);
return 0;
}
memset(buffer,0, reqBodyLen + 1 );
strcpy_s(buffer, reqBodyLen + 1, indata);
string originInputReq(buffer, reqBodyLen);
// 释放堆内存空间, 置空指针;
free( buffer );
buffer = NULL;
string tmpOutPackData = "";
int needcheck = 0;
//POS请求数据的 验证 + 组装 + [Dll 初次调用时证书的获取]
if(ProcessPosReqData(in.c_str(), &needcheck, &reqType_i, tmpin) != 1)
if(ProcessPosReqData(originInputReq.c_str(), &needcheck, &reqType_i, tmpOutPackData) != 1)
{
strcpy(outdata, ERROR_INDATA);
LOG() <<"Error:: "<< "return error message to pos :" << outdata ;
return 0;
}
LOG() << "[**** 2 ****]---->ProcessPosReqData Finished: " << tmpin;
LOG() << "[**** 2 ****]---->ProcessPosReqData Finished: " << tmpOutPackData;
//验证证书
if(global_info.useRSA == 1 && (global_info.serverpublickey.empty() || global_info.localprivatekey.empty()))
......@@ -624,11 +661,11 @@ __declspec(dllexport) int __stdcall GetValue(char *indata, char *outdata)
global_info.sign.clear();
global_info.error = string(ERROR_NETWORK);
//添加 posType + dllVersion + ServerUrl
addRequestExtraFields(tmpin);
LOG() << "[**** 3 ****]---->addRequestExtraFields Finished Then Send Message To Upp Svr: " << tmpin;
//添加 posType + dllVersion + ServerUrl + posIP;
addRequestExtraFields(tmpOutPackData);
LOG() << "[**** 3 ****]---->addRequestExtraFields Finished Then Send Message To Upp Svr: " << tmpOutPackData;
if ( ( ssign = SendMsg(tmpin, global_info.serverurl, 0 ) ) != 1)
if ( ( ssign = SendMsg(tmpOutPackData, global_info.serverurl, 0 ) ) != 1)
{
strcpy(outdata, global_info.error.c_str());
LOG() <<"Error:: "<< "return error message to pos :" << outdata ;
......@@ -638,7 +675,7 @@ __declspec(dllexport) int __stdcall GetValue(char *indata, char *outdata)
//给支付服务器发送信息,发送错误并且需要查询,进行查询操作
if (ssign == -1 && needcheck == 1) {
//查询操作
if(ReSendMsg(tmpin) == 0) {
if(ReSendMsg(tmpOutPackData) == 0) {
strcpy(outdata, global_info.error.c_str());
LOG() <<"Error:: ssign==-1 && needcheck==1, "<< "return error message to pos :" << outdata ;
return 0;
......@@ -731,7 +768,7 @@ size_t GetSignFromResp(void* buffer, size_t size, size_t nmemb, void *userdata)
}
// 使用 localprivatekey 对请求报文进行 RSA 加签操作; 加签后的数据作为请求报文 headers 的一项 [ sign: ***** ]
int GetRSASign(const string &text, string &sign)
int GetRSASign(const string &reqText, string &sign)
{
LOG() <<"GetRSASign:: Begin----->";
char tmp[MAX_SIGN_LEN] = { 0 };
......@@ -739,12 +776,12 @@ int GetRSASign(const string &text, string &sign)
string tmps;
int len = 0;
if((len = DataProcess::GetKeyListFromJson(keys, text)) == 0)
if((len = DataProcess::GetKeyListFromJson(keys, reqText)) == 0)
return 0;
DataProcess::SortString(keys, len);
if(DataProcess::GetValueListFromJson(keys, len, text, tmps) == 0)
if(DataProcess::GetValueListFromJson(keys, len, reqText, tmps) == 0)
return 0;
LOG() << "GetRSASign:: Before Sign data: " << tmps;
......@@ -846,7 +883,7 @@ void GetRealSign()
}
// 向UppSvr 发送请求;
int SendMsg(const std::string &text, const string &url, int getCertification)
int SendMsg(const std::string &reqText, const string &url, int getCertification)
{
LOG() << "SendMsg:: Begin------------>";
curl_global_init(CURL_GLOBAL_ALL);
......@@ -873,7 +910,7 @@ int SendMsg(const std::string &text, const string &url, int getCertification)
}
string sign ;
// 非获取证书请求,都需要将请求报文使用私钥进行加签操作(返回签名数据 添加到请求头中,便于对方校验);
if( GetRSASign(text, sign) == 0 ) {
if( GetRSASign(reqText, sign) == 0 ) {
global_info.error = string(ERROR_SIGN);
LOG() <<"SendMsg:: Error: "<< "Get RSA Sign failed";
return 0;
......@@ -885,22 +922,22 @@ int SendMsg(const std::string &text, const string &url, int getCertification)
headers = curl_slist_append(headers, "Content-Type:text/json;charset=utf-8");
headers = curl_slist_append(headers, "Accept:application/json");
headers = curl_slist_append(headers, "Authorization: Basic dXBzLWNsaWVudDo2VGk4TjBXNzRyb1A=");
if ( global_info.host.length() ) {
headers = curl_slist_append(headers, string("Host:").append(global_info.host).c_str());
if ( global_info.svrHost.length() ) {
headers = curl_slist_append(headers, string("Host:").append(global_info.svrHost).c_str());
}
} else {
/*http请求头:: Host: UppSvr Domain*/
headers = curl_slist_append(headers, "Content-Type:text;charset=utf-8");
headers = curl_slist_append(headers, "Accept:text");
headers = curl_slist_append(headers, "Authorization: Basic dXBzLWNsaWVudDo2VGk4TjBXNzRyb1A=");
if ( global_info.host.length() ) {
headers = curl_slist_append(headers, string("Host:").append(global_info.host).c_str());
if ( global_info.svrHost.length() ) {
headers = curl_slist_append(headers, string("Host:").append(global_info.svrHost).c_str());
}
}
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, text.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, reqText.c_str());
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, GetDataForServer);
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, GetSignFromResp);
......@@ -1032,10 +1069,13 @@ int GetRSACret(int partnerId,const char *storeID,const char *posNo)
return 1;
}
//获取mac地址
//获取: mac地址 + ip地址;
std::string macOut;
Tool::GetMacByAdaptersAddresses(macOut);
LOG() <<"GetRSACret:: Pos Machine Mac Info: "<< macOut;
std::string ipOut;
Tool::GetMacIpByAdaptersAddresses(macOut, ipOut);
LOG() <<"GetRSACret:: Pos Machine Mac: "<< macOut << " IP: " << ipOut;
global_info.posMac = macOut; //Mac Address Before DES3Encode ;
global_info.posIp = ipOut;
char outmsg[MAX_BUF_LEN] = { 0 };
int legth = 0;
......@@ -1044,15 +1084,16 @@ int GetRSACret(int partnerId,const char *storeID,const char *posNo)
if ( ( legth = DataProcess::DES3Encode((const unsigned char *)DES3_KEY_STR.c_str(),
macOut.c_str(), macOut.length(), (unsigned char *)outmsg, MAX_BUF_LEN) ) == 0 )
{
LOG() << "GetRSACret:: 3DES encode failed";
LOG() << "GetRSACret:: Mac Address 3DES encode failed";
return 0;
}
LOG() << "GetRSACret:: 3DES Encode(base64): " << outmsg ;
LOG() << "GetRSACret:: Mac Address 3DES Encode(base64): " << outmsg ;
char request[MAX_BUF_LEN] = { 0 };
sprintf_s(request, MAX_BUF_LEN, REQUEST_CRET, partnerId, storeID, posNo, outmsg, global_info.posType, DLL_VERSION, global_info.serverurl.c_str() );
sprintf_s(request, MAX_BUF_LEN, REQUEST_CRET, partnerId, storeID, posNo,
outmsg, ipOut.c_str(), global_info.posType, DLL_VERSION, global_info.serverurl.c_str() );
LOG() <<"GetRSACret:: DownloadRsaKey Req Upp Svr Body: "<< request;
......@@ -1102,13 +1143,8 @@ void testinitclient()
InitClient();
}
//char a[] = "{\"ver\":1,\"partnerId\":1234,\"reqType\": 62,\"coupon\": \"122222222222\",\"stationId\": \"1\",\"storeId\": \"999999\",\"operator_id\": \"00000002\" }";
//char a[] = "{\r\n \"pay_transId\":\"2017052600001162504297\",\r\n \"total_amount\":1,\r\n \"mcoupon_amount\":0,\r\n \"alipay_amount\":1,\r\n \"pay_ebcode\":\"10010\",\r\n \"ver\":1,\r\n \"fmId\":\"SXA1377O27012186844\",\r\n \"pay_date\":\"2017-05-26 17:01:16.004\",\r\n \"statusCode\":100\r\n}";
//char a[] = "{\"businessDate\":\"20170526\",\"code\":\"7310180009462033\",\"operatorId\":\"90001\",\"partnerId\":1443,\"products\":[{\"consume_num\":1,\"discount\":0,\"name\":\"Coffee\",\"number\":0,\"payment\":null,\"pid\":\"3488\",\"price\":3100,\"priceAct\":0,\"salesType\":\"Normal\",\"scope\":null}],\"promotionTag\":null,\"reqType\":71,\"stationId\":\"3\",\"storeId\":\"1713\",\"transAmount\":3100,\"transId\":\"6460\",\"undiscountAmount\":0,\"ver\":1}";
//char a[] = "{\r\n \"ver\": 1,\r\n \"reqType\": 0,\r\n \"partnerId\": 1443,\r\n \"stationId\": \"1\",\r\n \"storeId\": \"16171\",\r\n \"operatorId\": \"9\",\r\n \"code\": \"120520219319771\"\r\n}";
//char a[] = "{\r\n \"ver\": 1,\r\n \"reqType\": 62,\r\n \"partnerId\": 1443,\r\n \"storeId\": \"16171\",\r\n \"stationId\": \"1\",\r\n \"refundId\": \"1\",\r\n \"partnerOrderId\": \"73101800094636814\",\r\n \"operatorId\": \"2\",\r\n \"code\": \"7310180009463684\",\r\n \"fmId\": \"3684180423Z00000001\",\r\n \"businessDate\": \"20180423\",\r\n \"refundAmount\": 100\r\n}";
//char a[] = "{\r\n \"transAmount\": 100,\r\n \"ver\": 1,\r\n \"reqType\": 0,\r\n \"partnerId\": 1446,\r\n \"stationId\": \"1\",\r\n \"storeId\": \"160205\",\r\n \"operatorId\": \"9\",\r\n \"code\": \"231911841939438065993\",\r\n \"action\":\"101\",\r\n \"products\":[\r\n {\r\n \"number\":0,\r\n \"priceAct\": 0,\r\n \"price\": 1,\r\n \"name\":\"Coffee\",\r\n \"discount\": 0,\r\n \"pid\":\"1112134\",\r\n \"consumeNum\":0,\r\n \"categoryId\":\"11\",\r\n \"selected\":\"1\"\r\n }\r\n ]\r\n}";
char a[] = "{\r\n \"ver\": \"1\",\r\n \"reqType\": 71,\r\n \"partnerId\": 1443,\r\n \"stationId\": \"1\",\r\n \"storeId\": \"16171\",\r\n \"operatorId\": \"9\",\r\n \"code\": \"120884658694630\",\r\n \"transId\":\"333388\",\r\n \"businessDate\":\"20180402\",\r\n \"partnerOrderId\":\"144316171120180402094813\"\r\n}";
//char a[] = "{\r\n \"ver\": \"1\",\r\n \"reqType\": 100,\r\n \"partnerId\": 1446,\r\n \"stationId\": \"1\",\r\n \"storeId\": \"160205\",\r\n \"operatorId\": \"9\",\r\n \"code\": \"120884658694630\",\r\n \"transId\":\"144316171920180402061907\",\r\n \"businessDate\":\"20180402\"\r\n}";
//char a[] = "{\r\n \"businessDate\": \"20170601\",\r\n \"code\": \"120522852861225\",\r\n \"operatorId\": \"90001\",\r\n \"partnerId\": 1438,\r\n \"partnerOrderId\": \"1443171223323\",\r\n \"products\": [\r\n {\r\n \"consume_num\": 1,\r\n \"discount\": 0,\r\n \"name\": \"Coffee\",\r\n \"number\": 0,\r\n \"payment\": null,\r\n \"pid\": \"3488\",\r\n \"price\": 3100,\r\n \"priceAct\": 0,\r\n \"salesType\": \"Normal\",\r\n \"scope\": null\r\n }\r\n ],\r\n \"promotionTag\": null,\r\n \"reqType\": 0,\r\n \"stationId\": \"1\",\r\n \"storeId\": \"16171\",\r\n \"transAmount\": 29,\r\n \"transId\": \"1\",\r\n \"undiscountAmount\": 0,\r\n \"ver\": 1\r\n}";
......@@ -1123,21 +1159,8 @@ int main()
{
char storeid[] = "12344";
char posno[] = "01";
//TestComplementJson();
//Test_RSASign();
//Test_RSAVerify();
//Test_GetPEMKey();
//Test_3DES();
//Test_LOG();
//Test_GetJsonKey();
//testinitclient();
char b[MAX_BUF_LEN];
//char c[MAX_BUF_LEN] = { 0 };
//strcpy(c, TEST_CG);
//TestRETDES();
//GetRSACret(1443, storeid, posno);
GetValue(a, b);
//testCheckRollbackData();
system("pause");
return 0;
}
......
No preview for this file type
......@@ -7,6 +7,7 @@
//#define ERROR_INDATA "{\"statusCode\": 302, \"message\": \"输入参数非json或为空\"}"
//#define ERROR_INDATA "{\"statusCode\": 302, \"message\": \"\u8F93\u5165\u53C2\u6570\u975Ejson\u6216\u4E3A\u7A7A\"}"
#define ERROR_INDATA "{\"statusCode\": 302, \"message\": \"\350\276\223\345\205\245\345\217\202\346\225\260\351\235\236json\346\210\226\344\270\272\347\251\272\"}"
#define ERROR_MALLOC_MEMORY "{\"statusCode\": 302, \"message\": \"Malloc Big Memory Failed\"}"
//#define ERROR_OUTDATA "{\"statusCode\": 303, \"message\": \"服务端返回数据异常\"}"
//#define ERROR_OUTDATA "{\"statusCode\": 303, \"message\": \"\u670D\u52A1\u7AEF\u8FD4\u56DE\u6570\u636E\u5F02\u5E38\"}"
#define ERROR_OUTDATA "{\"statusCode\": 303, \"message\": \"\346\234\215\345\212\241\347\253\257\350\277\224\345\233\236\346\225\260\346\215\256\345\274\202\345\270\270\"}"
......
......@@ -10,14 +10,15 @@
#define MAX_SIGN_LEN 256
#define CFG_FILE_NAME "fmclient.cfg"
#define RBG_FILE_NAME "fmclient.rbk"
#define REQUEST_CRET "{\"ver\": 1,\"reqType\": 99,\"partnerId\":%d,\"storeId\":\"%s\",\"stationId\": \"%s\",\"mac\":\"%s\",\"posType\":%d,\"dllVersion\":\"%s\",\"serverUrl\":\"%s\"}"
#define REQUEST_CRET "{\"ver\": 1,\"reqType\": 99,\"partnerId\":%d,\"storeId\":\"%s\",\"stationId\": \"%s\",\"mac\":\"%s\",\"posIp\":\"%s\",\"posType\":%d,\"dllVersion\":\"%s\",\"serverUrl\":\"%s\"}"
//CCO-1438
#define CCO_DES3_KEY "ABCD@#9876DFSAAWKLDEOPDD"
//EC-1446
#define EC_DES3_KEY "DDDDEEEE45LPODDCXZZLKDDO"
#define DLL_VERSION "2.21.1.12"
// Modify Running Program Version , Also Need Modify fmclient.rc File Version;
#define DLL_VERSION "2.21.7.15"
#define CRET_FILE_NAME "client.p12"
#define JSON_KEY_ONLY "partnerOrderId"
......@@ -30,4 +31,5 @@
#define POS_TYPE_KEY "posType"
#define UPS_URL_KEY "serverUrl"
#define DLL_VER_KEY "dllVersion"
#define POS_LOCAL_IP "posIp"
#endif
\ No newline at end of file
......@@ -12,6 +12,7 @@
#include "filesystem.h"
#include <winsock2.h>
#include <WS2tcpip.h>
#include <iphlpapi.h>
#pragma comment(lib, "IPHLPAPI.lib")
......@@ -21,8 +22,8 @@ using namespace rapidjson;
class Tool {
public:
static int GetMacByAdaptersAddresses(std::string& macOut) {
bool ret = 0;
static int GetMacIpByAdaptersAddresses(std::string& macOut, std::string& ipOut ) {
bool ret = 0;
ULONG outBufLen = sizeof(IP_ADAPTER_ADDRESSES);
PIP_ADAPTER_ADDRESSES pAddresses = (IP_ADAPTER_ADDRESSES*)malloc(outBufLen);
......@@ -39,6 +40,8 @@ public:
if(GetAdaptersAddresses(AF_UNSPEC, 0, NULL, pAddresses, &outBufLen) == NO_ERROR)
{
char buff[20] = { 0 };
DWORD bufflen = 20;
// If successful, output some information from the data we received
for(PIP_ADAPTER_ADDRESSES pCurrAddresses = pAddresses; pCurrAddresses != NULL; pCurrAddresses = pCurrAddresses->Next)
{
......@@ -55,10 +58,38 @@ public:
int (pCurrAddresses->PhysicalAddress[5]));
macOut = acMAC;
ret = 1;
break;
}
}
//pCurrAddresses->Dhcpv4Server // 通过 SOCKET_ADDRESS 地址进行 转换获取 准确的IPv4 地址;
PIP_ADAPTER_UNICAST_ADDRESS pUnicast = pCurrAddresses->FirstUnicastAddress;
if (pUnicast != NULL) {
for (int i = 0; pUnicast != NULL; i++) {
if (pUnicast->Address.lpSockaddr->sa_family == AF_INET) {
sockaddr_in *sa_in = (sockaddr_in *)pUnicast->Address.lpSockaddr;
inet_ntop(AF_INET, &(sa_in->sin_addr), buff, bufflen);
LOG() <<" GetMacIpByAdaptersAddresses IPv4: "<< buff;
ipOut = buff;
}
else if (pUnicast->Address.lpSockaddr->sa_family == AF_INET6) {
/*
sockaddr_in6 *sa_in6 = (sockaddr_in6 *)pUnicast->Address.lpSockaddr;
printf("\tIPV6:%s\n", inet_ntop(AF_INET6, &(sa_in6->sin6_addr), buff, bufflen));
*/
} else {
LOG() << "GetMacIpByAdaptersAddresses sa_family UNSPEC";
ipOut = "sa_family UNSPEC";
}
pUnicast = pUnicast->Next;
}
} else {
LOG() << " GetMacIpByAdaptersAddresses No Unicast Addresses";
ipOut = "FirstUnicastAddress Is NULL";
}
// Get First Unicast IP Address From Adapter Finished ;
ret = 1;
break;
}
}
free(pAddresses);
return ret;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment