Commit f89a1bb2 by wuyang.zou

1、将 fmclient.dll EC-1446 + CCO-1438 两个区域版本进行合并

2、程序 兼容 fmclient.cfg 配置文件是老文件的缺陷bug: 无 Upp Svr 域名;

3、Version:1.20.11.3

4、fmclient.dll -> 星巴克卡券核销 + 打印日结报表;
parent ffbdea21
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
......@@ -20,12 +20,14 @@
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
......
No preview for this file type
生成启动时间为 2018/4/18 16:53:17。
1>项目“D:\FM\sbkClient\ZH_Client\ZH_Client.vcxproj”在节点 2 上(build 个目标)。
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\Win32\Microsoft.Cpp.Win32.Targets(518,5): error MSB8008: 指定的平台工具集(v110)未安装或无效。请确保选择受支持的 PlatformToolset 值。
1>已完成生成项目“D:\FM\sbkClient\ZH_Client\ZH_Client.vcxproj”(build 个目标)的操作 - 失败。
生成启动时间为 2020/11/2 17:42:19。
1>项目“E:\zouwuyang\StarBucks\UPP-Client-Project\fmclient-CCO-1438\sbkclient\ZH_Client\ZH_Client.vcxproj”在节点 2 上(rebuild 个目标)。
1>InitializeBuildStatus:
正在创建“Release\fmclient.unsuccessfulbuild”,因为已指定“AlwaysCreate”。
ClCompile:
D:\VS2010\VC\bin\CL.exe /c /I"D:\Program Files (x86)\Visual Leak Detector\include" /Zi /nologo /W3 /WX- /O2 /Oi /Oy- /GL /D WIN32 /D NDEBUG /D _CONSOLE /D _WINDLL /D _MBCS /Gm- /EHsc /MD /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Fo"Release\\" /Fd"Release\vc100.pdb" /Gd /TP /analyze- /errorReport:prompt main.cpp sbk_client.cpp
main.cpp
sbk_client.cpp
1>e:\zouwuyang\starbucks\upp-client-project\fmclient-cco-1438\sbkclient\zh_client\fmlog.h(19): warning C4996: 'localtime': This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
D:\VS2010\VC\include\time.inl(112) : 参见“localtime”的声明
1>e:\zouwuyang\starbucks\upp-client-project\fmclient-cco-1438\sbkclient\zh_client\fmlog.h(25): warning C4996: 'mkdir': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _mkdir. See online help for details.
D:\VS2010\VC\include\direct.h(124) : 参见“mkdir”的声明
1>e:\zouwuyang\starbucks\upp-client-project\fmclient-cco-1438\sbkclient\zh_client\fmlog.h(52): warning C4996: 'localtime': This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
D:\VS2010\VC\include\time.inl(112) : 参见“localtime”的声明
1>e:\zouwuyang\starbucks\upp-client-project\fmclient-cco-1438\sbkclient\zh_client\dataprocess.h(367): warning C4018: “>”: 有符号/无符号不匹配
1>e:\zouwuyang\starbucks\upp-client-project\fmclient-cco-1438\sbkclient\zh_client\dataprocess.h(370): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
D:\VS2010\VC\include\string.h(105) : 参见“strcpy”的声明
1>e:\zouwuyang\starbucks\upp-client-project\fmclient-cco-1438\sbkclient\zh_client\dataprocess.h(457): warning C4996: 'itoa': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _itoa. See online help for details.
D:\VS2010\VC\include\stdlib.h(867) : 参见“itoa”的声明
1>e:\zouwuyang\starbucks\upp-client-project\fmclient-cco-1438\sbkclient\zh_client\fmtool.h(55): warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
D:\VS2010\VC\include\stdio.h(371) : 参见“sprintf”的声明
1>e:\zouwuyang\starbucks\upp-client-project\fmclient-cco-1438\sbkclient\zh_client\fmtool.h(72): warning C4996: 'itoa': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _itoa. See online help for details.
D:\VS2010\VC\include\stdlib.h(867) : 参见“itoa”的声明
1>e:\zouwuyang\starbucks\upp-client-project\fmclient-cco-1438\sbkclient\zh_client\fmtool.h(79): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
D:\VS2010\VC\include\string.h(105) : 参见“strcpy”的声明
1>e:\zouwuyang\starbucks\upp-client-project\fmclient-cco-1438\sbkclient\zh_client\fmtool.h(131): warning C4018: “<”: 有符号/无符号不匹配
1>e:\zouwuyang\starbucks\upp-client-project\fmclient-cco-1438\sbkclient\zh_client\fmtool.h(191): warning C4018: “<”: 有符号/无符号不匹配
1>e:\zouwuyang\starbucks\upp-client-project\fmclient-cco-1438\sbkclient\zh_client\fmtool.h(242): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
D:\VS2010\VC\include\string.h(105) : 参见“strcpy”的声明
1>sbk_client.cpp(98): warning C4244: “初始化”: 从“std::streamoff”转换到“int”,可能丢失数据
1>sbk_client.cpp(180): warning C4244: “初始化”: 从“std::streamoff”转换到“int”,可能丢失数据
1>sbk_client.cpp(391): warning C4996: 'localtime': This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
D:\VS2010\VC\include\time.inl(112) : 参见“localtime”的声明
1>sbk_client.cpp(571): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
D:\VS2010\VC\include\string.h(105) : 参见“strcpy”的声明
1>sbk_client.cpp(579): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
D:\VS2010\VC\include\string.h(105) : 参见“strcpy”的声明
1>sbk_client.cpp(596): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
D:\VS2010\VC\include\string.h(105) : 参见“strcpy”的声明
1>sbk_client.cpp(605): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
D:\VS2010\VC\include\string.h(105) : 参见“strcpy”的声明
1>sbk_client.cpp(622): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
D:\VS2010\VC\include\string.h(105) : 参见“strcpy”的声明
1>sbk_client.cpp(631): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
D:\VS2010\VC\include\string.h(105) : 参见“strcpy”的声明
1>sbk_client.cpp(635): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
D:\VS2010\VC\include\string.h(105) : 参见“strcpy”的声明
1>sbk_client.cpp(642): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
D:\VS2010\VC\include\string.h(105) : 参见“strcpy”的声明
1>sbk_client.cpp(678): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
D:\VS2010\VC\include\string.h(105) : 参见“strcpy”的声明
1>sbk_client.cpp(684): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
D:\VS2010\VC\include\string.h(105) : 参见“strcpy”的声明
1>sbk_client.cpp(694): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
D:\VS2010\VC\include\string.h(105) : 参见“strcpy”的声明
1>sbk_client.cpp(696): warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
D:\VS2010\VC\include\string.h(105) : 参见“strcpy”的声明
1>sbk_client.cpp(827): warning C4018: “<”: 有符号/无符号不匹配
ResourceCompile:
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\rc.exe /l"0x0409" /nologo /fo"Release\fmclient.res" fmclient.rc
Link:
D:\VS2010\VC\bin\link.exe /ERRORREPORT:PROMPT /OUT:"E:\zouwuyang\StarBucks\UPP-Client-Project\fmclient-CCO-1438\sbkclient\Release\fmclient.dll" /INCREMENTAL:NO /NOLOGO /LIBPATH:"D:\Program Files (x86)\Visual Leak Detector\lib\Win32" libeay32.lib ssleay32.lib gtestd.lib sqlite3.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /ManifestFile:"Release\fmclient.dll.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"E:\zouwuyang\StarBucks\UPP-Client-Project\fmclient-CCO-1438\sbkclient\Release\fmclient.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /LTCG /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"E:\zouwuyang\StarBucks\UPP-Client-Project\fmclient-CCO-1438\sbkclient\Release\fmclient.lib" /MACHINE:X86 /DLL Release\fmclient.res
Release\main.obj
Release\sbk_client.obj
正在创建库 E:\zouwuyang\StarBucks\UPP-Client-Project\fmclient-CCO-1438\sbkclient\Release\fmclient.lib 和对象 E:\zouwuyang\StarBucks\UPP-Client-Project\fmclient-CCO-1438\sbkclient\Release\fmclient.exp
正在生成代码
已完成代码的生成
ZH_Client.vcxproj -> E:\zouwuyang\StarBucks\UPP-Client-Project\fmclient-CCO-1438\sbkclient\Release\fmclient.dll
Manifest:
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\mt.exe /nologo /verbose /outputresource:"E:\zouwuyang\StarBucks\UPP-Client-Project\fmclient-CCO-1438\sbkclient\Release\fmclient.dll;#2" /manifest Release\fmclient.dll.intermediate.manifest
FinalizeBuildStatus:
正在删除文件“Release\fmclient.unsuccessfulbuild”。
正在对“Release\fmclient.lastbuildstate”执行 Touch 任务。
1>已完成生成项目“E:\zouwuyang\StarBucks\UPP-Client-Project\fmclient-CCO-1438\sbkclient\ZH_Client\ZH_Client.vcxproj”(rebuild 个目标)的操作。
生成失败
生成成功
已用时间 00:00:00.06
已用时间 00:00:03.52
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
......@@ -28,8 +28,8 @@
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v110</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v100</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
......@@ -43,11 +43,13 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<IncludePath>D:\gitcode\sbkclient\ZH_Client\include;D:\FM\sbkClient\ZH_Client\include;C:\openssl\openssl-1.0.1s\inc32;$(IncludePath)</IncludePath>
<LibraryPath>D:\gitcode\sbkclient\ZH_Client\lib;C:\openssl\openssl-1.0.1s\out32dll;D:\FM\sbkClient\ZH_Client\lib;$(LibraryPath)</LibraryPath>
<IncludePath>E:\zouwuyang\StarBucks\UPP-Client-Project\fmclient-CCO-1438\sbkclient\ZH_Client\include;E:\zouwuyang\StarBucks\UPP-Client-Project\fmclient-CCO-1438\sbkclient\ZH_Client\include\curl-7.40.0\include\curl;$(IncludePath)</IncludePath>
<LibraryPath>E:\zouwuyang\StarBucks\UPP-Client-Project\fmclient-CCO-1438\sbkclient\ZH_Client\lib;E:\zouwuyang\StarBucks\UPP-Client-Project\fmclient-CCO-1438\sbkclient\ZH_Client;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<IncludePath>E:\zouwuyang\StarBucks\UPP-Client-Project\fmclient-CCO-1438\sbkclient\ZH_Client;E:\zouwuyang\StarBucks\UPP-Client-Project\fmclient-CCO-1438\sbkclient\ZH_Client\include;E:\zouwuyang\StarBucks\UPP-Client-Project\fmclient-CCO-1438\sbkclient\ZH_Client\include\curl-7.40.0\include\curl;$(IncludePath)</IncludePath>
<LibraryPath>E:\zouwuyang\StarBucks\UPP-Client-Project\fmclient-CCO-1438\sbkclient\ZH_Client;E:\zouwuyang\StarBucks\UPP-Client-Project\fmclient-CCO-1438\sbkclient\ZH_Client\lib;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
......@@ -56,13 +58,13 @@
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>C:\curl-7.40.0-devel-mingw32\include\curl;C:\curl-7.40.0-devel-mingw32\include;$(SolutionDir)\ZH_Client</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>$(SolutionDir)\ZH_Client</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>C:\openssl\openssl-1.0.1s\out32dll;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>libeay32.lib;ssleay32.lib;gtestd.lib;sqlite3.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
......@@ -81,6 +83,7 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>libeay32.lib;ssleay32.lib;gtestd.lib;sqlite3.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
......
......@@ -2,6 +2,7 @@
#define FM_DATA_PROCESS_H
#include <string>
#include <sstream>
#include <openssl/evp.h>
#include <openssl/bio.h>
......@@ -10,19 +11,14 @@
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/des.h>
#include "fmlog.h"
//#include <jansson.h>
//#include <jansson_private.h>
#include "fmlog.h"
#include "fmglobal.h"
#include <rapidjson/document.h>
#include <rapidjson/prettywriter.h>
#include <rapidjson/writer.h>
#include <rapidjson/stringbuffer.h>
#include <sstream>
#include "fmglobal.h"
using namespace rapidjson;
class DataProcess
......@@ -45,7 +41,7 @@ public:
if(input == NULL)
return 0;
//assert(NULL != input);
b64 = BIO_new(BIO_f_base64());
bmem = BIO_new(BIO_s_mem());
if (NULL == b64 || NULL == bmem) {
......@@ -71,6 +67,7 @@ public:
return len;
}
/***********************************
*函数名:debase64
*input :base64字符串
......@@ -87,7 +84,7 @@ public:
if(input == NULL)
return 0;
//assert(NULL != input);
if (length > size)
return 0;
memset(result, 0, size);
......@@ -106,6 +103,7 @@ public:
return len;
}
/***********************************
*RSASign : RSA签名
*text :待签名字符串
......@@ -129,7 +127,6 @@ public:
return 0;
//printf("\n%s\n", tmpprivatekey);
OpenSSL_add_all_algorithms();
//读取私钥从一个pem文件中
......@@ -175,6 +172,7 @@ public:
return length;
}
/***********************************
*RSAVerify : RSA验签
*text :待签名字符串
......@@ -236,6 +234,7 @@ public:
return 1;
}
/***********************************
*DES3Encode : DES3加密字符串]
*key : 3des加密秘钥
......@@ -276,6 +275,7 @@ public:
free(tmp);
return len;
}
/***********************************
*DES3Decode : DES3解密字符串
*text :待签名字符串
......@@ -320,6 +320,7 @@ public:
return iOutLen;
}
/***********************************
*GetPEMKey : 将公钥或私钥转换为opelssl可加载的pem格式
*key :原始秘钥
......@@ -334,35 +335,27 @@ public:
std::stringstream sstm;
std::string str(key, keylen);
if (keylen > outpemkeymaxlen)
{
if (keylen > outpemkeymaxlen) {
return 0;
}
if(ispublickey == 0)
{
if (ispublickey == 0) {
int i = 0;
sstm << "-----BEGIN RSA PRIVATE KEY-----\n";
while(i + 64 < keylen)
{
while(i + 64 < keylen) {
sstm << str.substr(i, 64) << "\n";
i += 64;
}
if(keylen - i > 0)
sstm << str.substr(i, keylen - i) << "\n";
sstm << "-----END RSA PRIVATE KEY-----\n";
}
else
{
} else {
int i = 0;
sstm << "-----BEGIN PUBLIC KEY-----\n";
while(i + 64 < keylen)
{
while(i + 64 < keylen) {
sstm << str.substr(i, 64) << "\n";
i += 64;
}
......@@ -377,6 +370,7 @@ public:
strcpy(outpemkey, sstm.str().c_str());
return 1;
}
/***********************************
*GetJsonKeyArray : 获取json中非array非object的key
*keys :json的key数组
......@@ -386,38 +380,18 @@ public:
static int GetJsonKeyArray(std::string* keys,const std::string &json)
{
LOG() << "GetJsonKeyArray";
//const char *key;
//json_t *root, *value;
//json_error_t error;
//int i = 0;
//root = json_loads(json.c_str(), 0, &error);
//if(!root)
// return 0;
//json_object_foreach(root, key, value)
//{
// keys[i] = std::string(key);
// i++ ;
//}
//json_decref(root);
Document root;
Value value;
int i = 0;
root.Parse<0>(json.c_str());
if(root.HasParseError())
{
if(root.HasParseError()) {
return 0;
}
Value::ConstMemberIterator itr;
for(itr = root.MemberBegin(); itr != root.MemberEnd(); itr++)
{
for(itr = root.MemberBegin(); itr != root.MemberEnd(); itr++) {
Document::AllocatorType allocator;
Value key;
key.CopyFrom(itr->name, allocator);
......@@ -427,6 +401,7 @@ public:
return i;
}
/***********************************
*SortString : 字符串数组排序
*keys :json的key数组
......@@ -439,12 +414,9 @@ public:
int i, j, k = 0;
std::string tmp;
for(i = 0; i < length - 1;i++)
{
for(j = i + 1; j < length; j++)
{
if(keys[i].compare(keys[j]) > 0 )
{
for(i = 0; i < length - 1;i++) {
for(j = i + 1; j < length; j++) {
if (keys[i].compare(keys[j]) > 0 ) {
tmp = keys[i];
keys[i] = keys[j];
keys[j] =tmp;
......@@ -452,6 +424,7 @@ public:
}
}
}
/***********************************
*GetValueFromJson : 按照顺序
*keys :json的key数组
......@@ -460,90 +433,37 @@ public:
static int GetValueFromJson(const std::string *keys, int length, const std::string &json, std::string &outmsg)
{
LOG() <<"GetValueFromJson";
//json_t *root, *value;
//json_error_t error;
//int num;
//char nums[32] = {0};
//const char *tmp;
//int i = 0;
//outmsg = std::string();
//root = json_loads(json.c_str(), 0, &error);
//if(!root)
// return 0;
//for(i = 0; i < length; i ++)
//{
// value = json_object_get(root, keys[i].c_str());
// if(json_is_string(value))
// {
// tmp = json_string_value(value);
// }
// else if(json_is_number(value))
// {
// num = (int)json_integer_value(value);
// itoa(num, nums, 10);
// tmp = nums;
// }
// else if(json_is_object(value))
// {
// continue;
// }
// else if(json_is_array(value))
// {
// continue;
// }else
// {
// continue;
// }
// outmsg.append(tmp);
// outmsg.append("|");
//}
//json_decref(root);
//outmsg.at(outmsg.size() - 1) = 0;
//return 1;
Document root;
Value value;
int num;
char nums[32] = {0};
const char *tmp;
int i = 0;
outmsg = std::string();
root.Parse<0>(json.c_str());
if(root.HasParseError())
{
if(root.HasParseError()) {
return 0;
}
for(i = 0; i < length; i++)
{
for(i = 0; i < length; i++) {
value = root[keys[i].c_str()];
if (value.IsString())
{
if (value.IsString()) {
tmp = value.GetString();
}
else if (value.IsInt())
{
} else if (value.IsInt()) {
num = (int)value.GetInt();
itoa(num, nums, 10);
tmp = nums;
}
else if (value.IsArray())
{
} else if (value.IsArray()) {
continue;
}
else
{
} else {
continue;
}
// 遍历最外层全部Key,且对应的Value->rapidJson::Value是 string/int 才追加到 带出参数;
// 数组/json对象 都直接跳过;
outmsg.append(tmp);
outmsg.append("|");
}
......
No preview for this file type
No preview for this file type
......@@ -10,26 +10,22 @@
#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\"}"
//GC 1438
#define DES3_KEY "ABCD@#9876DFSAAWKLDEOPDD"
//CCO-1438
#define CCO_DES3_KEY "ABCD@#9876DFSAAWKLDEOPDD"
//EC-1446
#define EC_DES3_KEY "DDDDEEEE45LPODDCXZZLKDDO"
//EC 1446
//#define DES3_KEY "DDDDEEEE45LPODDCXZZLKDDO"
#define DLL_VERSION "1.20.11.3"
#define CRET_FILE_NAME "client.p12"
#define JSON_KEY_ONLY "partnerOrderId"
#define CFG_KEY "template"
#define TMP_JSON "json.ini"
#define DB_ORDER "order.db"
#define DB_TABLE_NAME "orderlist"
#define MAX_ORDERID_LEN 200
#define POSTYPE "posType"
#endif
\ No newline at end of file
......@@ -10,12 +10,10 @@
#include <fstream>
#include <sstream>
class LOG
{
public :
class LOG {
LOG()
{
public :
LOG() {
std::string filepath;
time_t tt = time(NULL);
tm *t = localtime(&tt);
......@@ -28,12 +26,9 @@ public :
filepath.append(_curr_filename);
filepath.append(".txt");
//std::cout << filepath << std::endl;
_filestm.open(filepath, std::ios::app);
if(_filestm.is_open())
{
if(_filestm.is_open()) {
_filestm << t->tm_year + 1900 << "-" << t->tm_mon + 1 << "-" << t->tm_mday << " " << t->tm_hour << ":" << t->tm_min << ":" << t->tm_sec << ":";
std::cout << t->tm_year + 1900 << "-" << t->tm_mon + 1 << "-" << t->tm_mday << " " << t->tm_hour << ":" << t->tm_min << ":" << t->tm_sec << ":";
_filestm.flush();
......@@ -41,38 +36,34 @@ public :
}
~LOG()
{
if(_filestm.is_open())
{
~LOG() {
if(_filestm.is_open()) {
_filestm << std::endl;
std::cout << std::endl;
_filestm.flush();
_filestm.close();
}
}
void Get_LOG_FileName()
{
void Get_LOG_FileName() {
time_t tt = time(NULL);
tm *t = localtime(&tt);
std::stringstream sstr;
sstr << "fmclient" << t->tm_year + 1900 << t->tm_mon + 1 << t->tm_mday;
std::string filename = std::string(sstr.str().c_str());
if(filename.compare(_curr_filename) != 0)
_curr_filename = filename;
}
template<typename T>
LOG& operator << (const T &in)
{
if(_filestm.is_open())
{
LOG& operator << (const T &in) {
if(_filestm.is_open()) {
_filestm << in ;
std::cout << in ;
_filestm.flush();
......@@ -82,7 +73,6 @@ public :
private:
std::ofstream _filestm;
std::string _curr_filename;
};
......
#ifndef FM_TOOL_H_
#define FM_TOOL_H_
//#include <jansson.h>
//#include <jansson_private.h>
//rapidjson库
#include <rapidjson\document.h>
#include <rapidjson\prettywriter.h>
......@@ -12,8 +9,8 @@
#include "fmglobal.h"
#include "fmlog.h"
#include "filesystem.h"
#include "filesystem.h"
#include <winsock2.h>
#include <iphlpapi.h>
......@@ -21,11 +18,10 @@
using namespace rapidjson;
class Tool
{
class Tool {
public:
static int GetMacByGetAdaptersAddresses(std::string& macOUT)
{
static int GetMacByGetAdaptersAddresses(std::string& macOUT) {
bool ret = 0;
ULONG outBufLen = sizeof(IP_ADAPTER_ADDRESSES);
......@@ -73,38 +69,21 @@ public:
char tmp[MAX_BUF_LEN] = { 0 };
std::string path;
char type[64] = { 0 };
itoa(reqType, type, 10);
std::string tmpstr = std::string(type);
FileSys::GetProcPath(path);
//if(tmpstr.size() == 1)
//{
// std::string str = std::string("a").append(tmpstr);
// memset(type, 0, 64);
// strcpy(type, str.c_str());
//}
path.append(TMP_JSON);
LOG() << "template cfg file path :" << path;
LOG() << "ReadTMPForType:: Template Config File Path : " << path;
GetPrivateProfileString(type, CFG_KEY,"",tmp, MAX_BUF_LEN, path.c_str());
strcpy(tplt, tmp);
LOG() << "get template json : " << tplt;
LOG() << "ReadTMPForType:: ReqType: "<< type <<" Get Template Json: " << tplt;
return (tmp[0] == 0 ? 0 : 1);
}
static std::string JsonToString(const Value &valObj)
{
static std::string JsonToString(const Value &valObj) {
StringBuffer sbBuf;
Writer<StringBuffer> jWriter(sbBuf);
valObj.Accept(jWriter);
......@@ -113,67 +92,47 @@ public:
static void CompareJson(const Value &srcval, Value &desvalue, Document &desdoc)
{
if(srcval.IsObject() && desvalue.IsObject())
{
if(srcval.IsObject() && desvalue.IsObject()) {
//获得json中的key和value
Value::ConstMemberIterator itr;
for(itr = srcval.MemberBegin(); itr != srcval.MemberEnd(); itr++)
{
for(itr = srcval.MemberBegin(); itr != srcval.MemberEnd(); itr++) {
Value jKey;
Value jValue;
//得到key和value
jKey.CopyFrom(itr->name, desdoc.GetAllocator());
jValue.CopyFrom(itr->value, desdoc.GetAllocator());
if(jValue.IsObject())
{
if(desvalue.HasMember(jKey))
{
if(jValue.IsObject()) {
if(desvalue.HasMember(jKey)) {
CompareJson(jValue, desvalue[jKey], desdoc);
}
else
{
} else {
desvalue.AddMember(jKey, jValue, desdoc.GetAllocator());
}
}
else if(jValue.IsArray())
{
if(desvalue.HasMember(jKey))
{
} else if(jValue.IsArray()) {
if(desvalue.HasMember(jKey)) {
CompareJson(jValue, desvalue[jKey], desdoc);
}
else
{
} else {
desvalue.AddMember(jKey, jValue, desdoc.GetAllocator());
}
}
else
{
} else {
if(desvalue.HasMember(jKey))
continue;
else
{
else {
desvalue.AddMember(jKey, jValue, desdoc.GetAllocator());
}
}
}
}
else if(srcval.IsArray() && desvalue.IsArray())
{
if (!srcval[0].IsNull())
{
} else if (srcval.IsArray() && desvalue.IsArray()) {
if (!srcval[0].IsNull()) {
std::cout << desvalue.GetArray().Size();
for (int i = 0;i < desvalue.GetArray().Size(); i++)
{
for (int i = 0;i < desvalue.GetArray().Size(); i++) {
CompareJson(srcval[0],desvalue[i], desdoc);
}
if (desvalue.Size() == 0)
{
if (desvalue.Size() == 0) {
Value tmpval;
tmpval.CopyFrom(srcval[0], desdoc.GetAllocator());
desvalue.PushBack(tmpval, desdoc.GetAllocator());
......@@ -181,78 +140,59 @@ public:
}
}
}
static void CompareJson(std::string tplt, std::string tmpin, Document::AllocatorType& a1, Document::AllocatorType& a2)
{
//将json解析成document
Document doc1;
Document doc2;
doc1.Parse<0>(tplt.c_str());
doc2.Parse<0>(tmpin.c_str());
if(!doc1.HasParseError() && !doc2.HasParseError())
{
if(doc1.IsObject() && doc2.IsObject())
{
if(doc1.IsObject() && doc2.IsObject()) {
//获得json中的key和value
Value::ConstMemberIterator itr;
for(itr = doc1.MemberBegin(); itr != doc1.MemberEnd(); itr++)
{
for(itr = doc1.MemberBegin(); itr != doc1.MemberEnd(); itr++) {
Value jKey;
Value jValue;
//得到key和value
jKey.CopyFrom(itr->name, a1);
jValue.CopyFrom(itr->value, a1);
LOG() << jKey.GetString() << "----------";
if(jValue.IsObject())
{
if(jValue.IsObject()) {
LOG() << jKey.GetString() << "+++++++++++";
if(doc2.HasMember(jKey))
{
if(doc2.HasMember(jKey)) {
CompareJson(JsonToString(jValue), JsonToString(doc2[jKey]), a1, a2);
}
else
{
} else {
doc2.AddMember(jKey, jValue, a2);
}
}
else if(jValue.IsArray())
{
if(doc2.HasMember(jKey))
{
} else if(jValue.IsArray()) {
if(doc2.HasMember(jKey)) {
CompareJson(JsonToString(jValue), JsonToString(doc2[jKey]), a1, a2);
}
else
{
} else {
doc2.AddMember(jKey, jValue, a2);
}
}
else
{
} else {
if(doc2.HasMember(jKey))
continue;
else
{
else {
doc2.AddMember(jKey, jValue, a2);
}
}
}
}
else if(doc1.IsArray() && doc2.IsArray())
{
if (!doc1[0].IsNull())
{
for (int i = 0;i < doc2.Size(); i++)
{
} else if (doc1.IsArray() && doc2.IsArray()) {
if (!doc1[0].IsNull()) {
for (int i = 0;i < doc2.Size(); i++) {
CompareJson(JsonToString(doc1[i]), JsonToString(doc2[i]), a1, a2);
}
if (doc2.Size() == 0)
{
if (doc2.Size() == 0) {
doc2.PushBack(doc1[0], a2);
}
}
......@@ -268,7 +208,6 @@ public:
Writer<StringBuffer> writer(buffer);
doc.Accept(writer);
return std::string(buffer.GetString());
}
static int ComplementJson(const char *in, char *out, int reqType)
......@@ -277,37 +216,30 @@ public:
if(ReadTMPForType(templatestr, reqType) == 0)
{
LOG() << "get temple failed";
LOG() << "ComplementJson:: Get Temple Failed";
return 0;
}
Document root;
Document tmpin;
root.Parse(templatestr);
tmpin.Parse(in);
LOG() << "get temple success : " << DocumentToString(root);
if(root.HasParseError())
{
if(root.HasParseError()) {
LOG() << "error temple or injson json(reqType:"<< reqType << "):" << templatestr;
return 0;
}
if(tmpin.HasParseError())
{
if(tmpin.HasParseError()) {
LOG() << "error temple or injson json(reqType:"<< reqType << "):" << in;
return 0;
}
const Value &srcvalue = root;
Value &desvalue = tmpin;
CompareJson(srcvalue, desvalue, tmpin);
strcpy(out, DocumentToString(tmpin).c_str());
LOG() << "complement json success : " << out;
return 1;
......
......@@ -21,20 +21,11 @@ using namespace std;
#include "fmtool.h"
#include "fmdatabase.h"
//#define FM_TEST
//#define FM_TESTS
#include "testdataprocess.h"
#include "testlog.h"
#include "testtool.h"
//using std::cout;
//using std::endl;
//using std::string;
//using namespace rapidjson;
typedef struct
{
typedef struct {
//接受数据缓冲区
string recvbuf;
//RSA证书签发服务器(配置)
......@@ -68,25 +59,37 @@ typedef struct
} BaseInfo;
int CheckRSASign();
// Global Variable
BaseInfo global_info;
int initflag = 0;
// 将 预编译固定赋值的宏定义 转换 成动态赋值的 全局变量;
string DES3_KEY_STR = "";
// Global Funciton Only Declare
// 每次非获取证书请求,UppSvr 都会返回本次请求的新签名, 便于校验返回报文;
int CheckRSASignData();
// 向UppSvr 发送请求报文;
int SendMsg(const string &text, const string &url, int iscret = 1);
// 字节转换;
int UTF8ToGBK(unsigned char * lpUTF8Str,unsigned char * lpGBKStr,int nGBKStrLen);
// 获取 RSA 证书 请求;
int GetRSACret(int partnerId,const char *storeID,const char *posNo);
BaseInfo global_info;
int initflag = 0;
// Global Funciton Declare And Implement
// 检查 是否存在 冲正请求文件,存在则 解析请求报文 并发起冲正请求;
// 未发现有效的 调用此返回的地方;
void CheckRollbackData()
{
string filepath;
FileSys::GetProcPath(filepath);
filepath.append(RBG_FILE_NAME);
std::ifstream filestm(filepath);
if(_access(filepath.c_str(),0) != 0)
{
if ( _access(filepath.c_str(),0) != 0 ) {
LOG() << "Not Found RollBack File" ;
return ;
}
......@@ -95,8 +98,7 @@ void CheckRollbackData()
int length = filestm.tellg();
filestm.seekg(0, std::ios::beg);
if(length == 0)
{
if ( length == 0 ) {
LOG() << "RollBack File size 0" ;
filestm.close();
remove(filepath.c_str());
......@@ -109,21 +111,21 @@ void CheckRollbackData()
filestm.read(req, length);
filestm.close();
if(DataProcess::DES3Decode((const unsigned char *)DES3_KEY, req, strlen(req), (unsigned char *)rps, MAX_BUF_LEN) == 0)
if(DataProcess::DES3Decode((const unsigned char *)DES3_KEY_STR.c_str(), req, strlen(req),
(unsigned char *)rps, MAX_BUF_LEN) == 0)
{
LOG() <<"Decode RollBack Fail";
remove(filepath.c_str());
return ;
}
LOG() << "RollBack Data : " << rps;
while ( 1 )
{
while ( 1 ) {
global_info.sign.clear();
int len = SendMsg(string(rps), global_info.serverurl, 0);
if((len == 1 && global_info.useRSA == 0) || ( len == 1 && global_info.useRSA == 1 && CheckRSASign() == 1))
if ( (len == 1 && global_info.useRSA == 0) ||
( len == 1 && global_info.useRSA == 1 && CheckRSASignData() == 1 ) )
break ;
LOG() <<"Roll back faild, Sleep 10 sencond, Try again...";
......@@ -135,30 +137,30 @@ void CheckRollbackData()
global_info.isrollback = 0;
}
int CheckRBK()
{
string filepath;
// 检查是否存在 冲正文件,存在 冲正文件则 创建新线程 检查是否存在 冲正数据;
// 目前没有找到 调用此函数 地方;
int CheckRBK() {
string filepath;
FileSys::GetProcPath(filepath);
filepath.append(RBG_FILE_NAME);
if(_access(filepath.c_str(),0) != 0)
{
if(_access(filepath.c_str(),0) != 0) {
LOG() << "Not Found RollBack File" ;
return 0;
}
global_info.isrollback = 1;
global_info.hWorkerThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CheckRollbackData, NULL, 0, NULL);
if (0 == global_info.hWorkerThread)
{
if (0 == global_info.hWorkerThread) {
global_info.isrollback = 0;
LOG() << "Create Rollback Thread Failed" ;
}
return 1;
}
// 载入本地证书文件中 公钥+私钥数据;
void LoadCret()
{
global_info.serverpublickey.clear();
......@@ -169,9 +171,8 @@ void LoadCret()
filepath.append(CRET_FILE_NAME);
std::ifstream filestm(filepath);
if(_access(filepath.c_str(),0) != 0)
{
LOG() << "Not Found " << filepath;
if ( _access(filepath.c_str(),0) != 0 ) {
LOG() << "LoadCretFun:: Not Found " << filepath;
return ;
}
......@@ -179,9 +180,8 @@ void LoadCret()
int length = filestm.tellg();
filestm.seekg(0, std::ios::beg);
if(length == 0)
{
LOG() << CRET_FILE_NAME <<" File size 0" ;
if(length == 0) {
LOG() <<"Error:: LoadCretFun:: "<< CRET_FILE_NAME <<" File size 0" ;
filestm.close();
return ;
}
......@@ -192,133 +192,74 @@ void LoadCret()
filestm.read(req, length);
filestm.close();
if(DataProcess::DES3Decode((const unsigned char *)DES3_KEY, req, strlen(req), (unsigned char *)rps, MAX_BUF_LEN) == 0)
if (DataProcess::DES3Decode((const unsigned char *)DES3_KEY_STR.c_str(), req, strlen(req),
(unsigned char *)rps, MAX_BUF_LEN) == 0 )
{
LOG() << CRET_FILE_NAME <<" Decode Fail";
LOG() <<"LoadCretFun:: "<< CRET_FILE_NAME <<" DES3Decode Failed ";
remove(filepath.c_str());
return ;
}
/*json_t *root;
json_error_t error;
root = json_loads(rps, 0, &error);
if(!root)
{
LOG() << "argv is not json";
return ;
}
json_t *statusCode = json_object_get(root, "statusCode");
if (statusCode == NULL || !json_is_integer(statusCode))
{
LOG() << "statusCode error";
json_decref(root);
return ;
}
int code = (int)json_integer_value(statusCode);
if(code == 100)
{
json_t *serverpublickey = json_object_get(root, "serverPublicKey");
json_t *localprivatekey = json_object_get(root, "clientPrivateKey");
if(serverpublickey == NULL || !json_is_string(serverpublickey) || localprivatekey == NULL || !json_is_string(localprivatekey))
{
LOG() << "serverpublickey or localprivatekey error";
json_decref(root);
return ;
}
global_info.serverpublickey = string(json_string_value(serverpublickey));
global_info.localprivatekey = string(json_string_value(localprivatekey));
LOG() << "server public key :" << global_info.serverpublickey;
LOG() << "client private key :" << global_info.localprivatekey;
}
json_decref(root);*/
Document root;
root.Parse(rps);
if(root.HasParseError())
{
LOG() << "argv is not json";
if ( root.HasParseError() ) {
LOG() <<"Error:: LoadCretFun:: "<< CRET_FILE_NAME<< "DES3Decode Return argv is not json";
return ;
}
Value statusCode;
if(root.HasMember("statusCode"))
{
if ( root.HasMember("statusCode") ) {
statusCode = root["statusCode"];
}
else
{
LOG() << "statusCode error";
} else {
LOG() <<"Error:: LoadCretFun:: "<< "DES3Decode Result's statusCode No Exist";
return;
}
if(!statusCode.IsInt())
{
LOG() << "statusCode error";
if ( !statusCode.IsInt() ) {
LOG() <<"Error:: LoadCretFun:: " << "DES3Decode Result's statusCode error";
}
int code = statusCode.GetInt();
if(code == 100)
{
if(code == 100) {
Value serverpublickey;
Value localprivatekey;
if(root.HasMember("serverPublicKey") && root.HasMember("clientPrivateKey"))
{
if ( root.HasMember("serverPublicKey") && root.HasMember("clientPrivateKey") ) {
serverpublickey = root["serverPublicKey"];
localprivatekey = root["clientPrivateKey"];
}
else
{
LOG() << "serverpublickey or localprivatekey error";
} else {
LOG() <<"Error:: LoadCretFun:: " << "serverpublickey or localprivatekey No Exist ";
return;
}
if(serverpublickey == NULL || !serverpublickey.IsString() || localprivatekey == NULL || !localprivatekey.IsString())
if(serverpublickey == NULL || !serverpublickey.IsString() ||
localprivatekey == NULL || !localprivatekey.IsString() )
{
LOG() << "serverpublickey or localprivatekey error";
LOG() <<"Error:: LoadCretFun:: " << "serverpublickey or localprivatekey error";
return;
}
global_info.serverpublickey = string(serverpublickey.GetString());
global_info.localprivatekey = string(localprivatekey.GetString());
LOG() << "server public key :" << global_info.serverpublickey;
LOG() << "client private key :" << global_info.localprivatekey;
LOG() <<"LoadCretFun:: "<< "server public key: " << global_info.serverpublickey;
LOG() <<"LoadCretFun:: "<< "client private key: " << global_info.localprivatekey;
}
}
// 初始化 客户端相关数据: 读取配置+内存中无证书则载入本地证书文件数据+....
int InitClient()
{
std::string path;
FileSys::GetProcPath(path);
path.append(CFG_FILE_NAME);
std::ifstream istm;
istm.open(path, std::ios::in);
if(!istm.is_open())
{
LOG() << "open cfg file failed!";
if(!istm.is_open()) {
LOG() <<"InitClientFun:: "<< "open cfg file failed!";
return 0;
}
string tmp;
string tmp;
getline(istm, global_info.cretserverurl);
getline(istm, global_info.serverurl);
getline(istm, tmp);
......@@ -331,9 +272,14 @@ int InitClient()
global_info.posType = atoi(tmp.c_str());
getline(istm, global_info.host);
istm.close();
LOG() << "cretserverurl:" << global_info.cretserverurl << ";serverurl:" << global_info.serverurl << ";longtime:" << global_info.longtimeout << ";shortime:" << global_info.shrottimeout << ";useRSA:" << global_info.useRSA << ";posType:" << global_info.posType;
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;
LOG() <<"InitClientFun:: " <<"---->Memory privateKey: "<<global_info.localprivatekey
<<" ---->Memory publicKey: "<<global_info.serverpublickey;
LOG() << "key: " << global_info.localprivatekey << global_info.serverpublickey;
if(global_info.serverpublickey.empty() || global_info.localprivatekey.empty())
LoadCret();
......@@ -345,209 +291,102 @@ time_t subDay(time_t time1,int days)
return (time1-(days*60*60*24-28800));
}
//void DeleteTableForDate()
//{
// time_t tt = time(NULL);
// time_t tmptt = subDay(tt, 2);
//
// tm *t = localtime(&tmptt);
//
// std::stringstream stm;
//
// stm << t->tm_year + 1900 << "-" << std::setw(2) << std::setfill('0') << t->tm_mon + 1 << "-";
// stm << std::setw(2) << std::setfill('0') << t->tm_mday;
//
// LOG() << "delete data" << stm.str().c_str();
//
// std::stringstream deletesql;
// deletesql << "delete from " << DB_TABLE_NAME << " where businessDate<datetime('" << stm.str().c_str() << "')" ;
//
// LOG() << "delete sql : " << deletesql.str().c_str();
//
// DataBase::delt(string(deletesql.str().c_str()));
//
//}
int ProcessPosReqData(const char *indata, int /**needrbk*/*needcheck, int *reqType_i, string &in)
// 处理POS请求数据: <1>先校验请求数据有效性; <2>转换Upp识别的请求类型;<3> 生产本地订单数据;
// <4> 整合请求 UppSvr 的请求数据; [第一次调用本dll 需要更新 秘钥: GetRSACret ]
int ProcessPosReqData(const char *indata, int *needcheck, int *reqType_i, string &in)
{
LOG() << "ProcessPosReqData" << indata;
LOG() << "ProcessPosReqDataFun:: Begin-------->" << indata;
int type, rlt = 0;
*reqType_i = -1;
std::stringstream tmps, tmpkey, datastm;
//json_t *root, *reqtype, *partnerId, *storeId, *stationId, *code, *transId, *businessDate;
//json_error_t error;
Document root, tmproot;
Value reqtype, partnerId, storeId, stationId, code, transId, businessDate;
string codestr;
string transIdstr;
string date;
//*needrbk == 0;
*needcheck == 0;
//root = json_loads(indata, 0, &error);
//if(!root)
//{
// LOG() << "error request json data!";
//
// return 0;
//}
string date;
tmproot.Parse(indata);
if(tmproot.HasParseError())
{
LOG() << "error request json data!";
if ( tmproot.HasParseError() ) {
LOG() << "Parse error:: request json data exception !";
return 0;
}
root.Parse(indata);
if(root.HasParseError())
{
LOG() << "error request json data!";
if ( root.HasParseError() ) {
LOG() << "Parse error:: request json data exception !";
return 0;
}
//reqtype = json_object_get(root, "reqType");
//if (!json_is_integer(reqtype))
//{
// LOG() << "error: reqtype is not a integer!";
// rlt = 0;
// goto freeJson;
//}
reqtype = root["reqType"];
if (!reqtype.IsInt())
{
LOG() << "error: reqtype is not a integer!";
if ( !reqtype.IsInt() ) {
LOG() << "ReqJson error: reqtype is not a integer!";
return 0;
}
type = (int)reqtype.GetInt();
*reqType_i = type;
if(type == 72 || type == 62 || type == 71 || type == 90 || type == 92 || type == 95 || type == 97 || type == 100 || type == 102 || (type >= 300 && type <= 400))
//*needrbk = 1;
*needcheck = 1;
if(type == 71 || type == 3)
{
/*code = json_object_get(root, "code");
if (!json_is_string(code))
{
LOG() << "error: code is not a string!";
rlt = 0;
goto freeJson;
}*/
//codestr = string(json_string_value(code));
if( type == 72 || type == 62 || type == 71 || type == 90 || type == 92 || type == 95 || type == 97 ||
type == 100 || type == 102 || (type >= 300 && type <= 400) )
*needcheck = 1;
if(type == 71 || type == 3) {
code = root["code"];
if(!code.IsString())
{
LOG() << "error: code is not a string!";
if ( !code.IsString() ) {
LOG() << "ReqJson error: code is not a string!";
return 0;
}
codestr = string(code.GetString());
//businessDate = json_object_get(root, "businessDate");
//if (!json_is_string(businessDate))
//{
// LOG() << "error: businessDate is not a string!";
// rlt = 0;
// goto freeJson;
//}
//date = string(json_string_value(businessDate));
businessDate = root["businessDate"];
if(!businessDate.IsString())
{
LOG() << "error: businessDate is not a string!";
if ( !businessDate.IsString() ) {
LOG() << "ReqJson error: businessDate is not a string!";
return 0;
}
date = string(businessDate.GetString());
date.insert(4, "-");
date.insert(7, "-");
//transId = json_object_get(root, "transId");
//if (!json_is_string(transId))
//{
// LOG() << "error: transId is not a string!";
// rlt = 0;
// goto freeJson;
//}
//transIdstr = string(json_string_value(transId));
transId = root["transId"];
if(!transId.IsString())
{
LOG() << "error: transId is not a string!";
if ( !transId.IsString() ) {
LOG() << "ReqJson error: transId is not a string!";
return 0;
}
transIdstr = string(transId.GetString());
}
// partnerId = json_object_get(root, "partnerId");
// if (!json_is_integer(partnerId))
// {
// LOG() << "error: partnerId is not a integer!";
// rlt = 0;
// goto freeJson;
// }
//tmps << (int)json_integer_value(partnerId);
// Generate Local Order Id:: partnerId + storeId + stationId(posId) + yyyyMMddhhmmss(20201030213040)
partnerId = root["partnerId"];
if(!partnerId.IsInt())
{
LOG() << "error: partnerId is not a integer!";
if ( !partnerId.IsInt() ) {
LOG() << "ReqJson error: partnerId is not a integer!";
return 0;
}
tmps << (int)partnerId.GetInt();
int tempPartnerId = (int)partnerId.GetInt();
tmps << tempPartnerId;
//storeId = json_object_get(root, "storeId");
//if (!json_is_string(storeId))
//{
// LOG() << "error: storeId is not a string or int!";
// rlt = 0;
// goto freeJson;
//}
//tmps << string((char *)json_string_value(storeId));
if ( tempPartnerId == 1438 ) {
DES3_KEY_STR = CCO_DES3_KEY;
} else if ( tempPartnerId == 1446 ) {
DES3_KEY_STR = EC_DES3_KEY;
} else {
LOG() << "ReqJson error: partnerId Not In Valid Partner Scope( CCO-1438 , EC-1446 ) !";
return 0;
}
storeId = root["storeId"];
if(!storeId.IsString())
{
LOG() << "error: storeId is not a string or int!";
if ( !storeId.IsString() ) {
LOG() << "ReqJson error: storeId is not a string or int!";
return 0;
}
tmps << string(storeId.GetString());
//stationId = json_object_get(root, "stationId");
//if (!json_is_string(stationId))
//{
// LOG() << "error: stationId is not a string or int!";
// rlt = 0;
// goto freeJson;
//}
//tmps << string((char *)json_string_value(stationId));
stationId = root["stationId"];
if(!stationId.IsString())
{
LOG() << "error: stationId is not a string or int!";
if ( !stationId.IsString() ) {
LOG() << "ReqJson error: stationId is not a string or int!";
return 0;
}
tmps << string(stationId.GetString());
//if(initflag == 0 && GetRSACret((int)json_integer_value(partnerId), json_string_value(storeId), json_string_value(stationId)) == 1)
//{
// initflag = 1;
//}
if (initflag == 0 && GetRSACret((int)partnerId.GetInt(), storeId.GetString(), stationId.GetString()) == 1)
{
initflag = 1;
}
time_t tt = time(NULL);
tm *t = localtime(&tt);
tmps << t->tm_year + 1900 << std::setw(2) << std::setfill('0') << t->tm_mon + 1;
......@@ -558,27 +397,34 @@ int ProcessPosReqData(const char *indata, int /**needrbk*/*needcheck, int *reqTy
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 ) {
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;
} else {
LOG() << "ProcessPosReqDataFun:: First Load Dll, GetRSACret From Upp Svr Failed";
}
}
LOG() << "partnerOrderId code : " << tmps.str();
if(type != 3 && !tmproot.HasMember(JSON_KEY_ONLY))
//json_object_set(root, JSON_KEY_ONLY, json_string(tmps.str().c_str()));
tmproot.AddMember(JSON_KEY_ONLY, Value().SetString(tmps.str().c_str(), strlen(tmps.str().c_str()), root.GetAllocator()), tmproot.GetAllocator());
if( type != 3 && !tmproot.HasMember( JSON_KEY_ONLY ) ) {
tmproot.AddMember( JSON_KEY_ONLY,
Value().SetString( tmps.str().c_str(), strlen(tmps.str().c_str()), root.GetAllocator() ), tmproot.GetAllocator() );
}
if(type == 71)
{
//tmpkey << codestr << transIdstr << json_integer_value(partnerId) << json_string_value(storeId) << json_string_value(stationId);
if ( type == 71 ) {
tmpkey << codestr <<transIdstr << int(partnerId.GetInt()) << string(storeId.GetString()) << string(stationId.GetString());
std::stringstream creatsql, insetsql, updatesql;
creatsql << "create table IF NOT EXISTS " << DB_TABLE_NAME << "(orderID varchar(200) NOT NULL,parentID varchar(60),businessDate date,PRIMARY KEY (orderID))";
insetsql << "insert into " << DB_TABLE_NAME << "(orderID,parentID,businessDate)values('" << tmpkey.str().c_str() << "','" << tmps.str().c_str() << "','" << datastm.str().c_str() <<"')";
updatesql << "update " << DB_TABLE_NAME << " set parentID='" << tmps.str().c_str() << "',businessDate='" << datastm.str().c_str() << "' where orderID='" << tmpkey.str().c_str() << "'" ;
creatsql << "create table IF NOT EXISTS " << DB_TABLE_NAME
<< "(orderID varchar(200) NOT NULL,parentID varchar(60),businessDate date,PRIMARY KEY (orderID))";
insetsql << "insert into " << DB_TABLE_NAME << "(orderID,parentID,businessDate)values('" << tmpkey.str().c_str()
<< "','" << tmps.str().c_str() << "','" << datastm.str().c_str() <<"')";
updatesql << "update " << DB_TABLE_NAME << " set parentID='" << tmps.str().c_str()
<< "',businessDate='" << datastm.str().c_str() << "' where orderID='" << tmpkey.str().c_str() << "'" ;
LOG() << "creat table : " << creatsql.str().c_str();
LOG() << "insert table : " << insetsql.str().c_str();
......@@ -589,402 +435,178 @@ int ProcessPosReqData(const char *indata, int /**needrbk*/*needcheck, int *reqTy
DataBase::update(string(updatesql.str().c_str()));
}
if(type == 3)
{
//tmpkey << codestr << transIdstr << (int)json_integer_value(partnerId) << (char *)json_string_value(storeId) << (char *)json_string_value(stationId);
if ( type == 3 ) {
tmpkey << codestr <<transIdstr << int(partnerId.GetInt()) << string(storeId.GetString()) << string(stationId.GetString());
std::stringstream selectsql;
selectsql << "select parentID from " << DB_TABLE_NAME << " where orderID='" << tmpkey.str().c_str() << "'" ;
LOG() << "select table : " << selectsql.str().c_str();
string prid;
if(DataBase::select(string(selectsql.str().c_str()), prid) == 1)
{
if(DataBase::select(string(selectsql.str().c_str()), prid) == 1) {
LOG() << "get partnerOrderId : " << prid;
//json_object_set(root, JSON_KEY_ONLY, json_string(prid.c_str()));
if(!tmproot.HasMember(JSON_KEY_ONLY))
tmproot.AddMember(JSON_KEY_ONLY, Value().SetString(prid.c_str(), strlen(prid.c_str()), root.GetAllocator()), tmproot.GetAllocator());
}
}
in = Tool::DocumentToString(tmproot);
LOG() << "*****:" << in;
//in = string(json_dumps(root, JSON_COMPACT | JSON_SORT_KEYS));
//rlt = 1;
LOG() << "ProcessPosReqDataFun:: Save Local Db Success, Then Request Upp Svr, ReqBody:" << in;
return 1;
//freeJson:
//json_decref(root);
//return rlt;
}
//int GetRealJson(std::string &out, const std::string &in)
//{
// //json_t *root, *reqtype;
// //json_error_t error;
//
// Document root;
//
// //char *tmp = "";
// char tmp[MAX_BUF_LEN] = {0};
//
// /*root = json_loads(in.c_str(), 0, &error);*/
// root.Parse<0>(in.c_str());
//
// //if(!root)
// //{
// // LOG() << "argv is not json";
// // return 0;
// //}
// if(root.HasParseError())
// {
// LOG() << "argv is not json";
// return 0;
// }
//
// //tmp = json_dumps(root, JSON_COMPACT | JSON_SORT_KEYS);
// strcpy(tmp, Tool::DocumentToString(root).c_str());
//
// out = std::string(tmp);
//
// LOG() << "compress json : " << out;
//
// //json_decref(root);
//
// return 1;
//}
//int SaveRollBackFile(const string text)
//{
// char outmsg[MAX_BUF_LEN] = { 0 };
// char inmsg[MAX_BUF_LEN] = { 0 };
//
// json_t *root, *value;
// json_error_t error;
//
// root = json_loads(text.c_str(), 0, &error);
//
// if(!root)
// return 0;
//
// json_t *reqType = json_object_get(root, "reqType");
//
// if(reqType == NULL || !json_is_integer(reqType))
// {
// json_decref(root);
// return 0;
// }
//
// int type = json_integer_value(reqType);
//
// switch (type)
// {
// case 62 :
// json_integer_set(reqType, (json_int_t)83);
// break;
// case 71 :
// json_integer_set(reqType, (json_int_t)3);
// break;
// case 72 :
// json_integer_set(reqType, (json_int_t)3);
// break;
// case 90 :
// json_integer_set(reqType, (json_int_t)91);
// break;
// case 92 :
// json_integer_set(reqType, (json_int_t)93 );
// break;
// case 95 :
// json_integer_set(reqType, (json_int_t)96);
// break;
// case 97 :
// json_integer_set(reqType, (json_int_t)98);
// break;
// case 100 :
// json_integer_set(reqType, (json_int_t)101);
// break;
// case 102 :
// json_integer_set(reqType, (json_int_t)103);
// break;
// default:
// json_decref(root);
// return 1;
// }
//if(type == 62)
//{
// json_integer_set(reqType, (json_int_t)83);
//}else if (type == 90)
//{
// json_integer_set(reqType, (json_int_t)91);
//}else if (type == 92)
//{
// json_integer_set(reqType, (json_int_t)93);
//}else if (type == 95)
//{
// json_integer_set(reqType, (json_int_t)96);
//}else if (type == 97)
//{
// json_integer_set(reqType, (json_int_t)98);
//}
//else if (type == 100)
//{
// json_integer_set(reqType, (json_int_t)101);
//}
//else if (type == 102)
//{
// json_integer_set(reqType, (json_int_t)101);
//}
//else if(type == 71 || type == 72)
//{
// json_integer_set(reqType, (json_int_t)3);
//}else
//{
// json_decref(root);
// return 1;
//}
// char* json = json_dumps(root, JSON_COMPACT | JSON_SORT_KEYS);
//
// strcpy_s(inmsg, MAX_BUF_LEN, json);
//
// json_decref(root);
//
// if(DataProcess::DES3Encode((const unsigned char *)DES3_KEY, inmsg, strlen(inmsg), (unsigned char *)outmsg, MAX_BUF_LEN) == 0)
// {
// LOG() << "DES3 encode failed";
// return 0;
// }
//
// string filepath;
// FileSys::GetProcPath(filepath);
// filepath.append(RBG_FILE_NAME);
//
// std::ofstream filestm;
// filestm.open(filepath, std::ios::trunc);
//
// if (!filestm.is_open())
// {
// LOG() << CRET_FILE_NAME << " open failed";
// return 0;
// }
//
// filestm << outmsg;
// filestm.flush();
// filestm.close();
//
// return 1;
//}
//重组请求数据,并重新发送给支付服务器
int ResendMsg(std::string in)
{
int ReSendMsg(std::string in) {
LOG() << in.c_str();
global_info.recvbuf.clear();
Document root;
root.Parse<0>(in.c_str());
if(root.HasParseError())
{
if ( root.HasParseError() ) {
global_info.error = string(ERROR_INDATA);
return 0;
}
Value reqtype;
if(root.HasMember("reqType"))
{
if ( root.HasMember("reqType") ) {
reqtype = root["reqType"];
}
if(!reqtype.IsInt() || reqtype.IsNull())
{
if ( !reqtype.IsInt() || reqtype.IsNull() ) {
global_info.error = string(ERROR_INDATA);
return 0;
}
int type = (int)reqtype.GetInt();
if (type == 71)
{
if (type == 71) {
root["reqType"] = (int)20;
}
else if (type == 72)
{
} else if (type == 72) {
root["reqType"] = (int)3;
}
else if (type == 62)
{
} else if (type == 62) {
root["reqType"] = (int)83;
}
else if (type == 90)
{
} else if (type == 90) {
root["reqType"] = (int)91;
}
else if (type == 92)
{
} else if (type == 92) {
root["reqType"] = (int)93;
}
else if (type == 95)
{
} else if (type == 95) {
root["reqType"] = (int)96;
}
else if (type == 97)
{
} else if (type == 97) {
root["reqType"] = (int)98;
}
else if (type == 100)
{
} else if (type == 100) {
root["reqType"] = (int)101;
}
else if (type == 102)
{
} else if ( type == 102 ) {
root["reqType"] = (int)103;
}
else if(type >= 300 && type <= 400)
{
} else if ( type >= 300 && type <= 400 ) {
root["reqType"] = (int)3;
}
else
{
} else {
root["reqType"] = type;
}
std::string indata;
indata = std::string(Tool::DocumentToString(root));
LOG() << "ReSendMsg:: INDATA:" << indata;
LOG() << "INDATA:" << indata;
if(SendMsg(indata, global_info.serverurl, 0) != 1)
//if(SendMsg(indata, "http://118.89.191.136:80/adapter", 0) != 1)
{
if ( SendMsg( indata, global_info.serverurl, 0 ) != 1 ) {
global_info.error = string(ERROR_GATEWAY);
return 0;
}
else
{
if (type != 71)
{
} else {
if (type != 71) {
global_info.error = string(ERROR_ROLLBACK);
return 0;
}
LOG() << "SendMsg End!" << global_info.recvbuf.c_str();
// global_info.recvbuf = indata;
LOG() << "ReSendMsg:: SendMsg End!" << global_info.recvbuf.c_str();
return 1;
}
}
// 向 UppSvr 请求报文中添加成员: posType;
int addposType(string &tmpin)
{
Document root;
root.Parse(tmpin.c_str());
if(root.HasParseError())
{
LOG() << "transform error";
if ( root.HasParseError() ) {
LOG() <<"Error:: addposType: "<< "transform error";
return 0;
}
if(root.HasMember(POSTYPE))
if ( root.HasMember(POSTYPE) )
return 1;
root.AddMember(POSTYPE, Value().SetInt(global_info.posType), root.GetAllocator());
tmpin = Tool::DocumentToString(root);
return 1;
}
/****************************** Dll Service Interface *************************************/
extern "C"
{
__declspec(dllexport) int __stdcall GetValue(char *indata, char *outdata)
{
// 提供给POS调用的库函数;
// 出于兼容 EC+CCO 并输出统一版本程序的目的, 对比两分支差异化如下:
/* ① 宏: DES3_KEY 对应值不一样;
CCO-1438: "ABCD@#9876DFSAAWKLDEOPDD"
EC-1446: "DDDDEEEE45LPODDCXZZLKDDO"
② 无其他差异;
*/
__declspec(dllexport) int __stdcall GetValue(char *indata, char *outdata)
{
LOG() <<"<******* Dll-GetValue() Version:: "<< DLL_VERSION << " *******>";
int reqType_i = 0;
//DeleteTableForDate();
//读取配置文件
if(InitClient() == 0)
{
if(InitClient() == 0) {
strcpy(outdata, ERROR_CLIENT_CFG);
LOG() << "return json to pos" << outdata;
LOG() <<"Error:: "<< "return json to pos" << outdata;
return 0;
}
//检查是否在冲正
//if(global_info.isrollback != 0)
//{
// strcpy(outdata, ERROR_ROLLBACK);
// LOG() << "return json to pos" << outdata;
// return 0;
//}
//冲正结束回收资源
//if(global_info.hWorkerThread != NULL)
//{
// CloseHandle(global_info.hWorkerThread);
// global_info.hWorkerThread = NULL;
//}
//检查是否存在冲正文件
//if (CheckRBK() == 1)
//{
// strcpy(outdata, ERROR_ROLLBACK);
// LOG() << "return json to pos" << outdata;
// return 0;
//}
//参数合法性检查
if(indata == NULL || outdata == NULL)
{
LOG() << "indata or outdata is null pointer";
if(indata == NULL || outdata == NULL) {
LOG() <<"Error:: "<< "indata or outdata is null pointer";
strcpy(outdata, ERROR_INDATA);
LOG() << "return json to pos" << outdata;
return 0;
}
LOG() << "get json from pos :" << indata ;
LOG() << "[**** 1 ****]---->Recv Pos Request:: json data:" << indata ;
char buf[MAX_BUF_LEN] = { 0 };
strcpy_s(buf, strlen(indata) + 1, indata);
LOG() << "BUF: " << buf;
// LOG() << "Temp Buff: " << buf;
string in(buf, MAX_BUF_LEN);
string tmpin;
LOG() << "tmpin: " << tmpin.c_str();
string tmpin = "";
int needcheck = 0;
//POS请求数据的验证
if(ProcessPosReqData(in.c_str(), &needcheck, &reqType_i, tmpin) != 1)
{
strcpy(outdata, ERROR_INDATA);
LOG() << "return error message to pos :" << outdata ;
LOG() <<"Error:: "<< "return error message to pos :" << outdata ;
return 0;
}
LOG() << "ProcessPosReqData : " << tmpin;
LOG() << "[**** 2 ****]---->ProcessPosReqData Finished: " << tmpin;
//验证证书
if(global_info.useRSA == 1 && (global_info.serverpublickey.empty() || global_info.localprivatekey.empty()))
{
strcpy(outdata, ERROR_CRET);
LOG() << "return json to pos" << outdata;
LOG() <<"Error:: "<< "return json to pos : " << outdata;
return 0;
}
int ssign = 0;
global_info.error.clear();
global_info.recvbuf.clear();
......@@ -993,168 +615,114 @@ __declspec(dllexport) int __stdcall GetValue(char *indata, char *outdata)
//添加posType字段
addposType(tmpin);
LOG() << "[**** 3 ****]---->addposType Finished Then Send Message To Upp Svr: " << tmpin;
LOG() << "addposType : " << tmpin;
if((ssign = SendMsg(tmpin, global_info.serverurl, 0)) != 1)
//if((ssign = SendMsg(tmpin, "http://118.89.191.256:80/adapter", 0)) != 1)
if ( ( ssign = SendMsg(tmpin, global_info.serverurl, 0 ) ) != 1)
{
strcpy(outdata, global_info.error.c_str());
LOG() << "return error message to pos :" << outdata ;
LOG() <<"Error:: "<< "return error message to pos :" << outdata ;
}
LOG() << "SSIGN:" << ssign;
//if(ssign == -1 && needrbk == 1)
//{
// if(SaveRollBackFile(in) == 0)
// LOG() << "Save Roll Back file failed";
// goto endflag;
//}
//if(ssign == -1 && needrbk == 0)
//{
// goto endflag;
//}
LOG() << "[**** 4 ****]---->SSIGN:" << ssign <<" (If ssig != 1 Flag SendMsg Failed)";
//给支付服务器发送信息,发送错误并且需要查询,进行查询操作
if (ssign == -1 && needcheck == 1)
{
if (ssign == -1 && needcheck == 1) {
//查询操作
if(ResendMsg(tmpin) == 0)
{
if(ReSendMsg(tmpin) == 0) {
strcpy(outdata, global_info.error.c_str());
LOG() << "return error message to pos :" << outdata ;
LOG() <<"Error:: ssign==-1 && needcheck==1, "<< "return error message to pos :" << outdata ;
return 0;
}
else
{
} else {
strcpy(outdata, global_info.recvbuf.c_str());
LOG() << "return message to pos :" << outdata ;
LOG() <<"Error:: ssign==-1 && needcheck==1, "<< "return message to pos :" << outdata ;
}
}
//第一步查询超时,直接返回信息给pos
if (ssign == -1 && needcheck == 0)
{
if (ssign == -1 && needcheck == 0) {
strcpy(outdata, global_info.error.c_str());
LOG() << "return error message to pos :" << outdata ;
LOG() <<"Error:: ssign==-1 && needcheck==0, "<< "return error message to pos :" << outdata ;
return 0;
}
LOG() << global_info.recvbuf.c_str();
LOG() <<"[**** * ****]---->global_info.recvbuf data: "<< global_info.recvbuf.c_str();
Document root;
root.Parse(global_info.recvbuf.c_str());
Value statusCode;
if(root.HasParseError())
{
LOG() << "transform error";
if(root.HasParseError()) {
LOG() <<"Error:: Document Parse global_info.recvbuf Exist Error, "<< "transform error";
return 0;
}
if(!root.HasMember("statusCode"))
{
LOG() << "global_info.recvbuf has no member statusCode!";
if(!root.HasMember("statusCode")) {
LOG() <<"Error:: "<< "global_info.recvbuf has no member statusCode!";
return 0;
}
statusCode = root["statusCode"];
int code;
std::string tmpcode;
if(statusCode.IsString())
{
if(statusCode.IsString()) {
tmpcode = statusCode.GetString();
code = std::atoi(tmpcode.c_str());
}
else if(statusCode.IsInt())
{
} else if ( statusCode.IsInt() ) {
code = statusCode.GetInt();
}
if (ssign == 1 && global_info.useRSA == 1)
{
if (code == 100)
{
if(CheckRSASign() == 0)
{
LOG() << "Check RSA && server return json failed";
if (ssign == 1 && global_info.useRSA == 1) {
if (code == 100) {
// 请求返回成功后, 获取返回签名 并 用签名和证书公钥解密返回报文是否合法;
if(CheckRSASignData() == 0) {
LOG() << "Check RSA && Server Return Json Data Failed";
strcpy(outdata, ERROR_OUTDATA);
return 0;
} else {
LOG() << "[**** 5 ****]---->Check RSA && Sign Server Return Json Data Successed";
}
else
{
LOG() << "Check RSA && server return json successed";
}
}
else
{
} else {
strcpy(outdata, global_info.recvbuf.c_str());
LOG() << "return error message to pos :" << outdata ;
LOG() <<"Error:: "<< "Return Error Message To Pos :" << outdata ;
return 0;
}
}
//if(ssign == 1 && global_info.useRSA == 1 /*&& CheckRSASign() == 0*/)
//{
// LOG() << "Check RSA && server return json failed";
// strcpy(outdata, ERROR_OUTDATA);
// return 0;
//}
//unsigned char outtmp[MAX_BUF_LEN] = { 0 };
//unsigned char outgbk[MAX_BUF_LEN] = { 0 };
//strcpy((char *)outtmp, global_info.recvbuf.c_str());
//UTF8ToGBK(outtmp, outgbk, MAX_BUF_LEN - 1000);
//LOG() << "UTF-8 to GBK :" << outgbk;
char cmpstr[MAX_BUF_LEN] = {0};
if(Tool::ComplementJson(global_info.recvbuf.c_str(), cmpstr, reqType_i) == 0)
{
// 根据 reqType 寻找 指定类型的 json 报文模板,
// 模板验证有效 则 组装并返回 新请求报文;模板验证无效 则 直接使用 recvbuf;
if ( Tool::ComplementJson(global_info.recvbuf.c_str(), cmpstr, reqType_i) == 0 ) {
strcpy(outdata, global_info.recvbuf.c_str());
}
else
{
} else {
strcpy(outdata, cmpstr);
}
//endflag:
LOG() << "[**** 6 ****]---->ComplementJson Finished, Then Return Pos Success";
//检查是否存在冲正文件
//if (CheckRBK() == 1)
//{
// strcpy(outdata, ERROR_ROLLBACK);
// return 0;
//}
return 1;
}
}
// Curl 为接受 自身触发请求的返回数据 而提供读取数据的回调函数;
size_t GetDataForServer(void* buffer, size_t size, size_t nmemb, void *userdata)
{
unsigned int i = size * nmemb;
global_info.recvbuf.append((const char *)buffer, i);
return size*nmemb;
}
// Curl 请求 设置 CURLOPT_HEADERFUNCTION;读取 UppSvr 返回 headers 中的签名;
size_t GetSign(void* buffer, size_t size, size_t nmemb, void *userdata)
{
unsigned int i = size * nmemb;
global_info.sign.append((const char *)buffer, i);
return size*nmemb;
}
// 使用 localprivatekey 对请求报文进行 RSA 加签操作; 加签后的数据作为请求报文 headers 的一项 [ sign: ***** ]
int GetRSASign(const string &text, string &sign)
{
LOG() <<"GetRSASign";
LOG() <<"GetRSASign:: Begin----->";
char tmp[MAX_SIGN_LEN] = { 0 };
string keys[256];
string tmps;
......@@ -1163,22 +731,21 @@ int GetRSASign(const string &text, string &sign)
if((len = DataProcess::GetJsonKeyArray(keys, text)) == 0)
return 0;
//for(int j = 0; j < len; j++)
// std::cout << "---:" << j << ";" << keys[j] << std::endl;
DataProcess::SortString(keys, len);
if(DataProcess::GetValueFromJson(keys, len, text, tmps) == 0)
return 0;
LOG() << "sign data : " << tmps;
LOG() << "GetRSASign:: Before Sign data: " << tmps;
if(DataProcess::RSASign(tmps.c_str(), tmp, MAX_SIGN_LEN, global_info.localprivatekey.c_str()) == 0)
return 0;
sign = string(tmp);
return 1;
}
// 字符的 字节变换 UTF8 -> GBK
int UTF8ToGBK(unsigned char * lpUTF8Str,unsigned char * lpGBKStr,int nGBKStrLen)
{
wchar_t * lpUnicodeStr = NULL;
......@@ -1218,7 +785,8 @@ int UTF8ToGBK(unsigned char * lpUTF8Str,unsigned char * lpGBKStr,int nGBKStrLen)
return nRetLen;
}
int CheckRSASign()
// 使用UppSvr 返回的签名 与 报文, 进行验签操作; 防止报文被篡改;
int CheckRSASignData()
{
if(global_info.sign.empty())
return 0;
......@@ -1226,102 +794,98 @@ int CheckRSASign()
string keys[256];
string tmps;
int len = 0;
LOG() << "get server return sign : " << global_info.sign;
if((len = DataProcess::GetJsonKeyArray(keys, global_info.recvbuf)) == 0)
LOG() << "CheckRSASignData:: Get Sign From Upp Svr Return: " << global_info.sign;
// 初步猜测 仅遍历最外层 Json-key 集合;
if( ( len = DataProcess::GetJsonKeyArray(keys, global_info.recvbuf) ) == 0)
return 0;
// 初步猜测根据 Key字母升序排序;
DataProcess::SortString(keys, len);
// 根据Key查找出其Value 并输出;
if(DataProcess::GetValueFromJson(keys, len, global_info.recvbuf, tmps) == 0)
return 0;
LOG() << "check sign data : " << tmps;
LOG() << "CheckRSASignData:: Begin Check Recv Sign Data , Sort Keys Length: "<<len
<<" Keys->Values: "<< tmps;
return DataProcess::RSAVerify(tmps.c_str(), global_info.sign.c_str(), global_info.serverpublickey.c_str());
}
int GetRealSign()
// 将 UppSvr 返回的签名,正确截取出来并更新到内存字段;
void GetRealSign()
{
if(!global_info.sign.empty())
{
if(!global_info.sign.empty()) {
int i = global_info.sign.find("\r\nsign: ");
if(i == -1)
return 0;
return ;
string tmp = global_info.sign.substr(i + strlen("\r\nsign: "), global_info.sign.length() - 1);
int j = 0;
while(j + 1 < tmp.length() - 1)
{
while( (j + 1) < (tmp.length() - 1) ) {
if(tmp.at(j) == '\r' && tmp.at(j + 1) == '\n')
break ;
++ j;
}
global_info.sign = tmp.substr(0, j);
}
return 0;
return ;
}
// 向UppSvr 发送请求;
int SendMsg(const std::string &text, const string &url, int iscret)
{
LOG() << "SendMsg";
LOG() << "SendMsg:: Begin------------>";
curl_global_init(CURL_GLOBAL_ALL);
global_info.recvbuf.clear();
CURLcode rlt;
int res = 0;
int length = 0;
CURL *curl = curl_easy_init();
struct curl_slist *headers=NULL;
if (!curl)
{
LOG() << "curl init failed !";
if (!curl) {
LOG() << "SendMsg:: Error: curl init failed !";
return 0;
}
if(iscret == 0)
{
if(global_info.useRSA == 1)
{
if(global_info.localprivatekey.empty() || global_info.serverpublickey.empty())
{
// 是否 纯粹获取签名请求( 未签名,第一次被调用时都需要优先签名);
if(iscret == 0) {
if(global_info.useRSA == 1) {
if ( global_info.localprivatekey.empty() || global_info.serverpublickey.empty() ) {
global_info.error = string(ERROR_SIGN);
LOG() << "localprivatekey or serverpublickey is NULL";
LOG() <<"SendMsg:: Error: "<< "localprivatekey or serverpublickey is NULL";
return 0;
}
string sign ;
if(GetRSASign(text, sign) == 0)
{
// 非纯粹签名请求,都需要将请求报文使用私钥进行加签操作(返回签名数据 添加到请求头中,便于对方校验);
if( GetRSASign(text, sign) == 0 ) {
global_info.error = string(ERROR_SIGN);
LOG() << "Get RSA Sign failed";
LOG() <<"SendMsg:: Error: "<< "Get RSA Sign failed";
return 0;
}
LOG() << "get sign : " << sign;
LOG() << "SendMsg:: Get Sign Success: " << sign;
headers = curl_slist_append(headers, string("sign:").append(sign).c_str());
}
/*http请求头*/
/*http请求头:: Host: UppSvr Domain*/
// Authorization Key 可能 EC / CCO 不一致; 要是想合并代码,需要仔细核对;
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=");
headers = curl_slist_append(headers, string("Host:").append(global_info.host).c_str());
}
else
{
/*http请求头*/
if ( global_info.host.length() ) {
headers = curl_slist_append(headers, string("Host:").append(global_info.host).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=");
headers = curl_slist_append(headers, string("Host:").append(global_info.host).c_str());
if ( global_info.host.length() ) {
headers = curl_slist_append(headers, string("Host:").append(global_info.host).c_str());
}
}
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
......@@ -1337,93 +901,67 @@ int SendMsg(const std::string &text, const string &url, int iscret)
rlt = curl_easy_perform(curl);
if (rlt == CURLE_OK )
{
if (rlt == CURLE_OK ) {
res = 1;
if(global_info.useRSA == 1 && iscret == 0)
if ( global_info.useRSA == 1 && iscret == 0 )
GetRealSign();
LOG() << "recv msg from:" << url;
LOG() << "Message:" << global_info.recvbuf;
}else
{
LOG() << "SendMsg:: Recv Msg From Url:" << url << "\n Response: " << global_info.recvbuf;
} else {
res = -1;
LOG() << "recv msg failed:" << curl_easy_strerror(rlt);
LOG() <<"SendMsg:: Error: "<< "Recv Msg Failed:" << curl_easy_strerror(rlt);
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
curl_global_cleanup();
LOG() << "SendMsg:: End------------>";
return res;
}
int CheckCret()
{
if(global_info.recvbuf.size() == 0)
{
LOG() << "recv buf is NULL";
// 检查证书(公钥+私钥) 并更新最新 证书数据到 证书文件中;
// Return: 1:成功 0:失败
int CheckCret() {
if(global_info.recvbuf.size() == 0) {
LOG() << "CheckCret:: Recv Buf Is NULL";
return 0;
}
char outmsg[MAX_BUF_LEN] = { 0 };
int legth = 0;
if((legth = DataProcess::DES3Decode((const unsigned char *)DES3_KEY, global_info.recvbuf.c_str(), global_info.recvbuf.length(), (unsigned char *)outmsg, MAX_BUF_LEN)) == 0)
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() << "3DES encode failed";
LOG() << "CheckCret:: 3DES encode failed";
return 0;
}
LOG() << "3DES Decode:" << outmsg ;
//json_t *root;
//json_error_t error;
LOG() << "CheckCret:: 3DES Decode: " << outmsg ;
Document root;
char *tmp;
#ifdef FM_TESTS
char testreturn[] = "{\r\n \"ver\": 1,\r\n \"partnerId\": 1234,\r\n \"statusCode\": 100,\r\n \"serverPublicKey\": \"HURK/7TakbDFqpYO5FP1L+puEDvAnzhNs1tHuK4ABfxsv/GRNOL9LVo3w08BuzXwRyDzdeOMrkkkimqQ25GTs3WAnyWqcxznwD4LdyAmNEdfFePA1eT+Bn5/BgfpeEuyUDelyPQPonagECQgteBDXeqljRf+3wGrf3BOu9NinqJ3FV2RQrpzQyRR8H6KsbHH0NXv0ziEkhukOPSp2zMgX0/fxaGGi5y6\",\r\n \"clientPrivateKey\": \"VtyoIS+ukDjlAk2O6mMxXwJMECaV3AyQK9FepIpFIV0I/NDZzMzaBmy/8ZE04v0tWjfDTwG7NfBHIPN144yuSSSKapDbkZOzdYCfJapzHOfAPgt3ICY0R18V48DV5P4Gfn8GB+l4S7JQN6XI9A+idqAQJCC14ENd6qWNF/7fAat/cE6702KeoncVXZFCunNDJFHwfoqxscfQ1e/TOISSG6Q49KnbMyBfdr4wu5zv+fJhP0t4WqbQMkkxMmVS/iF6ggSo8B25ktOOwy15xWGx8/DpHdDOwwfiouvpzx7V+vySf+YK2SGIBoDxH6Axcdp2sQHPlL1R6d7t3U/eUZ9uA7DpA7zjeraDRQrtNr/97SyNvqCisfLqTNQsBFHZJ7+lqQ3Dy1JN/vpbmSGSQLU06ZaXEgxRn6WiDwC0OfcwQt7JsOVCIJYHShCTDeL7aDAH6YeFj2x1+P2IcMx/u9tTfd5ptiFi/gE8jS5MAWTPbTf1r2lLRGzk+TxYlHdQpYs4ohZQgtuzEqdt1ERAO6pb6+jaUlSZqhC+3Z1dSe0xVwQk0NN37Ieh8gQpp/RIQq13Oox0o+tt+oWSxAKcQqY5s2n7w0Nal2HEZJtpgcyXG0RWhoqGtWfMM28vWZTmZoDp1QvnPNTsVBNkGdfObCtN7wZVsSSPs4O56dkSsW4uO0xTfQymHLSA8aoRjiWJIKijvLvCcwW8IGuy7i+PnuhhqR5yuRWQq2o6DIjiDUD3N3fYXam3f4opLa1iQBBYurBuOfS7GCqrjfpvtkR0JZNIp9BAw8rLihnO5KSG17c4s2s0f1ZMbNKHUHTOo2Hb70UPVFEXuWFWbtZOtasV4oFhwg==\"\r\n}";
/*root = json_loads(testreturn, 0, &error);*/
root.Parse(testreturn);
#else
/*root = json_loads(outmsg, 0, &error);*/
root.Parse(outmsg);
#endif
//if(!root)
//{
// LOG() << "argv is not json : " << error.text;
// return 0;
//}
if(root.HasParseError())
{
LOG() << "argv is not json :" << root.GetParseError();
if(root.HasParseError()) {
LOG() << "CheckCret:: Argv Is Not Json :" << root.GetParseError();
return 0;
}
//json_t *statusCode = json_object_get(root, "statusCode");
Value statusCode;
statusCode = root["statusCode"];
//if (statusCode == NULL || !json_is_integer(statusCode))
//{
// LOG() << "statusCode error";
// json_decref(root);
// return 0;
//}
if (statusCode.IsNull() || !statusCode.IsInt())
{
if ( statusCode.IsNull() || !statusCode.IsInt() ) {
LOG() << "statusCode error";
return 0;
}
//int code = (int)json_integer_value(statusCode);
int code = (int)statusCode.GetInt();
if(code == 100)
{
if ( code == 100 ) {
string filepath;
FileSys::GetProcPath(filepath);
filepath.append(CRET_FILE_NAME);
......@@ -1431,30 +969,19 @@ int CheckCret()
std::ofstream filestm;
filestm.open(filepath, std::ios::trunc);
if (!filestm.is_open())
{
if (!filestm.is_open()) {
LOG() << CRET_FILE_NAME << " open failed";
/*json_decref(root);*/
return 0;
}
//json_t *serverpublickey = json_object_get(root, "serverPublicKey");
//json_t *localprivatekey = json_object_get(root, "clientPrivateKey");
Value serverpublickey;
Value localprivatekey;
serverpublickey = root["serverPublicKey"];
localprivatekey = root["clientPrivateKey"];
//if(serverpublickey == NULL || !json_is_string(serverpublickey) || localprivatekey == NULL || !json_is_string(localprivatekey))
//{
// LOG() << "serverpublickey or localprivatekey error";
// json_decref(root);
// return 0;
//}
if (serverpublickey.IsNull() || !serverpublickey.IsString() || localprivatekey.IsNull() || !localprivatekey.IsString())
{
LOG() << "serverpublickey or localprivatekey error";
LOG() << "CheckCret:: serverpublickey or localprivatekey error";
return 0;
}
......@@ -1462,132 +989,100 @@ int CheckCret()
filestm.flush();
filestm.close();
//global_info.serverpublickey = string((char *)json_string_value(serverpublickey));
//global_info.localprivatekey = string ((char *)json_string_value(localprivatekey));
global_info.serverpublickey = string((char*)serverpublickey.GetString());
global_info.localprivatekey = string((char*)localprivatekey.GetString());
LOG() << "server public key :" << global_info.serverpublickey;
LOG() << "client private key :" << global_info.localprivatekey;
}
else
{
/*json_decref(root);*/
LOG() << "CheckCret:: Server Public Key: " << global_info.serverpublickey;
LOG() << "CheckCret:: Client Private Key: " << global_info.localprivatekey;
} else {
return 0;
}
//json_decref(root);
return 1;
}
/******************************************
*GetCret :从签名服务获取************/
//extern "C"
//{
int GetRSACret(int partnerId,const char *storeID,const char *posNo)
{
LOG() << "GetRSACret";
if(storeID == NULL || posNo == NULL || strlen(storeID) == 0 || strlen(posNo) == 0)
{
LOG() << "storeID or posNo is NULL";
/*************************GetCret :从签名服务获取************/
// 根据: 商户号 + 门店号 + POS编号 + POS机器MAC地址DES3Encode后密文,获取 RSA 签名证书(公私 秘钥)
// 调用 SendMsg(string(request), global_info.cretserverurl, 1) 进行获取证书操作: 尾部参数 1: 标识单纯获取证书;
// 调用 CheckCret() 将最新证书(公私 秘钥) 存储本地;
int GetRSACret(int partnerId,const char *storeID,const char *posNo)
{
LOG() << "GetRSACret:: Begin:: ---->";
if (storeID == NULL || posNo == NULL || strlen(storeID) == 0 || strlen(posNo) == 0) {
LOG() <<"GetRSACret:: Error: "<< "storeID or posNo is NULL";
return 0;
}
if(InitClient() == 0)
{
if ( InitClient() == 0 ) {
return 0;
}
if(global_info.useRSA == 0)
{
LOG() << "cfg not use RSA";
if ( global_info.useRSA == 0 ) {
LOG() << "GetRSACret:: cfg not use RSA";
return 1;
}
//获取mac地址
std::string macOut;
Tool::GetMacByGetAdaptersAddresses(macOut);
LOG() << macOut;
LOG() <<"GetRSACret:: Pos Machine Mac Info: "<< macOut;
char outmsg[MAX_BUF_LEN] = { 0 };
int legth = 0;
if((legth = DataProcess::DES3Encode((const unsigned char *)DES3_KEY, macOut.c_str(), macOut.length(), (unsigned char *)outmsg, MAX_BUF_LEN)) == 0)
// 不同商户号( EC-1446 + CCO-1438) DES3加密串不一样, 加密原文是Mac地址; 考虑程序合并【dll 入口函数名 也不一样】
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() << "3DES encode failed";
LOG() << "GetRSACret:: 3DES encode failed";
return 0;
}
LOG() << "3DES Encode(base64):" << outmsg ;
LOG() << "GetRSACret:: 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);
LOG() << request;
LOG() <<"GetRSACret:: DownloadRsaKey Req Upp Svr Body: "<< request;
std::string req(request);
//if(GetRealJson(req, std::string(request)) == 0)
// return 0;
#ifndef FM_TESTS
if(SendMsg(string(request), global_info.cretserverurl, 1) == 0)
{
LOG() << "recive data from:" << global_info.cretserverurl << " failed";
if ( SendMsg(string(request), global_info.cretserverurl, 1) == 0 ) {
LOG() << "GetRSACret:: Error: "<< "Recive Data From: " << global_info.cretserverurl << " Failed";
return 0;
}
#endif
#ifdef FM_TESTS
global_info.recvbuf = string(outmsg);
#endif
//string tmpstr = global_info.recvbuf.substr(1, global_info.recvbuf.length() - 2);
//global_info.recvbuf = tmpstr;
if(CheckCret() == 0)
{
LOG() << "Check Cret failed";
if ( CheckCret() == 0 ) {
LOG() << "GetRSACret:: Error: "<< "Check Cret failed";
return 0;
}
LOG() << "GetRSACret:: End:: ---->";
return 1;
}
//}
#ifdef FM_TEST
#define TEST_CG "\346\210\220\345\212\237"
void TestRETDES()
{
char testreturn[] = "{\r\n \"ver\": 1,\r\n \"statusCode\": 100,\r\n \"serverPublicKey\": \"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDK1JuEwMaEetLryK/PxhEd9QdMWllr/MAVNhV4CMboIjQzYg40ZdIU8qp0kaS/Oe06Th8YWi+wPW+vOSSd3J7kq2r23MMULStSyrK/GAyi7tvvpkNmoP2+s9NPoUjzNGqZTVQ3AqktkgTUiQgO5elqnkfXpz7J6OHm1/m0VjOvpwIDAQAB\",\r\n \"clientPrivateKey\": \"MIICXQIBAAKBgQDK1JuEwMaEetLryK/PxhEd9QdMWllr/MAVNhV4CMboIjQzYg40ZdIU8qp0kaS/Oe06Th8YWi+wPW+vOSSd3J7kq2r23MMULStSyrK/GAyi7tvvpkNmoP2+s9NPoUjzNGqZTVQ3AqktkgTUiQgO5elqnkfXpz7J6OHm1/m0VjOvpwIDAQABAoGAAdQ+/sh6QdGVu1iY9Ue0+c8u3Kpn6ghidw6AzQ9PM+KzE8+Ljz9n0JaLoPd7Q9oy4Ha54w9VJMK5EhxyzxWhPSyNr/pvxXwMZL22NfdS/Xlj5L1zzR3JGybc7qxMk4rBX+/aT5YbNG5m4yN3pZldMjJPFzVtv6q4PYnq/DBNjgECQQDsq5NoLXbVBo+Ba4nVrV1yPKNqrLwWkpGONrmkXh3KljNOIBoODKoRt0IfA/fym0t4qDu3e0qNBj44MlxpxmqnAkEA22V+QgM9QonIAWTNgFVlYE6sPtHDaPf7WLBHfCjYTUbjFTAGQBKI3phGdPAipB/2pNlty9RZeHyvDZNRTSIzAQJAY56tA5LvjCegzDc544l/5hAEMWjYGyBCyHvclIVRQO8MVXxJu1Q1WhOrb2a6PZKEqBsYV9k7vjS8h+ca4yMzzQJBAI5u9qf+mF/BOWKGQc/mINmEWdiyr81O6ROr5czaa4rH0ZcoxXYFUmxIqb0zRRoOUj61lc11f9xz/eWvVWHhKQECQQCyEFGJtqqtZZyVNmpWYtCJqVlGD7I2dD5oCmQehYLs3XtwbMsqlxPkSbN9zyYGjiPtg0xevqazN32+hXAO3mmG\"\r\n}";
char outmsg[MAX_BUF_LEN] = { 0 };
int legth = 0;
if((legth = DataProcess::DES3Encode((const unsigned char *)DES3_KEY, testreturn, strlen(testreturn), (unsigned char *)outmsg, MAX_BUF_LEN)) == 0)
if((legth = DataProcess::DES3Encode((const unsigned char *)DES3_KEY_STR.c_str(), testreturn, strlen(testreturn), (unsigned char *)outmsg, MAX_BUF_LEN)) == 0)
{
LOG() << "3DES encode failed";
return ;
}
std::cout << outmsg;
}
......@@ -1607,7 +1102,6 @@ char a[] = "{\r\n \"ver\": \"1\",\r\n \"reqType\": 71,\r\n \"partnerId\
//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}";
void testCheckRollbackData()
{
InitClient();
......@@ -1616,49 +1110,24 @@ void testCheckRollbackData()
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);
//LOG() << c;
//TestRETDES();
//GetRSACret(1443, storeid, posno);
//while(1)
//{
GetValue(a, b);
// LOG() << b;
// Sleep(30*1000);
//}
//testCheckRollbackData();
system("pause");
return 0;
}
#endif
\ No newline at end of file
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