Commit 8c7406ea by NitefullWind

1. 调整绿篮子对接代码。

parent 6c341fa9
...@@ -64,16 +64,22 @@ void FMVipDispatcher::doTask(const QByteArray &reqData, QByteArray &rspData) ...@@ -64,16 +64,22 @@ void FMVipDispatcher::doTask(const QByteArray &reqData, QByteArray &rspData)
} }
break; break;
} }
case FM_Order_Refund: { case FM_Refund: {
TaskRefundOrder taskRefundOrder(jsonObj); QString fm_id = jsonObj[PosProps.Transaction].toObject()[PosProps.Fm_id].toString();
rspData = taskRefundOrder.doTask(); if(fm_id != "") {
break; TaskRefundOrder taskRefundOrder(jsonObj);
} rspData = taskRefundOrder.doTask();
case FM_Order_Revoke: { } else {
TaskRefundPay taskRefundPay(jsonObj); TaskRefundPay taskRefundPay(jsonObj);
rspData = taskRefundPay.doTask(); rspData = taskRefundPay.doTask();
}
break; break;
} }
// case FM_Order_Revoke: {
// TaskRefundPay taskRefundPay(jsonObj);
// rspData = taskRefundPay.doTask();
// break;
// }
case FM_QR_Refund: { case FM_QR_Refund: {
if (_ctx) { if (_ctx) {
ctkServiceReference ref =_ctx->getServiceReference<FMPePayInterface>(); ctkServiceReference ref =_ctx->getServiceReference<FMPePayInterface>();
......
...@@ -21,15 +21,30 @@ ...@@ -21,15 +21,30 @@
enum FM_TYPE { enum FM_TYPE {
FM_Login = 1001, FM_Login = 1001,
FM_Pay = 1003, FM_Pay = 1003,
FM_Order_Refund, FM_Refund = 1004,
FM_Charge_Refund,
FM_Final = 1007, FM_Final = 1007,
FM_Coupon = 1009, FM_Coupon = 1009,
FM_Fund, FM_Fund,
FM_Order_Revoke, FM_Order_Revoke,
FM_QR_Pay = 10031, FM_QR_Pay = 10031,
FM_QR_Refund = 10041 FM_QR_Refund = 10041,
FM_Refund_Pay,
FM_Refund_Order
}; };
// 会员服务端请求URL
#ifndef FMREQURLMAP
#define FMREQURLMAP
typedef std::map<int, QString> FMReqUrlMap;
const FMReqUrlMap::value_type FMReqUrlMapPairs[] =
{
FMReqUrlMap::value_type(FM_Login, "auth"),
FMReqUrlMap::value_type(FM_Pay, "pay"),
FMReqUrlMap::value_type(FM_Final, "order"),
FMReqUrlMap::value_type(FM_Refund_Pay, "refund"),
FMReqUrlMap::value_type(FM_Refund_Order, "correct")
};
const FMReqUrlMap ReqUrl(FMReqUrlMapPairs, FMReqUrlMapPairs + (sizeof FMReqUrlMapPairs / sizeof FMReqUrlMapPairs[0]));
#endif
// JSON数据各字段名称 // JSON数据各字段名称
#ifndef POSPROPS #ifndef POSPROPS
...@@ -40,6 +55,7 @@ struct PP{ ...@@ -40,6 +55,7 @@ struct PP{
AppId = "appId"; AppId = "appId";
PartnerId = "partnerId"; PartnerId = "partnerId";
T = "t"; T = "t";
Sign = "sign";
StoreId = "store_id"; StoreId = "store_id";
PosId = "pos_id"; PosId = "pos_id";
OperatorId = "operator_id"; OperatorId = "operator_id";
...@@ -74,7 +90,7 @@ struct PP{ ...@@ -74,7 +90,7 @@ struct PP{
ScoreAmount = "scoreAmount"; ScoreAmount = "scoreAmount";
IsUseScore = "isUseScore"; IsUseScore = "isUseScore";
Coupons = "coupons"; Coupons = "coupons";
Transaction = "transaction"; Transaction = "transactions";
OrderAmount = "order_amount"; OrderAmount = "order_amount";
PaidAmount = "paid_amount"; PaidAmount = "paid_amount";
NeedAmount = "need_amount"; NeedAmount = "need_amount";
...@@ -113,6 +129,7 @@ struct PP{ ...@@ -113,6 +129,7 @@ struct PP{
QString AppId ; QString AppId ;
QString PartnerId ; QString PartnerId ;
QString T ; QString T ;
QString Sign ;
QString StoreId ; QString StoreId ;
QString PosId ; QString PosId ;
QString OperatorId ; QString OperatorId ;
...@@ -201,13 +218,18 @@ const PropsMap::value_type PropsMapPairs[] = ...@@ -201,13 +218,18 @@ const PropsMap::value_type PropsMapPairs[] =
PropsMap::value_type(PosProps.StoreId, "storeId"), PropsMap::value_type(PosProps.StoreId, "storeId"),
PropsMap::value_type(PosProps.PosId, "stationId"), PropsMap::value_type(PosProps.PosId, "stationId"),
PropsMap::value_type(PosProps.OperatorId, "operatorId"), PropsMap::value_type(PosProps.OperatorId, "operatorId"),
PropsMap::value_type(PosProps.Phone, "mobile"), PropsMap::value_type(PosProps.Phone, "mobile"),
PropsMap::value_type(PosProps.TransId, "transId"), PropsMap::value_type(PosProps.TransId, "transId"),
PropsMap::value_type(PosProps.Coupon, "couponCode"), PropsMap::value_type(PosProps.Coupon, "couponCode"),
PropsMap::value_type(PosProps.BussinessDate,"businessDate"), PropsMap::value_type(PosProps.BussinessDate,"businessDate"),
PropsMap::value_type(PosProps.Fm_open_id, "account"), PropsMap::value_type(PosProps.Fm_id, "memberTransId"),
PropsMap::value_type(PosProps.Account, "memberNo"), PropsMap::value_type(PosProps.Fm_open_id, "account"),
PropsMap::value_type(PosProps.CouponList, "coupon_list") PropsMap::value_type(PosProps.Account, "memberNo"),
PropsMap::value_type(PosProps.CouponList, "coupon_list"),
PropsMap::value_type(PosProps.PaidAmount, "payAmount"),
PropsMap::value_type(PosProps.OrderAmount, "totalAmount"),
PropsMap::value_type(PosProps.Pay_id, "typeModeFlag"),
PropsMap::value_type(PosProps.Pay_amount, "amount"),
}; };
static PropsMap PosToServerProps(PropsMapPairs, PropsMapPairs + (sizeof(PropsMapPairs)/sizeof(PropsMapPairs[0]))); static PropsMap PosToServerProps(PropsMapPairs, PropsMapPairs + (sizeof(PropsMapPairs)/sizeof(PropsMapPairs[0])));
......
...@@ -107,13 +107,14 @@ bool FMTask::sendToServer(bool isShowMsg) ...@@ -107,13 +107,14 @@ bool FMTask::sendToServer(bool isShowMsg)
serverReqJsonObj[PosProps.PartnerId] = PARTNER_ID; serverReqJsonObj[PosProps.PartnerId] = PARTNER_ID;
serverReqJsonObj[PosProps.T] = QString::number(QDateTime::currentMSecsSinceEpoch()); serverReqJsonObj[PosProps.T] = QString::number(QDateTime::currentMSecsSinceEpoch());
serverReqJsonObj[ServerProps(PosProps.Fm_cmd)] = FM_Type(); serverReqJsonObj[ServerProps(PosProps.Fm_cmd)] = QString::number(FM_Type());
serverReqJsonObj[PosProps.Sign] = sign();
packageServerReq(); packageServerReq();
QJsonDocument json(serverReqJsonObj); QJsonDocument json(serverReqJsonObj);
QByteArray data = json.toJson(QJsonDocument::Compact); QByteArray data = json.toJson(QJsonDocument::Compact);
url = QString("%1?sign=%2").arg(FMPVipSettings::instance()->getServerUrl()).arg(sign()); url = FMPVipSettings::instance()->getServerUrl() + "/" + ReqUrl.at(FM_Type());
QByteArray rspData; QByteArray rspData;
FMNetwork net; FMNetwork net;
......
...@@ -23,41 +23,3 @@ QByteArray FMTaskNoWnd::doTask() ...@@ -23,41 +23,3 @@ QByteArray FMTaskNoWnd::doTask()
QJsonDocument json(posRspJsonObj); QJsonDocument json(posRspJsonObj);
return json.toJson(QJsonDocument::Compact); return json.toJson(QJsonDocument::Compact);
} }
QString FMTaskNoWnd::sign() const
{
FMP_DEBUG() << __FUNCTION__;
// 解析JSON插入MAP中按字典排序
QMap<QString, QString> mapData;
for(int i=0; i<sizeof(SignProps)/sizeof(SignProps[0]); ++i) {
QString word = SignProps[i];
if(serverReqJsonObj[word].isDouble()) {
mapData[word] = QString::number(serverReqJsonObj[word].toDouble());
} else {
mapData[word] = serverReqJsonObj[word].toString();
}
}
if (serverRspJsonObj[ServerProps(PosProps.Fm_cmd)].toInt() == FM_Fund) {
mapData[ServerProps(PosProps.TransId)] = serverReqJsonObj[ServerProps(PosProps.TransId)].toString();
}
// 使用URL键值对的格式拼接
QString sb = "";
foreach(QString key , mapData.keys())
{
sb += (key + "=" + mapData.value(key) + "&");
}
sb.remove(sb.length() - 1, 1); // 去掉最后一个&
sb.append(KEY_CODE);
QByteArray bt;
bt.append(sb);
FMP_INFO() << "Sign String: " << bt;
QByteArray md5Bt = QCryptographicHash::hash(bt, QCryptographicHash::Md5);
return md5Bt.toHex();
}
...@@ -13,8 +13,6 @@ public: ...@@ -13,8 +13,6 @@ public:
protected: protected:
virtual void packageServerReq() = 0; virtual void packageServerReq() = 0;
virtual void packagePOSRsp() = 0; virtual void packagePOSRsp() = 0;
QString sign() const;
}; };
#endif // FMTASKNOWND_H #endif // FMTASKNOWND_H
...@@ -10,40 +10,24 @@ ...@@ -10,40 +10,24 @@
#include <QCryptographicHash> #include <QCryptographicHash>
TaskFinal::TaskFinal(QJsonObject &jsonObj, Session *session, QObject *parent) TaskFinal::TaskFinal(QJsonObject &jsonObj, Session *session, QObject *parent)
:QObject(parent) :FMTaskNoWnd(jsonObj, FM_Final, session, parent)
{ {
posReqJsonObj = jsonObj;
_session = session;
_error = FM_API_SUCCESS;
}
QByteArray TaskFinal::doTask()
{
bool isOk = sendToServer();
if(!isOk) {
FMP_WARN() << QString("Task error %1: %2").arg(error()).arg(errorString());
return QString(ErrorMsgJson).arg(error()).arg(errorString()).toLatin1();
}
packagePOSRsp();
return QJsonDocument(posRspJsonObj).toJson(QJsonDocument::Compact);
} }
void TaskFinal::packageServerReq() void TaskFinal::packageServerReq()
{ {
serverReqJsonObj["appId"] = APP_ID;
serverReqJsonObj["stationId"] = getPosJsonValue("pos_id");
serverReqJsonObj["storeId"] = getPosJsonValue("store_id");
serverReqJsonObj["operatorId"] = getPosJsonValue("operator_id");
serverReqJsonObj["partnerId"] = PARTNER_ID;
QJsonObject transData; QJsonObject transData;
transData["businessDate"] = getPosJsonValue("business_date"); std::vector<QString> p;
transData["transId"] = getPosJsonValue("trans_id"); p.push_back(PosProps.BussinessDate);
transData["memberTransId"] = getPosJsonValue("fm_id"); p.push_back(PosProps.TransId);
transData["account"] = getPosJsonValue("fm_open_id"); p.push_back(PosProps.Fm_id);
transData["totalAmount"] = getPosJsonValue("order_amount"); p.push_back(PosProps.Fm_open_id);
transData["payAmount"] = getPosJsonValue("paid_amount"); p.push_back(PosProps.OrderAmount);
p.push_back(PosProps.PaidAmount);
foreach(auto prop , p) {
transData[ServerProps(prop)] = getPosJsonValue(prop);
}
// 产品列表 // 产品列表
QJsonArray products; QJsonArray products;
foreach(auto p , getPosJsonValue("products").toArray()) foreach(auto p , getPosJsonValue("products").toArray())
...@@ -91,57 +75,12 @@ void TaskFinal::packageServerReq() ...@@ -91,57 +75,12 @@ void TaskFinal::packageServerReq()
} }
transData["payList"] = payList; transData["payList"] = payList;
serverReqJsonObj["data"] = transData; serverReqJsonObj["data"] = transData;
int finalType = getPosJsonValue("settlement_type").toInt();
if(finalType == 0) //支付结算
{
serverReqJsonObj["reqType"] = FM_Final;
}
else if(finalType == 1) //退款结算
{
serverReqJsonObj["reqType"] = 1010;
}
serverReqJsonObj["t"] = QString::number(QDateTime::currentMSecsSinceEpoch());
serverReqJsonObj["sign"] = sign();
} }
bool TaskFinal::sendToServer(bool isShowMsg) bool TaskFinal::sendToServer(bool isShowMsg)
{ {
FMP_DEBUG() << __FUNCTION__; Q_UNUSED(isShowMsg);
packageServerReq(); FMTask::sendToServer(false);
QJsonDocument json(serverReqJsonObj);
QByteArray data = json.toJson(QJsonDocument::Compact);
url = FMPVipSettings::instance()->getServerUrl() + "/order";
QByteArray rspData;
FMNetwork net;
net.send(url, data, rspData);
QJsonParseError jsonErr;
QJsonDocument rspJson = QJsonDocument::fromJson(rspData, &jsonErr);
// 网络错误
if(net.error != FM_API_SUCCESS) {
setError(net.error, net.errorMsg);
serverRspJsonObj = rspJson.object();
} else {
// Json错误
if(jsonErr.error != QJsonParseError::NoError) {
setError(FM_API_BADJSON);
FMP_ERROR() << "Unknown data: " << rspData;
} else {
serverRspJsonObj = rspJson.object();
// 服务器返回的错误
if(serverRspJsonObj.contains("errcode")) {
setError(FM_API_SERVERERROR, serverRspJsonObj["errcode"].toInt(), serverRspJsonObj["errmsg"].toString());
}
}
}
FMP_INFO() << "Server rsponse: " << serverRspJsonObj;
// 备份 // 备份
if(error() == FM_API_NETWORERROR) { if(error() == FM_API_NETWORERROR) {
...@@ -191,70 +130,3 @@ QString TaskFinal::backup() ...@@ -191,70 +130,3 @@ QString TaskFinal::backup()
} }
return ""; return "";
} }
QJsonValue TaskFinal::searchJsonValue(QJsonObject &searchJson, QString searchKey)
{
if(searchJson.contains(searchKey)) {
return searchJson[searchKey];
} else {
qDebug() << searchJson.keys();
foreach(QString key , searchJson.keys()) {
if(searchJson[key].isObject()) {
QJsonObject ob = searchJson[key].toObject();
QJsonValue value = searchJsonValue(ob, searchKey);
if(!value.isNull()){
return value;
}
}
}
}
return QJsonValue();
}
QJsonValue TaskFinal::getServerJsonValue(const QString prop)
{
return searchJsonValue(serverRspJsonObj, prop);
}
QJsonValue TaskFinal::getPosJsonValue(const QString prop)
{
return searchJsonValue(posReqJsonObj, prop);
}
QString TaskFinal::sign() const
{
FMP_DEBUG() << __FUNCTION__;
// 解析JSON插入MAP中按字典排序
QMap<QString, QString> mapData;
for(int i=0; i<sizeof(SignProps)/sizeof(SignProps[0]); ++i) {
QString word = SignProps[i];
if(serverReqJsonObj[word].isDouble()) {
mapData[word] = QString::number(serverReqJsonObj[word].toDouble());
} else {
mapData[word] = serverReqJsonObj[word].toString();
}
}
if (serverRspJsonObj[ServerProps(PosProps.Fm_cmd)].toInt() == FM_Fund) {
mapData[ServerProps(PosProps.TransId)] = serverReqJsonObj[ServerProps(PosProps.TransId)].toString();
}
// 使用URL键值对的格式拼接
QString sb = "";
foreach(QString key , mapData.keys())
{
sb += (key + "=" + mapData.value(key) + "&");
}
sb.remove(sb.length() - 1, 1); // 去掉最后一个&
sb.append(KEY_CODE);
QByteArray bt;
bt.append(sb);
FMP_INFO() << "Sign String: " << bt;
QByteArray md5Bt = QCryptographicHash::hash(bt, QCryptographicHash::Md5);
return md5Bt.toHex();
}
#ifndef TASKFINAL_H #ifndef TASKFINAL_H
#define TASKFINAL_H #define TASKFINAL_H
#include <QObject> #include "fmtasknownd.h"
#include <QJsonObject>
#include "session.h"
class TaskFinal : public QObject class TaskFinal : public FMTaskNoWnd
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit TaskFinal(QJsonObject &jsonObj, Session *session = 0, QObject *parent = 0); explicit TaskFinal(QJsonObject &jsonObj, Session *session = 0, QObject *parent = 0);
QByteArray doTask();
void setFM_Type(const FM_TYPE fmType) {_FM_Type = fmType;}
FM_TYPE FM_Type() const { return _FM_Type;}
Session* session() const {return _session;}
void packageServerReq(); void packageServerReq();
bool sendToServer(bool isShowMsg = true); bool sendToServer(bool isShowMsg = true);
void packagePOSRsp(); void packagePOSRsp();
QJsonValue searchJsonValue(QJsonObject &searchJson, QString searchKey);
QJsonValue getServerJsonValue(const QString prop);
QJsonValue getPosJsonValue(const QString prop);
private: private:
QString backup(); QString backup();
QString sign() const;
QJsonObject posReqJsonObj;
QJsonObject posRspJsonObj;
QJsonObject serverReqJsonObj;
QJsonObject serverRspJsonObj;
Session *_session;
FM_TYPE _FM_Type;
QString url;
/**
* @brief FMError
* define error.
*/
typedef int FMError;
public:
FMError error() const {return _error;}
void setError(const FMError error)
{ _error = error; _errorMsg = "";}
void setError(const FMError error, const QString errorMsg)
{ _error = error; _errorMsg = errorMsg;}
void setError(const FMError error, const int errorCode, const QString errorMsg)
{ _error = error; _errorMsg = QString("[%1]%2").arg(errorCode).arg(errorMsg);}
QString errorString() {
if(fm_error.find(_error) == fm_error.end()) {
return "Undefine Error";
} else {
if(_errorMsg != "")
return _errorMsg;
return fm_error.at(_error);
}
}
private:
FMError _error;
QString _errorMsg;
}; };
#endif // TASKFINAL_H #endif // TASKFINAL_H
...@@ -3,23 +3,10 @@ ...@@ -3,23 +3,10 @@
#include "fmp_vip_settings.h" #include "fmp_vip_settings.h"
#include "fmnetwork.h" #include "fmnetwork.h"
#include <QJsonDocument> #include <QJsonDocument>
#include <QCryptographicHash>
#define RunFunction(function) do { \
function##(); \
if(error() != FM_API_SUCCESS) { \
FMP_WARN() << QString("Task error %1: %2").arg(error()).arg(errorString()); \
return QString(ErrorMsgJson).arg(error()).arg(errorString()).toLatin1(); \
} \
} while(0);
TaskLogin::TaskLogin(QJsonObject &jsonObj, Session *session, QObject *parent) TaskLogin::TaskLogin(QJsonObject &jsonObj, Session *session, QObject *parent)
:QObject(parent) :FMTask(jsonObj, FM_Login, session, parent)
{ {
posReqJsonObj = jsonObj;
_window = NULL;
_session = session;
_error = FM_API_SUCCESS;
} }
TaskLogin::~TaskLogin() TaskLogin::~TaskLogin()
...@@ -27,17 +14,6 @@ TaskLogin::~TaskLogin() ...@@ -27,17 +14,6 @@ TaskLogin::~TaskLogin()
del_p(_window); del_p(_window);
} }
QByteArray TaskLogin::doTask()
{
FMP_DEBUG() << __FUNCTION__;
RunFunction(setWindow);
RunFunction(showWindow);
RunFunction(packagePOSRsp);
QJsonDocument json(posRspJsonObj);
return json.toJson(QJsonDocument::Compact);
}
void TaskLogin::setWindow() void TaskLogin::setWindow()
{ {
_window = new FMVipLogin; _window = new FMVipLogin;
...@@ -49,112 +25,11 @@ void TaskLogin::setWindow() ...@@ -49,112 +25,11 @@ void TaskLogin::setWindow()
session()->addData("business_date", getPosJsonValue("business_date")); session()->addData("business_date", getPosJsonValue("business_date"));
} }
void TaskLogin::showWindow()
{
FMP_DEBUG() << __FUNCTION__;
if(_window != nullptr) {
_window->initWnd(session());
int ret = _window->exec();
if(ret == -1) {
setError(FM_API_WINDOWCLOSE);
}
}
}
QJsonValue TaskLogin::searchJsonValue(QJsonObject &searchJson, QString searchKey)
{
if(searchJson.contains(searchKey)) {
return searchJson[searchKey];
} else {
qDebug() << searchJson.keys();
foreach(QString key , searchJson.keys()) {
if(searchJson[key].isObject()) {
QJsonObject ob = searchJson[key].toObject();
QJsonValue value = searchJsonValue(ob, searchKey);
if(!value.isNull()){
return value;
}
}
}
}
return QJsonValue();
}
QJsonValue TaskLogin::getServerJsonValue(const QString prop)
{
return searchJsonValue(serverRspJsonObj, prop);
}
QJsonValue TaskLogin::getPosJsonValue(const QString prop)
{
return searchJsonValue(posReqJsonObj, prop);
}
void TaskLogin::packageServerReq() void TaskLogin::packageServerReq()
{ {
serverReqJsonObj["appId"] = APP_ID;
serverReqJsonObj["reqType"] = FM_Login;
serverReqJsonObj["stationId"] = getPosJsonValue("pos_id");
serverReqJsonObj["storeId"] = getPosJsonValue("store_id");
serverReqJsonObj["operatorId"] = getPosJsonValue("operator_id");
serverReqJsonObj["partnerId"] = PARTNER_ID;
QJsonObject code; QJsonObject code;
code["code"] = session()->data("code").toString(); code["code"] = session()->data("code").toString();
serverReqJsonObj["data"] = code; serverReqJsonObj["data"] = code;
serverReqJsonObj["t"] = QString::number(QDateTime::currentMSecsSinceEpoch());
serverReqJsonObj["sign"] = sign();
}
bool TaskLogin::sendToServer(bool isShowMsg)
{
FMP_DEBUG() << __FUNCTION__;
packageServerReq();
QJsonDocument json(serverReqJsonObj);
QByteArray data = json.toJson(QJsonDocument::Compact);
url = FMPVipSettings::instance()->getServerUrl() + "/auth";
QByteArray rspData;
FMNetwork net;
net.send(url, data, rspData);
QJsonParseError jsonErr;
QJsonDocument rspJson = QJsonDocument::fromJson(rspData, &jsonErr);
// 网络错误
if(net.error != FM_API_SUCCESS) {
setError(net.error, net.errorMsg);
serverRspJsonObj = rspJson.object();
} else {
// Json错误
if(jsonErr.error != QJsonParseError::NoError) {
setError(FM_API_BADJSON);
FMP_ERROR() << "Unknown data: " << rspData;
} else {
serverRspJsonObj = rspJson.object();
// 服务器返回的错误
if(serverRspJsonObj.contains("errcode")) {
setError(FM_API_SERVERERROR, serverRspJsonObj["errcode"].toInt(), serverRspJsonObj["errmsg"].toString());
}
}
}
FMP_INFO() << "Server rsponse: " << serverRspJsonObj;
if(_window != nullptr) {
_window->setIsBusy(false);
}
bool isOk = (error() == FM_API_SUCCESS);
if(!isOk && isShowMsg)
{
FMMsgWnd::FailureWnd(errorString(), _window);
}
return isOk;
} }
void TaskLogin::packagePOSRsp() void TaskLogin::packagePOSRsp()
...@@ -194,51 +69,20 @@ void TaskLogin::onLogin() ...@@ -194,51 +69,20 @@ void TaskLogin::onLogin()
} }
// 认证成功 // 认证成功
else { else {
QString account = getServerJsonValue("account").toString(); QString account = getServerJsonValue(PosProps.Fm_open_id).toString();
QString birthday = getServerJsonValue("birthday").toString(); QString birthday = getServerJsonValue(PosProps.Birthday).toString();
QString name = getServerJsonValue("name").toString(); QString name = getServerJsonValue(PosProps.Name).toString();
FMMsgWnd::LoginSuccess(account, name, birthday, _window); FMMsgWnd::LoginSuccess(account, name, birthday, _window);
session()->addData(PosProps.Name, name);
session()->addData(PosProps.Amount, getServerJsonValue(PosProps.Amount).toInt());
session()->addData(PosProps.Birthday, birthday);
session()->addData(PosProps.Fm_open_id, account);
session()->addData(PosProps.Score, getServerJsonValue(PosProps.Score).toInt());
_window->close(); _window->close();
} }
if(_window!=nullptr) { if(_window!=nullptr) {
_window->resetWnd(); _window->resetWnd();
} }
} }
QString TaskLogin::sign() const
{
FMP_DEBUG() << __FUNCTION__;
// 解析JSON插入MAP中按字典排序
QMap<QString, QString> mapData;
for(int i=0; i<sizeof(SignProps)/sizeof(SignProps[0]); ++i) {
QString word = SignProps[i];
if(serverReqJsonObj[word].isDouble()) {
mapData[word] = QString::number(serverReqJsonObj[word].toDouble());
} else {
mapData[word] = serverReqJsonObj[word].toString();
}
}
if (serverRspJsonObj[ServerProps(PosProps.Fm_cmd)].toInt() == FM_Fund) {
mapData[ServerProps(PosProps.TransId)] = serverReqJsonObj[ServerProps(PosProps.TransId)].toString();
}
// 使用URL键值对的格式拼接
QString sb = "";
foreach(QString key , mapData.keys())
{
sb += (key + "=" + mapData.value(key) + "&");
}
sb.remove(sb.length() - 1, 1); // 去掉最后一个&
sb.append(KEY_CODE);
QByteArray bt;
bt.append(sb);
FMP_INFO() << "Sign String: " << bt;
QByteArray md5Bt = QCryptographicHash::hash(bt, QCryptographicHash::Md5);
return md5Bt.toHex();
}
#ifndef TASKLOGIN_H #ifndef TASKLOGIN_H
#define TASKLOGIN_H #define TASKLOGIN_H
#include "fmtask.h" #include "fmtask.h"
#include <QObject>
#include <QJsonObject>
class TaskLogin : public QObject class TaskLogin : public FMTask
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit TaskLogin(QJsonObject &jsonObj, Session* session = 0, QObject* parent=0); explicit TaskLogin(QJsonObject &jsonObj, Session* session = 0, QObject* parent=0);
~TaskLogin(); ~TaskLogin();
QByteArray doTask();
Session* session() const {return _session;}
QJsonValue searchJsonValue(QJsonObject &searchJson, QString searchKey);
QJsonValue getServerJsonValue(const QString prop);
QJsonValue getPosJsonValue(const QString prop);
private: private:
void setWindow(); void setWindow() override;
void showWindow();
void packageServerReq(); void packageServerReq();
bool sendToServer(bool isShowMsg = true);
void packagePOSRsp(); void packagePOSRsp();
public slots: public slots:
void onLogin(); void onLogin();
private:
QString sign() const;
private:
QJsonObject posReqJsonObj; //pos发来的请求数据
QJsonObject posRspJsonObj; //返回给pos的数据
QJsonObject serverReqJsonObj; //发送给server端的请求数据
QJsonObject serverRspJsonObj; //server返回的数据
FMVipWnd *_window;
Session *_session;
QString url; //server url
/**
* @brief FMError
* define error.
*/
typedef int FMError;
public:
FMError error() const {return _error;}
void setError(const FMError error)
{ _error = error; _errorMsg = "";}
void setError(const FMError error, const QString errorMsg)
{ _error = error; _errorMsg = errorMsg;}
void setError(const FMError error, const int errorCode, const QString errorMsg)
{ _error = error; _errorMsg = QString("[%1]%2").arg(errorCode).arg(errorMsg);}
QString errorString() {
if(fm_error.find(_error) == fm_error.end()) {
return "Undefine Error";
} else {
if(_errorMsg != "")
return _errorMsg;
return fm_error.at(_error);
}
}
private:
FMError _error;
QString _errorMsg;
}; };
#endif // TASKLOGIN_H #endif // TASKLOGIN_H
\ No newline at end of file
...@@ -6,27 +6,19 @@ ...@@ -6,27 +6,19 @@
#include <fmp_logger_i.h> #include <fmp_logger_i.h>
TaskRefundPay::TaskRefundPay(QJsonObject &jsonObj, QObject *parent) TaskRefundPay::TaskRefundPay(QJsonObject &jsonObj, QObject *parent)
:FMTaskNoWnd(jsonObj, FM_Order_Revoke, 0, parent) :FMTaskNoWnd(jsonObj, FM_Refund_Pay, 0, parent)
{ {
} }
void TaskRefundPay::packageServerReq() void TaskRefundPay::packageServerReq()
{ {
// 固定部分
serverReqJsonObj[PosProps.AppId] = APP_ID;
serverReqJsonObj[PosProps.PartnerId] = PARTNER_ID;
serverReqJsonObj[ServerProps(PosProps.Fm_cmd)] = FM_Type();
QJsonArray transIds; QJsonArray transIds;
transIds.append(getPosJsonValue(PosProps.TransId)); transIds.append(getPosJsonValue(PosProps.TransId));
QJsonObject transData; QJsonObject transData;
transData["transIds"] = transIds; transData["transIds"] = transIds;
serverReqJsonObj["data"] = transData; serverReqJsonObj["data"] = transData;
serverReqJsonObj["t"] = QString::number(QDateTime::currentMSecsSinceEpoch());
serverReqJsonObj["sign"] = sign();
} }
void TaskRefundPay::packagePOSRsp() void TaskRefundPay::packagePOSRsp()
...@@ -40,74 +32,17 @@ void TaskRefundPay::packagePOSRsp() ...@@ -40,74 +32,17 @@ void TaskRefundPay::packagePOSRsp()
posRspJsonObj[PosProps.Prompt] = 1; posRspJsonObj[PosProps.Prompt] = 1;
} }
bool TaskRefundPay::sendToServer(bool isShowMsg)
{
FMP_DEBUG() << __FUNCTION__;
packageServerReq();
QJsonDocument json(serverReqJsonObj);
QByteArray data = json.toJson(QJsonDocument::Compact);
url = FMPVipSettings::instance()->getServerUrl() + "/refund";
QByteArray rspData;
FMNetwork net;
net.send(url, data, rspData);
QJsonParseError jsonErr;
QJsonDocument rspJson = QJsonDocument::fromJson(rspData, &jsonErr);
// 网络错误
if(net.error != FM_API_SUCCESS) {
setError(net.error, net.errorMsg);
serverRspJsonObj = rspJson.object();
} else {
// Json错误
if(jsonErr.error != QJsonParseError::NoError) {
setError(FM_API_BADJSON);
FMP_ERROR() << "Unknown data: " << rspData;
} else {
serverRspJsonObj = rspJson.object();
// 服务器返回的错误
if(serverRspJsonObj.contains("errcode")) {
setError(FM_API_SERVERERROR, serverRspJsonObj["errcode"].toInt(), serverRspJsonObj["errmsg"].toString());
}
}
}
FMP_INFO() << "Server rsponse: " << serverRspJsonObj;
if(_window != nullptr) {
_window->setIsBusy(false);
}
bool isOk = (error() == FM_API_SUCCESS);
if(!isOk && isShowMsg)
{
FMMsgWnd::FailureWnd(errorString(), _window);
}
return isOk;
}
TaskRefundOrder::TaskRefundOrder(QJsonObject &jsonObj, QObject *parent) TaskRefundOrder::TaskRefundOrder(QJsonObject &jsonObj, QObject *parent)
:FMTaskNoWnd(jsonObj, FM_Order_Refund, 0, parent) :FMTaskNoWnd(jsonObj, FM_Refund_Order, 0, parent)
{ {
} }
void TaskRefundOrder::packageServerReq() void TaskRefundOrder::packageServerReq()
{ {
serverReqJsonObj[PosProps.AppId] = APP_ID;
serverReqJsonObj[PosProps.PartnerId] = PARTNER_ID;
serverReqJsonObj[ServerProps(PosProps.Fm_cmd)] = FM_Type();
QJsonObject transData; QJsonObject transData;
transData["memberTransId"] = getPosJsonValue(PosProps.Fm_id); transData[ServerProps(PosProps.Fm_id)] = getPosJsonValue(PosProps.Fm_id);
serverReqJsonObj["data"] = transData; serverReqJsonObj["data"] = transData;
serverReqJsonObj["t"] = QString::number(QDateTime::currentMSecsSinceEpoch());
serverReqJsonObj["sign"] = sign();
} }
void TaskRefundOrder::packagePOSRsp() void TaskRefundOrder::packagePOSRsp()
...@@ -120,54 +55,3 @@ void TaskRefundOrder::packagePOSRsp() ...@@ -120,54 +55,3 @@ void TaskRefundOrder::packagePOSRsp()
} }
posRspJsonObj[PosProps.Prompt] = 1; posRspJsonObj[PosProps.Prompt] = 1;
} }
bool TaskRefundOrder::sendToServer(bool isShowMsg)
{
FMP_DEBUG() << __FUNCTION__;
packageServerReq();
QJsonDocument json(serverReqJsonObj);
QByteArray data = json.toJson(QJsonDocument::Compact);
url = FMPVipSettings::instance()->getServerUrl() + "/correct";
QByteArray rspData;
FMNetwork net;
net.send(url, data, rspData);
QJsonParseError jsonErr;
QJsonDocument rspJson = QJsonDocument::fromJson(rspData, &jsonErr);
// 网络错误
if(net.error != FM_API_SUCCESS) {
setError(net.error, net.errorMsg);
serverRspJsonObj = rspJson.object();
} else {
// Json错误
if(jsonErr.error != QJsonParseError::NoError) {
setError(FM_API_BADJSON);
FMP_ERROR() << "Unknown data: " << rspData;
} else {
serverRspJsonObj = rspJson.object();
// 服务器返回的错误
if(serverRspJsonObj.contains("errcode")) {
setError(FM_API_SERVERERROR, serverRspJsonObj["errcode"].toInt(), serverRspJsonObj["errmsg"].toString());
}
}
}
FMP_INFO() << "Server rsponse: " << serverRspJsonObj;
if(_window != nullptr) {
_window->setIsBusy(false);
}
bool isOk = (error() == FM_API_SUCCESS);
if(!isOk && isShowMsg)
{
FMMsgWnd::FailureWnd(errorString(), _window);
}
return isOk;
}
...@@ -11,7 +11,6 @@ public: ...@@ -11,7 +11,6 @@ public:
explicit TaskRefundPay(QJsonObject &jsonObj, QObject *parent = 0); explicit TaskRefundPay(QJsonObject &jsonObj, QObject *parent = 0);
void packageServerReq(); void packageServerReq();
void packagePOSRsp(); void packagePOSRsp();
bool sendToServer(bool isShowMsg);
}; };
// 整单退款 // 整单退款
...@@ -22,7 +21,5 @@ public: ...@@ -22,7 +21,5 @@ public:
explicit TaskRefundOrder(QJsonObject &jsonObj, QObject *parent = 0); explicit TaskRefundOrder(QJsonObject &jsonObj, QObject *parent = 0);
void packageServerReq(); void packageServerReq();
void packagePOSRsp(); void packagePOSRsp();
bool sendToServer(bool isShowMsg);
}; };
#endif // TASKOTHERS_H #endif // TASKOTHERS_H
...@@ -3,67 +3,20 @@ ...@@ -3,67 +3,20 @@
#include "fmtask.h" #include "fmtask.h"
#include "taskcoupon.h" #include "taskcoupon.h"
class TaskPay : public QObject class TaskPay : public FMTask
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit TaskPay(QJsonObject &jsonObj, Session *session = 0, QObject *parent = 0); explicit TaskPay(QJsonObject &jsonObj, Session *session = 0, QObject *parent = 0);
~TaskPay(); ~TaskPay();
QByteArray doTask(); QByteArray doTask();
QByteArray queryMemberInfo();
void setWindow(); void setWindow();
void showWindow();
void packageServerReq(); void packageServerReq();
bool sendToServer(bool isShowMsg = true);
void packagePOSRsp(); void packagePOSRsp();
Session* session() const {return _session;}
QJsonValue searchJsonValue(QJsonObject &searchJson, QString searchKey);
QJsonValue getServerJsonValue(const QString prop);
QJsonValue getPosJsonValue(const QString prop);
private slots: private slots:
void onPay(); void onPay();
private:
QJsonObject posReqJsonObj;
QJsonObject posRspJsonObj;
QJsonObject serverReqJsonObj;
QJsonObject serverRspJsonObj;
FMVipWnd *_window;
Session *_session;
QString url;
private:
QString sign() const;
/**
* @brief FMError
* define error.
*/
typedef int FMError;
public:
FMError error() const {return _error;}
void setError(const FMError error)
{ _error = error; _errorMsg = "";}
void setError(const FMError error, const QString errorMsg)
{ _error = error; _errorMsg = errorMsg;}
void setError(const FMError error, const int errorCode, const QString errorMsg)
{ _error = error; _errorMsg = QString("[%1]%2").arg(errorCode).arg(errorMsg);}
QString errorString() {
if(fm_error.find(_error) == fm_error.end()) {
return "Undefine Error";
} else {
if(_errorMsg != "")
return _errorMsg;
return fm_error.at(_error);
}
}
private:
FMError _error;
QString _errorMsg;
}; };
#endif // TASKPAY_H #endif // TASKPAY_H
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