Commit b8703dfa by wuyang.zou

fix

1、整理 Upp 发版提测范围  测试机器范围  Pilot门店起步范围
2、在 fmclient 获取 证书公私钥时,将 dllVerison + serverUrl 信息上传
parent d09eda57
>>>>>>>>>>>>>>>>Apply For QA , Test Scope>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>Apply For QA , Test Scope>>>>>>>>>>>>>>>>>>
3.2.1、微信支付 销售 / 退货
3.2.2、支付宝支付 销售 / 退货
3.2.3、现金支付 销售 / 退货
3.2.4、券支付 销售 / 退货
3.2.5、星礼卡支付 销售 / 退货
3.2.6、商品券+代金券+折扣券 【cmb券不走Upp 核销】 销售 / 退货
3.2.7、银联支付 销售 / 退货
3.2.8、点2杯饮品,其中1杯使用指定BOGO折扣,
点选折扣后使用饮品券兑换,能使用成功 销售 / 退货
3.2.9、打印日结单
新增的测试点:
3.3.0、会员通场景下的招行券的兑换和冲正
3.3.1、星礼卡的查询、激活、退卡、充值和取消充值
3.3.2、支付宝微信签到
----------------------------------------------------------------------------------------
>>>>>>>>>>>>>>>>Test Pos Machine>>>>>>>>>>>>>>>>>>
测试机:10.73.194.223(EC),
10.73.194.216 (CCO),
10.73.194.109 (Roastery)
----------------------------------------------------------------------------------------
>>>>>>>>>>>>>>>>>>Pilot Store>>>>>>>>>>>>>>>>>>>>>>>>>>>>
广州区域店
【广州保利香槟花园店 020-38373501/020-38373502 31835 * 】
【广州黄埔大道西店 020-89817920/020-89819597 51889 * 】
【广州太阳新天地店 020-37887461/020-37887460 29199 * 】
【广州邦华环球国际分店 020-61972251/020-61972252 20145 * 】
【广州花城汇四店 020-37276403/020-37276352 57311 * 】
---------------------------------
【广州花城湾店 020-37260486/020-37261073 22371 * 】
【广州华亿丽晶店 020-38255530/020-38788740 16171 * 】
【广州南国商苑店 020-38686150/020-38686151 15999 * 】
【广州中国联通大厦店 020-22088718/020-22088719 16486 * 】
----------------------------------------------------------------------------------------
>>>>>>>>>>>>>>>>>>Test Coupon + TransID >>>>>>>>>>>>>>>>>>>>>>>>>>>>
支付宝: 299900002222123456
券支付: 7310292370021909232=A9CFD5E5D4843E83
----------------------------------------------------------------------------------------
\ No newline at end of file
......@@ -372,14 +372,14 @@ public:
}
/***********************************
*GetJsonKeyArray : 获取json中非array非object的key
*GetKeyListFromJson : 获取json中非array非object的key
*keys :json的key数组
*json : json字符串
*返回 :0 失败; 非0表示key的数量
***********************************/
static int GetJsonKeyArray(std::string* keys,const std::string &json)
static int GetKeyListFromJson(std::string* keys,const std::string &json)
{
LOG() << "GetJsonKeyArray";
LOG() << "GetKeyListFromJson";
Document root;
Value value;
......@@ -426,13 +426,13 @@ public:
}
/***********************************
*GetValueFromJson : 按照顺序
*GetValueListFromJson : 按照顺序
*keys :json的key数组
*json : length数组长度
***********************************/
static int GetValueFromJson(const std::string *keys, int length, const std::string &json, std::string &outmsg)
static int GetValueListFromJson(const std::string *keys, int length, const std::string &json, std::string &outmsg)
{
LOG() <<"GetValueFromJson";
LOG() <<"GetValueListFromJson";
Document root;
Value value;
int num;
......
......@@ -161,18 +161,18 @@ int CheckRBK() {
}
// 载入本地证书文件中 公钥+私钥数据;
void LoadCret()
/*
void LoadLocalCret()
{
global_info.serverpublickey.clear();
global_info.localprivatekey.clear();
string filepath;
FileSys::GetProcPath(filepath);
filepath.append(CRET_FILE_NAME);
std::ifstream filestm(filepath);
if ( _access(filepath.c_str(),0) != 0 ) {
LOG() << "LoadCretFun:: Not Found " << filepath;
LOG() << "LoadLocalCret:: Not Found " << filepath;
return ;
}
......@@ -181,7 +181,7 @@ void LoadCret()
filestm.seekg(0, std::ios::beg);
if(length == 0) {
LOG() <<"Error:: LoadCretFun:: "<< CRET_FILE_NAME <<" File size 0" ;
LOG() <<"LoadLocalCret:: "<< CRET_FILE_NAME <<" File size 0" ;
filestm.close();
return ;
}
......@@ -195,15 +195,16 @@ void LoadCret()
if (DataProcess::DES3Decode((const unsigned char *)DES3_KEY_STR.c_str(), req, strlen(req),
(unsigned char *)rps, MAX_BUF_LEN) == 0 )
{
LOG() <<"LoadCretFun:: "<< CRET_FILE_NAME <<" DES3Decode Failed ";
LOG() <<"LoadLocalCret:: "<< CRET_FILE_NAME <<" DES3Decode Failed ";
remove(filepath.c_str());
return ;
}
// 后续代码基本没有机会走下去了;
Document root;
root.Parse(rps);
if ( root.HasParseError() ) {
LOG() <<"Error:: LoadCretFun:: "<< CRET_FILE_NAME<< "DES3Decode Return argv is not json";
LOG() <<"LoadLocalCret:: "<< CRET_FILE_NAME<< " DES3Decode Return Argv Is Not Json";
return ;
}
......@@ -211,39 +212,40 @@ void LoadCret()
if ( root.HasMember("statusCode") ) {
statusCode = root["statusCode"];
} else {
LOG() <<"Error:: LoadCretFun:: "<< "DES3Decode Result's statusCode No Exist";
LOG() <<"LoadLocalCret:: "<< " DES3Decode Result's statusCode No Exist";
return;
}
if ( !statusCode.IsInt() ) {
LOG() <<"Error:: LoadCretFun:: " << "DES3Decode Result's statusCode error";
LOG() <<"LoadLocalCret:: " << " DES3Decode Result's statusCode Error";
}
int code = statusCode.GetInt();
if(code == 100) {
Value serverpublickey;
Value localprivatekey;
Value serverPublicKey;
Value localPrivateKey;
if ( root.HasMember("serverPublicKey") && root.HasMember("clientPrivateKey") ) {
serverpublickey = root["serverPublicKey"];
localprivatekey = root["clientPrivateKey"];
serverPublicKey = root["serverPublicKey"];
localPrivateKey = root["clientPrivateKey"];
} else {
LOG() <<"Error:: LoadCretFun:: " << "serverpublickey or localprivatekey No Exist ";
LOG() <<"LoadLocalCret:: " << " serverPublicKey or clientPrivateKey No Exist ";
return;
}
if(serverpublickey == NULL || !serverpublickey.IsString() ||
localprivatekey == NULL || !localprivatekey.IsString() )
if(serverPublicKey == NULL || !serverPublicKey.IsString() ||
localPrivateKey == NULL || !localPrivateKey.IsString() )
{
LOG() <<"Error:: LoadCretFun:: " << "serverpublickey or localprivatekey error";
LOG() <<"LoadLocalCret:: " << " serverPublicKey or localPrivateKey Error ";
return;
}
global_info.serverpublickey = string(serverpublickey.GetString());
global_info.localprivatekey = string(localprivatekey.GetString());
LOG() <<"LoadCretFun:: "<< "server public key: " << global_info.serverpublickey;
LOG() <<"LoadCretFun:: "<< "client private key: " << global_info.localprivatekey;
global_info.serverpublickey = string(serverPublicKey.GetString());
global_info.localprivatekey = string(localPrivateKey.GetString());
LOG() <<"LoadLocalCret:: "<< "Get Server Public Key: " << global_info.serverpublickey;
LOG() <<"LoadLocalCret:: "<< "Get Client Private Key: " << global_info.localprivatekey;
}
}
*/
// 初始化 客户端相关数据: 读取配置+内存中无证书则载入本地证书文件数据+....
int InitClient()
......@@ -280,8 +282,11 @@ int InitClient()
LOG() <<"InitClientFun:: " <<"---->Memory privateKey: "<<global_info.localprivatekey
<<" ---->Memory publicKey: "<<global_info.serverpublickey;
/*
// 没有意义读取本地 证书文件, Dll初次被调用就会 从 Upp Server 下载最新的证书公私钥;
if(global_info.serverpublickey.empty() || global_info.localprivatekey.empty())
LoadCret();
LoadLocalCret();
*/
return 1;
}
......@@ -403,6 +408,7 @@ int ProcessPosReqData(const char *indata, int *needcheck, int *reqType_i, string
// Dll Program First Be Loaded, Must GetRSACret From Upp Svr: 参数: 商户号 + 门店号 + Pos机编号 (获取证书 公私秘钥);
if ( initflag == 0 ) {
LOG() << "ProcessPosReqDataFun:: First Load Dll, Need GetRSACret From Upp Svr, Begin---->";
if ( GetRSACret( (int)partnerId.GetInt(), storeId.GetString(), stationId.GetString() ) == 1 ) {
LOG() << "ProcessPosReqDataFun:: First Load Dll, GetRSACret From Upp Svr Finished And Success";
initflag = 1;
......@@ -571,7 +577,7 @@ __declspec(dllexport) int __stdcall GetValue(char *indata, char *outdata)
LOG() <<"<******* Dll-GetValue() Version:: "<< DLL_VERSION << " *******>";
int reqType_i = 0;
//读取配置文件
//读取配置文件 (但不读 证书文件 client.p12)
if(InitClient() == 0) {
strcpy(outdata, ERROR_CLIENT_CFG);
LOG() <<"Error:: "<< "return json to pos" << outdata;
......@@ -717,7 +723,7 @@ size_t GetDataForServer(void* buffer, size_t size, size_t nmemb, void *userdata)
}
// Curl 请求 设置 CURLOPT_HEADERFUNCTION;读取 UppSvr 返回 headers 中的签名;
size_t GetSign(void* buffer, size_t size, size_t nmemb, void *userdata)
size_t GetSignFromResp(void* buffer, size_t size, size_t nmemb, void *userdata)
{
unsigned int i = size * nmemb;
global_info.sign.append((const char *)buffer, i);
......@@ -733,12 +739,12 @@ int GetRSASign(const string &text, string &sign)
string tmps;
int len = 0;
if((len = DataProcess::GetJsonKeyArray(keys, text)) == 0)
if((len = DataProcess::GetKeyListFromJson(keys, text)) == 0)
return 0;
DataProcess::SortString(keys, len);
if(DataProcess::GetValueFromJson(keys, len, text, tmps) == 0)
if(DataProcess::GetValueListFromJson(keys, len, text, tmps) == 0)
return 0;
LOG() << "GetRSASign:: Before Sign data: " << tmps;
......@@ -802,14 +808,14 @@ int CheckRSASignData()
LOG() << "CheckRSASignData:: Get Sign From Upp Svr Return: " << global_info.sign;
// 初步猜测 仅遍历最外层 Json-key 集合;
if( ( len = DataProcess::GetJsonKeyArray(keys, global_info.recvbuf) ) == 0)
if( ( len = DataProcess::GetKeyListFromJson(keys, global_info.recvbuf) ) == 0)
return 0;
// 初步猜测根据 Key字母升序排序;
DataProcess::SortString(keys, len);
// 根据Key查找出其Value 并输出;
if(DataProcess::GetValueFromJson(keys, len, global_info.recvbuf, tmps) == 0)
if(DataProcess::GetValueListFromJson(keys, len, global_info.recvbuf, tmps) == 0)
return 0;
LOG() << "CheckRSASignData:: Begin Check Recv Sign Data , Sort Keys Length: "<<len
......@@ -897,7 +903,7 @@ int SendMsg(const std::string &text, const string &url, int getCertification)
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, text.c_str());
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, GetDataForServer);
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, GetSign);
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, GetSignFromResp);
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
......@@ -923,10 +929,10 @@ int SendMsg(const std::string &text, const string &url, int getCertification)
// 检查证书(公钥+私钥) 并更新最新 证书数据到 证书文件中;
// Return: 1:成功 0:失败
int CheckCret() {
int CheckAndSaveCret() {
if(global_info.recvbuf.size() == 0) {
LOG() << "CheckCret:: Recv Buf Is NULL";
LOG() << "CheckAndSaveCret:: Recv Buf Is NULL";
return 0;
}
......@@ -936,11 +942,11 @@ int CheckCret() {
if ( ( legth = DataProcess::DES3Decode((const unsigned char *)DES3_KEY_STR.c_str(),
global_info.recvbuf.c_str(), global_info.recvbuf.length(), (unsigned char *)outmsg, MAX_BUF_LEN) ) == 0 )
{
LOG() << "CheckCret:: 3DES encode failed";
LOG() << "CheckAndSaveCret:: 3DES encode failed";
return 0;
}
LOG() << "CheckCret:: 3DES Decode: " << outmsg ;
LOG() << "CheckAndSaveCret:: 3DES Decode: " << outmsg ;
Document root;
#ifdef FM_TESTS
......@@ -951,14 +957,14 @@ int CheckCret() {
#endif
if(root.HasParseError()) {
LOG() << "CheckCret:: Argv Is Not Json :" << root.GetParseError();
LOG() << "CheckAndSaveCret:: Argv Is Not Json :" << root.GetParseError();
return 0;
}
Value statusCode;
statusCode = root["statusCode"];
if ( statusCode.IsNull() || !statusCode.IsInt() ) {
LOG() << "statusCode error";
LOG() << "CheckAndSaveCret:: statusCode error";
return 0;
}
......@@ -977,14 +983,14 @@ int CheckCret() {
return 0;
}
Value serverpublickey;
Value localprivatekey;
serverpublickey = root["serverPublicKey"];
localprivatekey = root["clientPrivateKey"];
Value serverPublicKey;
Value localPrivateKey;
serverPublicKey = root["serverPublicKey"];
localPrivateKey = root["clientPrivateKey"];
if (serverpublickey.IsNull() || !serverpublickey.IsString() || localprivatekey.IsNull() || !localprivatekey.IsString())
if (serverPublicKey.IsNull() || !serverPublicKey.IsString() || localPrivateKey.IsNull() || !localPrivateKey.IsString())
{
LOG() << "CheckCret:: serverpublickey or localprivatekey error";
LOG() << "CheckAndSaveCret:: serverPublicKey Or localPrivateKey Error";
return 0;
}
......@@ -992,11 +998,11 @@ int CheckCret() {
filestm.flush();
filestm.close();
global_info.serverpublickey = string((char*)serverpublickey.GetString());
global_info.localprivatekey = string((char*)localprivatekey.GetString());
global_info.serverpublickey = string((char*)serverPublicKey.GetString());
global_info.localprivatekey = string((char*)localPrivateKey.GetString());
LOG() << "CheckCret:: Server Public Key: " << global_info.serverpublickey;
LOG() << "CheckCret:: Client Private Key: " << global_info.localprivatekey;
LOG() << "CheckAndSaveCret:: Server Public Key: " << global_info.serverpublickey;
LOG() << "CheckAndSaveCret:: Client Private Key: " << global_info.localprivatekey;
} else {
return 0;
}
......@@ -1008,7 +1014,7 @@ int CheckCret() {
/*************************GetCret :从签名服务获取************/
// 根据: 商户号 + 门店号 + POS编号 + POS机器MAC地址DES3Encode后密文,获取 RSA 签名证书(公私 秘钥)
// 调用 SendMsg(string(request), global_info.cretserverurl, 1) 进行获取证书操作: 尾部参数 1: 标识单纯获取证书;
// 调用 CheckCret() 将最新证书(公私 秘钥) 存储本地;
// 调用 CheckAndSaveCret() 将最新证书(公私 秘钥) 存储本地;
int GetRSACret(int partnerId,const char *storeID,const char *posNo)
{
LOG() << "GetRSACret:: Begin:: ---->";
......@@ -1028,7 +1034,7 @@ int GetRSACret(int partnerId,const char *storeID,const char *posNo)
//获取mac地址
std::string macOut;
Tool::GetMacByGetAdaptersAddresses(macOut);
Tool::GetMacByAdaptersAddresses(macOut);
LOG() <<"GetRSACret:: Pos Machine Mac Info: "<< macOut;
char outmsg[MAX_BUF_LEN] = { 0 };
......@@ -1046,7 +1052,7 @@ int GetRSACret(int partnerId,const char *storeID,const char *posNo)
char request[MAX_BUF_LEN] = { 0 };
sprintf_s(request, MAX_BUF_LEN, REQUEST_CRET, partnerId, storeID, posNo, outmsg, global_info.posType);
sprintf_s(request, MAX_BUF_LEN, REQUEST_CRET, partnerId, storeID, posNo, outmsg, global_info.posType, DLL_VERSION, global_info.serverurl.c_str() );
LOG() <<"GetRSACret:: DownloadRsaKey Req Upp Svr Body: "<< request;
......@@ -1054,6 +1060,7 @@ int GetRSACret(int partnerId,const char *storeID,const char *posNo)
// 未定义宏: FM_TESTS
#ifndef FM_TESTS
// 请求获取证书公私钥;
if ( SendMsg(string(request), global_info.cretserverurl, 1) == 0 ) {
LOG() << "GetRSACret:: Error: "<< "Recive Data From: " << global_info.cretserverurl << " Failed";
return 0;
......@@ -1063,8 +1070,8 @@ int GetRSACret(int partnerId,const char *storeID,const char *posNo)
#ifdef FM_TESTS
global_info.recvbuf = string(outmsg);
#endif
if ( CheckCret() == 0 ) {
// 检查 从 Upp Server 获得的证书公私钥,并将 ①证书存储到本地文件,②公私钥存储在内存;
if ( CheckAndSaveCret() == 0 ) {
LOG() << "GetRSACret:: Error: "<< "Check Cret failed";
return 0;
}
......
......@@ -10,7 +10,7 @@
#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}"
#define REQUEST_CRET "{\"ver\": 1,\"reqType\": 99,\"partnerId\":%d,\"storeId\":\"%s\",\"stationId\": \"%s\",\"mac\":\"%s\",\"posType\":%d,\"dllVersion\":\"%s\",\"serverUrl\":\"%s\"}"
//CCO-1438
#define CCO_DES3_KEY "ABCD@#9876DFSAAWKLDEOPDD"
......
......@@ -21,7 +21,7 @@ using namespace rapidjson;
class Tool {
public:
static int GetMacByGetAdaptersAddresses(std::string& macOUT) {
static int GetMacByAdaptersAddresses(std::string& macOut) {
bool ret = 0;
ULONG outBufLen = sizeof(IP_ADAPTER_ADDRESSES);
......@@ -53,7 +53,8 @@ public:
int (pCurrAddresses->PhysicalAddress[3]),
int (pCurrAddresses->PhysicalAddress[4]),
int (pCurrAddresses->PhysicalAddress[5]));
macOUT = acMAC;
macOut = acMAC;
ret = 1;
break;
}
......
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