Commit 2f600226 by NitefullWind

1. 整合master分支,开发流水查询功能。 2. 获取签名失败返回错误信息。

parent a1552011
......@@ -11,6 +11,9 @@
#include <QSettings>
#include <QJsonObject>
#include <QEventLoop>
#include <QFont>
#include <QFontDatabase>
#include <QApplication>
#include <QJsonDocument>
#include <Windows.h>
......@@ -49,29 +52,27 @@ Control::Control(QObject *parent) : QObject(parent), _widget(NULL)
void Control::Start(const char *indata, char *outdata)
{
QLOG_INFO() << "get data from pos:" << QString::fromLocal8Bit(indata);
QString appPath;
char pathStr[MAX_PATH] = { 0 };
GetProcPath(pathStr);
appPath = QString::fromLocal8Bit(pathStr);
QFontDatabase::addApplicationFont(appPath + "\\msyh.ttf");
QFont ft("Microsoft YaHei UI Light");
qApp->setFont(ft);
QEventLoop loop;
if(_widget == NULL)
_widget = new HostWidget();
QLOG_INFO() << "In data: " << QString::fromLocal8Bit(indata);
QJsonParseError parseError;
QJsonDocument inDataDoc = QJsonDocument::fromJson(QString::fromUtf8(indata).toUtf8(), &parseError);
if(parseError.error == QJsonParseError::NoError) {
_posReqJsonObj = inDataDoc.object();
int type = FMTool::GetJsonValue(_posReqJsonObj, JSON_KEY_REQTYPE).toInt();
switch (type) {
case SPCC_pay:
_posReqJsonObj[JSON_KEY_REQTYPE] = 72;
break;
case SPCC_refund:
_posReqJsonObj[JSON_KEY_REQTYPE] = 62;
break;
default:
break;
}
int type = FMTool::GetJsonValue(_posReqJsonObj, JSON_KEY_REQTYPE).toInt(SPCC_sign);
_posReqJsonObj[JSON_KEY_REQTYPE] = type - SPCC_sign;
} else {
qDebug() << "Json parse error: " << parseError.errorString();
memcpy(&_request, indata, sizeof(struct AlipayRequest));
......@@ -226,8 +227,8 @@ bool Control::SendMessageToSBKAPI(const QJsonObject &json, QByteArray &outdata,
"</ns0:AP>"
"</ns0:OLTP>");
QString nsTo = "CS00400004";
int type = FMTool::GetJsonValue(json, JSON_KEY_REQTYPE).toInt(-1);
if(type==-1) {
int type = FMTool::GetJsonValue(json, JSON_KEY_REQTYPE).toInt(sign);
if(type==sign) {
nsTo = "CS00400003";
}
QString date = QDate::currentDate().toString("yyMMdd");
......@@ -250,14 +251,16 @@ bool Control::SendMessageToSBKAPI(const QJsonObject &json, QByteArray &outdata,
strcpy(in, reqXmlStr.toUtf8().data());
QLOG_INFO() << "Request StarbucksAPI XML data: " << in;
#define SBKTEST
#ifdef SBKTEST
int result = skbSend(in, guid, out, errMsg, mode);
#ifndef SBKTEST
int result = skbSend(in, guid, out, errMsg, mode);
#else
QLOG_DEBUG() << "============ Read debug data. ===============";
QFile f(qApp->applicationDirPath()+"/test/1.txt");
QLOG_DEBUG() << "=========================================== Read debug data. ========================================";
QLOG_DEBUG() << "Test req type: " << type;
QFile f(qApp->applicationDirPath()+QString("/test/%1.txt").arg(type));
f.open(QIODevice::ReadOnly);
strcpy(out, f.readAll().data());
QLOG_DEBUG() << "=========================================== End read debug data. ====================================";
int result = 0;
#endif //! End def SBKTEST
......@@ -371,13 +374,12 @@ bool Control::GetRSA(QString &error)
SetRSACret setRsaCret = (SetRSACret)lib.resolve("SetRSACret");
if(setRsaCret != NULL) {
if(setRsaCret(out.data())) {
rlt = setRsaCret(out.data());
if(rlt) {
QLOG_INFO() << "setRSACret return success. ";
return true;
} else {
error = "setRSACret return error.";
error = QString::fromLocal8Bit("保存文件签名失败");
QLOG_ERROR() << error;
return false;
}
} else {
QLOG_ERROR() << "get function (SetRSACret) failed";
......@@ -415,7 +417,7 @@ bool Control::GetRSA(QString &error)
QLOG_ERROR() << "load dll failed";
error = QString::fromLocal8Bit("加载基础组件(dll)失败");
}
return rlt;
return (rlt==1);
}
QString Control::GetMacString(bool isSign)
......@@ -497,14 +499,28 @@ bool Control::GetJson(ReqType type,QJsonObject &json, const QByteArray array, QS
json = jsonDocument.object();
if(json.contains(JSON_KEY_MESSAGE) && json.contains(JSON_KEY_STATUSCODE) && (json[JSON_KEY_STATUSCODE].toInt() == 307 || json[JSON_KEY_STATUSCODE].toInt() == 303))
{
error = QString::fromLocal8Bit("签名过期,请重新获取签名");
json.insert(JSON_KEY_MESSAGE, QString::fromLocal8Bit("签名过期,请重新获取签名"));
}
if(type == againprint)
json.insert(JSON_KEY_FMID, _fmId);
// RspFactory::GetResPonseJson(type, _response, json);
RspFactory::GetResPonseJson(type, _responseJsonObj, json);
if(json.contains(JSON_KEY_MESSAGE))
error = json[JSON_KEY_MESSAGE].toString();
if(type == refund && json.contains(JSON_KEY_STATUSCODE) && json[JSON_KEY_STATUSCODE].toInt() == 100)
json.insert(JSON_KET_CLIENTREF, FMTool::GetJsonValue(_posReqJsonObj, JSON_KEY_TRANSAMOUNT));
if(json.contains(JSON_KEY_STATUSCODE) && json[JSON_KEY_STATUSCODE].toInt() == 100)
return true;
return false;
}
......@@ -516,6 +532,9 @@ void Control::Request(ReqType type, QStringList list)
// JsonFactory::GetJsonWithType(type, json, _request, list);
if(type == againprint)
_fmId = list[0];
// bool rlt = SendMessageToPayMent(json, outdata, error);
JsonFactory::GetJsonWithType(type, json, _posReqJsonObj, list);
......@@ -524,12 +543,16 @@ void Control::Request(ReqType type, QStringList list)
QByteArray jsonArray = QJsonDocument(json).toJson(QJsonDocument::Compact);
char signStr[MAX_BUF_LEN] = {0};
GetSPCCSign(jsonArray.data(), signStr);
json["sign"] = QString::fromLocal8Bit(signStr);
QLOG_INFO() << "Sign str: " << signStr;
bool rlt = false;
if((rlt = GetSPCCSign(jsonArray.data(), signStr, error)))
{
json["sign"] = QString::fromLocal8Bit(signStr);
QLOG_INFO() << "Sign str: " << signStr;
bool rlt = SendMessageToSBKAPI(json, outdata, error);
rlt = SendMessageToSBKAPI(json, outdata, error);
}
if(rlt)
rlt = Control::GetJson(type, rtjson, outdata, error);
......@@ -540,8 +563,14 @@ void Control::Request(ReqType type, QStringList list)
_lock.lock();
if(_widget != NULL)
if(_widget != NULL && type == finds)
{
_widget->ShowWiteJson(rlt, rtjson, error);
}
else
{
_widget->ShowWiteMGS(type, rlt, error);
}
_lock.unlock();
}
......@@ -555,7 +584,7 @@ void Control::RequestWithType(ReqType type, QStringList list)
Request(type, list);
}
void Control::GetSPCCSign(char *in, char *out)
bool Control::GetSPCCSign(char *in, char *out, QString &error)
{
char mod[MAX_PATH] = { 0 };
......@@ -567,15 +596,21 @@ void Control::GetSPCCSign(char *in, char *out)
{
AddSign addsign = (AddSign)lib.resolve("AddSign");
if(addsign != NULL) {
QLOG_INFO() << "Sign return: " << addsign(in, out);
if(addsign(in, out)) {
return true;
} else {
error = QString::fromLocal8Bit("获取签名失败.");
QLOG_ERROR() << error;
}
} else {
QLOG_ERROR() << "get function (AddSign) failed";
// error = QString::fromLocal8Bit("加载基础组件(fun)失败");
error = QString::fromLocal8Bit("加载函数(AddSign)失败");
QLOG_ERROR() << error;
}
}
else
{
QLOG_ERROR() << "load dll failed";
// error = QString::fromLocal8Bit("加载基础组件(dll)失败");
error = QString::fromLocal8Bit("加载基础组件(FreemudWrapper)失败");
QLOG_ERROR() << error;
}
return false;
}
......@@ -46,7 +46,7 @@ private:
bool GetJson(ReqType type, QJsonObject &json, const QByteArray array, QString &error);
void GetSPCCSign(char *in, char *out);
bool GetSPCCSign(char *in, char *out, QString &error);
QString GetMacString(bool isSign=true);
......@@ -66,7 +66,7 @@ private:
//确保exe结束后不会重新弹窗
QMutex _lock;
QString _fmId;
......
......@@ -146,6 +146,24 @@ public:
}
static void SetStringWith(void *beginptr, int size, const QString &in)
{
char buf[MAX_PRINT_LEN] = { 0 };
char tmpbuf[MAX_PRINT_LEN] = { 0 };
if(in.isEmpty())
return ;
strcpy(buf, in.toUtf8().data());
int len = UTF8ToGBK((unsigned char *)buf, (unsigned char *)tmpbuf, MAX_PRINT_LEN);
memcpy((char *)beginptr, tmpbuf, len - 1);
//qDebug() << tmpbuf;
}
static QJsonValue GetJsonValue(const QJsonObject &jsonObj, const QString &key)
{
if(jsonObj.contains(key)) {
......
......@@ -3,7 +3,7 @@
#define MAX_BUF_LEN 25600
#define MAX_CHILED_LEN 256
#define MAX_PRINT_LEN 4096
#define MAX_PRINT_LEN 12800
#define PRINT_FILE_PATH "C:/Freemud/fmClient/Prints/"
#define PRINT_ENDDAY_FILE_NAME "EndDayPrint.txt"
......@@ -23,23 +23,40 @@
#define JSON_KEY_STATIONID "stationId"
#define JSON_KEY_OPERATORID "operatorId"
#define JSON_KEY_TRANSID "transId"
#define JSON_KEY_REFUNDID "refundId"
#define JSON_KEY_BUSINESSDATE "businessDate"
#define JSON_KEY_CODE "code"
#define JSON_KEY_FMID "fmId"
#define JSON_KEY_TRANSAMOUNT "transAmount"
#define JSON_KEY_REFUNDAMOUT "refundAmount"
#define JSON_KEY_ENDTIME "endTime"
#define JSON_KEY_REFUNDID "refundId"
#define JSON_KEY_PRINTACTION "printAction"
#define JSON_KEY_TRANSTIME "transTime"
#define JSON_KEY_STATE "state"
#define JSON_KEY_STATEMSG "stateMsg"
#define JSON_KEY_METHCODE "paymentMethodCode"
//response
#define JSON_KEY_MESSAGE "message"
#define JSON_KEY_STATUSCODE "statusCode"
#define JSON_KEY_PAYACCOUNT "payAccount"
#define JSON_KEY_PAYTRANSID "payTransId"
#define JSON_KEY_TYPE "type"
#define JSON_KEY_FMID "fmId"
#define JSON_KEY_EXT "ext"
#define JSON_KEY_PRINT "print"
#define JSON_KEY_PRINTACTION "printAction"
#define JSON_KEY_PRINTPATH "path"
#define JSON_KET_CLIENTREF "cAlientrefundamount"
#define JSON_KEY_PAYMENTMETHOD "paymentMethod"
#define JSON_KEY_PAYMENTMETHODCODE "paymentMethodCode"
#define JSON_KEY_TRANSAMOUNT "transAmount"
#define JSON_KEY_MERDISCOUNT "merchantDiscount"
#define JSON_KEY_PLTDISCOUNT "platformDiscount"
#define JSON_KEY_UNAMOUNT "undiscountAmount"
#define JSON_KEY_PARTORDERID "partnerOrderId"
......@@ -51,6 +68,15 @@
#define JSON_KEY_PRODUCTS_SALESTYPE "salesType"
#define JSON_KEY_PRODUCTS_PRICE "price"
#define JSON_KEY_TOTALNUM "totalNum"
#define JSON_KEY_QUERYINFO "queryInfo"
#define JSON_KEY_PAGENUM "pageNum"
#define JSON_KEY_PAGESIZE "pageSize"
#define JSON_KEY_BEGINTIME "beginTime"
#define JSON_KEY_ENDTIME "endTime"
#define DEFAULT_JSON_VER_VALUE 1
#define DEFAULT_JSON_PRODUCTS_NORMAL "NORMAL"
#define DEFAULT_JSON_PRODUCTS_FREE "FREE"
......@@ -59,7 +85,7 @@
#define JSON_REQTYPE_REFUND 62
#define JSON_REQTYPE_ENDDAY 82
#define JSON_REQTYPE_PRINTER 85
#define JSON_REQTYPE_find 2
#define JSON_REQTYPE_FIND 2
#endif // GLOBAL
......@@ -29,6 +29,10 @@ public:
void ShowWiteMGS(ReqType type, bool flag, QString message = QString());
void ShowWiteJson(bool flag, QJsonObject object, QString error);
void setRuning(bool runing);
signals:
void RequestWithType(ReqType type, QStringList list);
......@@ -59,6 +63,12 @@ private slots:
void on_TimeOut();
void on_btn_find_check_clicked();
void on_btn_find_next_clicked();
void on_btn_find_up_clicked();
void on_btn_mananger_print_shift_clicked();
private:
......@@ -80,10 +90,16 @@ private:
LabelsTimer *_label_pay_timer;
LabelsTimer *_label_find_timer;
QMovie *_label_pay_movie;
int _line;
bool _need_exit;
bool _runing;
ReqType _type;
};
......
......@@ -25,7 +25,7 @@ public:
return GetDayEndJson(json, request, list);
if(type == againprint)
return GetAgainPrinteJson(json, request, list);
if(type == find)
if(type == finds)
return GetFindJson(json, request, list);
return false;
}
......@@ -43,6 +43,8 @@ public:
return GetEnddayJson(json, reqJson, list);
case shift:
return GetShiftJson(json, reqJson, list);
case finds:
return GetFindJson(json, reqJson, list);
default:
json = reqJson;
break;
......@@ -67,7 +69,7 @@ public:
return GetDayEndResponse(rspJsonObj, response);
if(type == againprint)
return GetAgainPrinteResponse(rspJsonObj, response);
if(type == find)
if(type == finds)
return GetFindResponse(rspJsonObj, response);
return false;
}
......@@ -139,6 +141,7 @@ private:
return false;
json = reqJson;
json[JSON_KEY_CODE] = list[0];
json[JSON_KEY_REQTYPE] = JSON_REQTYPE_PAY;
return true;
}
......@@ -169,6 +172,7 @@ private:
return false;
json = reqJson;
json.insert(JSON_KEY_FMID, list[0]);
json[JSON_KEY_REQTYPE] = JSON_REQTYPE_REFUND;
json[JSON_KEY_REFUNDAMOUT] = reqJson[JSON_KEY_TRANSAMOUNT];
json[JSON_KEY_REFUNDID] = reqJson[JSON_KEY_TRANSID];
json.remove(JSON_KEY_TRANSAMOUNT);
......@@ -211,21 +215,74 @@ private:
//重打小票
static bool GetAgainPrinteJson(QJsonObject &json, const AlipayRequest &request, QStringList list)
{
if(list.size() != 2 || list[0].isEmpty() || list[1].isEmpty())
if(!list.isEmpty() && list[0].isEmpty())
return false;
json.insert(JSON_KEY_VER, DEFAULT_JSON_VER_VALUE);
json.insert(JSON_KEY_REQTYPE, JSON_REQTYPE_REFUND);
json.insert(JSON_KEY_REQTYPE, JSON_REQTYPE_PRINTER);
json.insert(JSON_KEY_PARTNERID, FMTool::GetString((const void *)&(request.PlatNo), 4).toInt());
json.insert(JSON_KEY_STOREID, FMTool::GetString((const void *)&(request.StoreNo), 20));
json.insert(JSON_KEY_STATIONID, FMTool::GetString((const void *)&(request.DeviceNo), 6));
json.insert(JSON_KEY_OPERATORID, FMTool::GetString((const void *)&(request.CashierNo), 6));
json.insert(JSON_KEY_FMID, list[1]);
json.insert(JSON_KEY_FMID, list[0]);
json.insert(JSON_KEY_PRINTACTION, QString("103"));
return true;
}
//查询流水
static bool GetFindJson(QJsonObject &json, const AlipayRequest &request, QStringList list)
{
if(list.size() != 3 || list[0].isEmpty() || list[1].isEmpty())
return false;
QString tmp0 = list[0];
QString tmp1 = list[1];
QString tmp2 = list[2];
QString cur = QDateTime::currentDateTime().toString("hh:mm:ss");
tmp0.append(" 00:00:00");
tmp1.append(QString(" ") + cur);
json.insert(JSON_KEY_VER, DEFAULT_JSON_VER_VALUE);
json.insert(JSON_KEY_REQTYPE, JSON_REQTYPE_FIND);
json.insert(JSON_KEY_PARTNERID, FMTool::GetString((const void *)&(request.PlatNo), 4).toInt());
json.insert(JSON_KEY_STOREID, FMTool::GetString((const void *)&(request.StoreNo), 20));
json.insert(JSON_KEY_STATIONID, FMTool::GetString((const void *)&(request.DeviceNo), 6));
json.insert(JSON_KEY_OPERATORID, FMTool::GetString((const void *)&(request.CashierNo), 6));
json.insert(JSON_KEY_BEGINTIME, tmp0);
json.insert(JSON_KEY_ENDTIME, tmp1);
json.insert(JSON_KEY_PAGESIZE, 10);
json.insert(JSON_KEY_PAGENUM, tmp2.toInt());
json.insert(JSON_KEY_METHCODE, 10001);
return true;
}
static bool GetFindJson(QJsonObject &json, const QJsonObject &request, QStringList list)
{
if(list.size() != 3 || list[0].isEmpty() || list[1].isEmpty())
return false;
QString tmp0 = list[0];
QString tmp1 = list[1];
QString tmp2 = list[2];
QString cur = QDateTime::currentDateTime().toString("hh:mm:ss");
tmp0.append(" 00:00:00");
tmp1.append(QString(" ") + cur);
json.insert(JSON_KEY_VER, DEFAULT_JSON_VER_VALUE);
json.insert(JSON_KEY_REQTYPE, JSON_REQTYPE_FIND);
json.insert(JSON_KEY_PARTNERID, FMTool::GetJsonValue(request, JSON_KEY_PARTNERID));
json.insert(JSON_KEY_STOREID, FMTool::GetJsonValue(request, JSON_KEY_STOREID));
json.insert(JSON_KEY_STATIONID, FMTool::GetJsonValue(request, JSON_KEY_STATIONID));
json.insert(JSON_KEY_OPERATORID, FMTool::GetJsonValue(request, JSON_KEY_OPERATORID));
json.insert(JSON_KEY_BEGINTIME, tmp0);
json.insert(JSON_KEY_ENDTIME, tmp1);
json.insert(JSON_KEY_PAGESIZE, 10);
json.insert(JSON_KEY_PAGENUM, tmp2.toInt());
json.insert(JSON_KEY_METHCODE, 10001);
return true;
}
......@@ -234,8 +291,7 @@ private:
// 支付AlipayResponse
static bool GetPayResponse(const QJsonObject &rspJsonObj, AlipayResponse &response)
{
return true;
return false;
}
// 退款AlipayResponse
static bool GetRefundResponse(const QJsonObject &rspJsonObj, AlipayResponse &response)
......
......@@ -236,16 +236,17 @@ int main(int argc, char *argv[])
AlipayRequest req;
FMTool::SetString(req.BusinessDay, 8 , QString("20170908"));
FMTool::SetString(req.TransType, 2 , QString("30"));
FMTool::SetString(req.BusinessDay, 8 , QString("20170909"));
FMTool::SetString(req.TransType, 2 , QString("10"));
FMTool::SetString(req.PlatNo, 4, QString("1443"));
FMTool::SetString(req.TransTime, 6, QString("130301"));
FMTool::SetString(req.StoreNo, 20 , QString("17607"));
FMTool::SetString(req.DeviceNo, 6 , QString("1"));
FMTool::SetString(req.CashierNo, 6 , QString("0123"));
FMTool::SetString(req.CashTraceNo, 6 , QString("123123"));
FMTool::SetString(req.CashTraceNo, 6 , QString("16723"));
FMTool::SetString(req.OriginTrace, 64 , QString("7871170818A00002005"));
FMTool::SetString(req.Amount, 12, QString("1"));
FMTool::SetString(req.Reserved1, 48 , QString("124112312312312312312----32"));
FMTool::SetString(req.Reserved1, 48 , QString("12411235821335894422"));
req.item_line_qty[0] = '2';
req.item_line_qty[1] = ' ';
......@@ -288,7 +289,7 @@ int main(int argc, char *argv[])
// control.Start(as, b);
char spccIn[MAX_BUF_LEN] = "{\"fmId\":\"0123456789012345678\",\"reqType\":351,\"storeId\":\"1713\",\"stationId\":\"1\",\"partnerId\":1443,\"operatorId\":\"sssaw\",\"transId\":\"52342342323806\",\"transAmount\":8000,\"partnerOrderId\":\"909911039993720192019\",\"businessDate\":\"20170508\",\"products\":[{\"pid\":\"123\",\"name\":\"中杯拿铁\",\"price\":321,\"salesType\":\"NORMAL\"}]}";
char spccIn[MAX_BUF_LEN] = "{\"fmId\":\"0123456789012345678\",\"reqType\":353,\"storeId\":\"1713\",\"stationId\":\"1\",\"partnerId\":1443,\"operatorId\":\"sssaw\",\"transId\":\"52342342323806\",\"transAmount\":8000,\"partnerOrderId\":\"909911039993720192019\",\"businessDate\":\"20170508\",\"products\":[{\"pid\":\"123\",\"name\":\"中杯拿铁\",\"price\":321,\"salesType\":\"NORMAL\"}]}";
control.Start(spccIn, b);
return a.exec();
......
......@@ -3,19 +3,21 @@
typedef enum
{
manage = 10,
pay = 30,
refund = 40,
sign,
manage,
pay,
refund,
finds,
endday,
shift,
againprint,
find = 80,
sign = 90,
SPCC_sign= 350,
SPCC_sign = 350,
SPCC_manage,
SPCC_pay,
SPCC_refund,
SPCC_find
SPCC_finds
} ReqType;
struct EFTItem
......
......@@ -13,9 +13,10 @@ TARGET = sbkpay
include("./QsLog/QsLog.pri")
CONFIG += C++11
#CONFIG += SBKTEST
CONFIG += SBKDLL
CONFIG += C++11 SBKDLL
#DEFINES += SBKTEST
#DEFINES += SBKDLL
include($$PWD/qtwinmigrate/src/qtwinmigrate.pri)
......
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