Commit 8c7406ea by NitefullWind

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

parent 6c341fa9
......@@ -64,16 +64,22 @@ void FMVipDispatcher::doTask(const QByteArray &reqData, QByteArray &rspData)
}
break;
}
case FM_Order_Refund: {
TaskRefundOrder taskRefundOrder(jsonObj);
rspData = taskRefundOrder.doTask();
break;
}
case FM_Order_Revoke: {
TaskRefundPay taskRefundPay(jsonObj);
rspData = taskRefundPay.doTask();
case FM_Refund: {
QString fm_id = jsonObj[PosProps.Transaction].toObject()[PosProps.Fm_id].toString();
if(fm_id != "") {
TaskRefundOrder taskRefundOrder(jsonObj);
rspData = taskRefundOrder.doTask();
} else {
TaskRefundPay taskRefundPay(jsonObj);
rspData = taskRefundPay.doTask();
}
break;
}
// case FM_Order_Revoke: {
// TaskRefundPay taskRefundPay(jsonObj);
// rspData = taskRefundPay.doTask();
// break;
// }
case FM_QR_Refund: {
if (_ctx) {
ctkServiceReference ref =_ctx->getServiceReference<FMPePayInterface>();
......
......@@ -21,15 +21,30 @@
enum FM_TYPE {
FM_Login = 1001,
FM_Pay = 1003,
FM_Order_Refund,
FM_Charge_Refund,
FM_Refund = 1004,
FM_Final = 1007,
FM_Coupon = 1009,
FM_Fund,
FM_Order_Revoke,
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数据各字段名称
#ifndef POSPROPS
......@@ -40,6 +55,7 @@ struct PP{
AppId = "appId";
PartnerId = "partnerId";
T = "t";
Sign = "sign";
StoreId = "store_id";
PosId = "pos_id";
OperatorId = "operator_id";
......@@ -74,7 +90,7 @@ struct PP{
ScoreAmount = "scoreAmount";
IsUseScore = "isUseScore";
Coupons = "coupons";
Transaction = "transaction";
Transaction = "transactions";
OrderAmount = "order_amount";
PaidAmount = "paid_amount";
NeedAmount = "need_amount";
......@@ -113,6 +129,7 @@ struct PP{
QString AppId ;
QString PartnerId ;
QString T ;
QString Sign ;
QString StoreId ;
QString PosId ;
QString OperatorId ;
......@@ -201,13 +218,18 @@ const PropsMap::value_type PropsMapPairs[] =
PropsMap::value_type(PosProps.StoreId, "storeId"),
PropsMap::value_type(PosProps.PosId, "stationId"),
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.Coupon, "couponCode"),
PropsMap::value_type(PosProps.BussinessDate,"businessDate"),
PropsMap::value_type(PosProps.Fm_open_id, "account"),
PropsMap::value_type(PosProps.Account, "memberNo"),
PropsMap::value_type(PosProps.CouponList, "coupon_list")
PropsMap::value_type(PosProps.Fm_id, "memberTransId"),
PropsMap::value_type(PosProps.Fm_open_id, "account"),
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])));
......
......@@ -107,13 +107,14 @@ bool FMTask::sendToServer(bool isShowMsg)
serverReqJsonObj[PosProps.PartnerId] = PARTNER_ID;
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();
QJsonDocument json(serverReqJsonObj);
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;
FMNetwork net;
......
......@@ -23,41 +23,3 @@ QByteArray FMTaskNoWnd::doTask()
QJsonDocument json(posRspJsonObj);
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:
protected:
virtual void packageServerReq() = 0;
virtual void packagePOSRsp() = 0;
QString sign() const;
};
#endif // FMTASKNOWND_H
......@@ -10,40 +10,24 @@
#include <QCryptographicHash>
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()
{
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;
transData["businessDate"] = getPosJsonValue("business_date");
transData["transId"] = getPosJsonValue("trans_id");
transData["memberTransId"] = getPosJsonValue("fm_id");
transData["account"] = getPosJsonValue("fm_open_id");
transData["totalAmount"] = getPosJsonValue("order_amount");
transData["payAmount"] = getPosJsonValue("paid_amount");
std::vector<QString> p;
p.push_back(PosProps.BussinessDate);
p.push_back(PosProps.TransId);
p.push_back(PosProps.Fm_id);
p.push_back(PosProps.Fm_open_id);
p.push_back(PosProps.OrderAmount);
p.push_back(PosProps.PaidAmount);
foreach(auto prop , p) {
transData[ServerProps(prop)] = getPosJsonValue(prop);
}
// 产品列表
QJsonArray products;
foreach(auto p , getPosJsonValue("products").toArray())
......@@ -91,57 +75,12 @@ void TaskFinal::packageServerReq()
}
transData["payList"] = payList;
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)
{
FMP_DEBUG() << __FUNCTION__;
packageServerReq();
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;
Q_UNUSED(isShowMsg);
FMTask::sendToServer(false);
// 备份
if(error() == FM_API_NETWORERROR) {
......@@ -191,70 +130,3 @@ QString TaskFinal::backup()
}
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
#define TASKFINAL_H
#include <QObject>
#include <QJsonObject>
#include "session.h"
#include "fmtasknownd.h"
class TaskFinal : public QObject
class TaskFinal : public FMTaskNoWnd
{
Q_OBJECT
public:
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();
bool sendToServer(bool isShowMsg = true);
void packagePOSRsp();
QJsonValue searchJsonValue(QJsonObject &searchJson, QString searchKey);
QJsonValue getServerJsonValue(const QString prop);
QJsonValue getPosJsonValue(const QString prop);
private:
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
......@@ -3,23 +3,10 @@
#include "fmp_vip_settings.h"
#include "fmnetwork.h"
#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)
:QObject(parent)
:FMTask(jsonObj, FM_Login, session, parent)
{
posReqJsonObj = jsonObj;
_window = NULL;
_session = session;
_error = FM_API_SUCCESS;
}
TaskLogin::~TaskLogin()
......@@ -27,17 +14,6 @@ TaskLogin::~TaskLogin()
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()
{
_window = new FMVipLogin;
......@@ -49,112 +25,11 @@ void TaskLogin::setWindow()
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()
{
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;
code["code"] = session()->data("code").toString();
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()
......@@ -194,51 +69,20 @@ void TaskLogin::onLogin()
}
// 认证成功
else {
QString account = getServerJsonValue("account").toString();
QString birthday = getServerJsonValue("birthday").toString();
QString name = getServerJsonValue("name").toString();
QString account = getServerJsonValue(PosProps.Fm_open_id).toString();
QString birthday = getServerJsonValue(PosProps.Birthday).toString();
QString name = getServerJsonValue(PosProps.Name).toString();
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();
}
if(_window!=nullptr) {
_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
#define TASKLOGIN_H
#include "fmtask.h"
#include <QObject>
#include <QJsonObject>
class TaskLogin : public QObject
class TaskLogin : public FMTask
{
Q_OBJECT
public:
explicit TaskLogin(QJsonObject &jsonObj, Session* session = 0, QObject* parent=0);
~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:
void setWindow();
void showWindow();
void setWindow() override;
void packageServerReq();
bool sendToServer(bool isShowMsg = true);
void packagePOSRsp();
public slots:
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
\ No newline at end of file
#endif // TASKLOGIN_H
......@@ -6,27 +6,19 @@
#include <fmp_logger_i.h>
TaskRefundPay::TaskRefundPay(QJsonObject &jsonObj, QObject *parent)
:FMTaskNoWnd(jsonObj, FM_Order_Revoke, 0, parent)
:FMTaskNoWnd(jsonObj, FM_Refund_Pay, 0, parent)
{
}
void TaskRefundPay::packageServerReq()
{
// 固定部分
serverReqJsonObj[PosProps.AppId] = APP_ID;
serverReqJsonObj[PosProps.PartnerId] = PARTNER_ID;
serverReqJsonObj[ServerProps(PosProps.Fm_cmd)] = FM_Type();
QJsonArray transIds;
transIds.append(getPosJsonValue(PosProps.TransId));
QJsonObject transData;
transData["transIds"] = transIds;
serverReqJsonObj["data"] = transData;
serverReqJsonObj["t"] = QString::number(QDateTime::currentMSecsSinceEpoch());
serverReqJsonObj["sign"] = sign();
}
void TaskRefundPay::packagePOSRsp()
......@@ -40,74 +32,17 @@ void TaskRefundPay::packagePOSRsp()
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)
:FMTaskNoWnd(jsonObj, FM_Order_Refund, 0, parent)
:FMTaskNoWnd(jsonObj, FM_Refund_Order, 0, parent)
{
}
void TaskRefundOrder::packageServerReq()
{
serverReqJsonObj[PosProps.AppId] = APP_ID;
serverReqJsonObj[PosProps.PartnerId] = PARTNER_ID;
serverReqJsonObj[ServerProps(PosProps.Fm_cmd)] = FM_Type();
QJsonObject transData;
transData["memberTransId"] = getPosJsonValue(PosProps.Fm_id);
transData[ServerProps(PosProps.Fm_id)] = getPosJsonValue(PosProps.Fm_id);
serverReqJsonObj["data"] = transData;
serverReqJsonObj["t"] = QString::number(QDateTime::currentMSecsSinceEpoch());
serverReqJsonObj["sign"] = sign();
}
void TaskRefundOrder::packagePOSRsp()
......@@ -120,54 +55,3 @@ void TaskRefundOrder::packagePOSRsp()
}
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:
explicit TaskRefundPay(QJsonObject &jsonObj, QObject *parent = 0);
void packageServerReq();
void packagePOSRsp();
bool sendToServer(bool isShowMsg);
};
// 整单退款
......@@ -22,7 +21,5 @@ public:
explicit TaskRefundOrder(QJsonObject &jsonObj, QObject *parent = 0);
void packageServerReq();
void packagePOSRsp();
bool sendToServer(bool isShowMsg);
};
#endif // TASKOTHERS_H
......@@ -9,21 +9,9 @@
#include <QJsonObject>
#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);
TaskPay::TaskPay(QJsonObject &jsonObj, Session *session, QObject *parent)
:QObject(parent)
:FMTask(jsonObj, FM_Pay, session, parent)
{
posReqJsonObj = jsonObj;
_window = nullptr;
_session = session;
_error = FM_API_SUCCESS;
}
TaskPay::~TaskPay()
......@@ -41,134 +29,37 @@ QByteArray TaskPay::doTask()
// {
// return ret;
// }
//查询余额和积分
QByteArray ret = queryMemberInfo();
if(error() != FM_API_SUCCESS)
{
return ret;
}
//保存到session,用于界面显示
session()->addData("amount", getServerJsonValue("amount"));
session()->addData("score", getServerJsonValue("score"));
session()->addData("name", getServerJsonValue("name"));
//清空相应json对象
QStringList keys = serverReqJsonObj.keys();
foreach (QString key, keys)
{
serverReqJsonObj.remove(key);
}
keys = serverRspJsonObj.keys();
foreach(QString key, keys)
{
serverRspJsonObj.remove(key);
}
RunFunction(setWindow);
RunFunction(showWindow);
RunFunction(packagePOSRsp);
QJsonDocument json(posRspJsonObj);
return json.toJson(QJsonDocument::Compact);
}
QByteArray TaskPay::queryMemberInfo()
{
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;
code["code"] = getPosJsonValue("fm_open_id");
serverReqJsonObj["data"] = code;
serverReqJsonObj["t"] = QString::number(QDateTime::currentMSecsSinceEpoch());
serverReqJsonObj["sign"] = sign();
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());
}
}
preTask = new TaskLogin(posReqJsonObj, _session, this);
preTask->session()->addData(PosProps.FM_Type, FM_Pay);
QByteArray loginRst = preTask->doTask();
if(preTask->error() != FM_API_SUCCESS) {
return loginRst;
}
this->_session = preTask->session();
FMP_INFO() << "Server rsponse: " << serverRspJsonObj;
return rspData;
return FMTask::doTask();
}
void TaskPay::setWindow()
{
_window = new FMVipOrder;
session()->addData("operator_id", getPosJsonValue("operator_id").toString());
session()->addData("order_amount", getPosJsonValue("order_amount").toInt());
session()->addData("store_id", getPosJsonValue("store_id").toString());
session()->addData("pos_id", getPosJsonValue("pos_id").toString());
session()->addData("pay_amount", getPosJsonValue("order_amount").toInt() - getPosJsonValue("paid_amount").toInt());
session()->addData("business_date", getPosJsonValue("business_date").toString());
session()->addData("fm_open_id", getPosJsonValue("fm_open_id").toString());
session()->addData("products", getPosJsonValue("products").toArray());
connect(qobject_cast<FMVipOrder*>(_window), SIGNAL(pay()), this, SLOT(onPay()));
}
void TaskPay::showWindow()
{
FMP_DEBUG() << __FUNCTION__;
if(_window != nullptr) {
_window->initWnd(this->session());
int ret = _window->exec();
if(ret == -1) {
setError(FM_API_WINDOWCLOSE);
}
}
}
void TaskPay::packageServerReq()
{
serverReqJsonObj["appId"] = APP_ID;
serverReqJsonObj["reqType"] = FM_Pay;
serverReqJsonObj["stationId"] = getPosJsonValue("pos_id");
serverReqJsonObj["storeId"] = getPosJsonValue("store_id");
serverReqJsonObj["operatorId"] = getPosJsonValue("operator_id");
serverReqJsonObj["partnerId"] = PARTNER_ID;
//! 会员新接口使用 data 打包业务数据
QJsonObject transData;
transData["transId"] = getPosJsonValue("trans_id");
transData["businessDate"] = getPosJsonValue("business_date");
transData[ServerProps(PosProps.TransId)] = getPosJsonValue(PosProps.TransId);
transData["memberTransId"] = getPosJsonValue("fm_id");
transData["account"] = getPosJsonValue("fm_open_id");
transData["payAmount"] = getPosJsonValue("order_amount").toInt() - getPosJsonValue("paid_amount").toInt();
transData["isUseScore"] = session()->data("isUseScore").toInt();
transData[ServerProps(PosProps.Fm_id)] = getPosJsonValue(PosProps.Fm_id);
transData[ServerProps(PosProps.Fm_open_id)] = session()->data(PosProps.Fm_open_id).toString();
transData[ServerProps(PosProps.IsUseScore)] = session()->data(PosProps.IsUseScore).toInt();
QJsonArray products;
QJsonArray clientArray = getPosJsonValue("products").toArray();
......@@ -182,10 +73,13 @@ void TaskPay::packageServerReq()
products.push_back(serverObj);
}
int payAmount = 0;
QJsonArray payList;
//余额支付详情
QJsonObject balance;
balance["amount"] = session()->data("codeAmount").toDouble();
int codeAmount = session()->data("codeAmount").toInt();
balance["amount"] = codeAmount;
payAmount += codeAmount;
balance["transId"] = getPosJsonValue("trans_id");
balance["typeModeFlag"] = 20001;
balance["code"] = "";
......@@ -195,7 +89,9 @@ void TaskPay::packageServerReq()
if(transData["isUseScore"].toInt())
{
QJsonObject score;
score["amount"] = session()->data("score").toInt();
int scoreAmount = session()->data("score").toInt();
score["amount"] = scoreAmount;
// payAmount += scoreAmount;
score["transId"] = getPosJsonValue("trans_id");
score["typeModeFlag"] = 20002;
score["code"] = "";
......@@ -207,7 +103,9 @@ void TaskPay::packageServerReq()
for(QMap<QString, QVariant>::const_iterator it = coupons.constBegin(); it != coupons.constEnd(); it++)
{
QJsonObject coupon;
coupon["amount"] = it.value().value<Coupon>().disAmount;
int couponAmount = it.value().value<Coupon>().disAmount;
coupon["amount"] = couponAmount;
payAmount += couponAmount;
coupon["transId"] = getPosJsonValue(PosProps.TransId);
coupon["typeModeFlag"] = it.value().value<Coupon>().typeModeFlag;
coupon["code"] = it.value().value<Coupon>().code;
......@@ -217,67 +115,18 @@ void TaskPay::packageServerReq()
transData["productList"] = products;
transData["payList"] = payList;
transData[ServerProps(PosProps.Pay_amount)] = payAmount;
serverReqJsonObj["data"] = transData;
serverReqJsonObj["t"] = QString::number(QDateTime::currentMSecsSinceEpoch());
serverReqJsonObj["sign"] = sign();
}
bool TaskPay::sendToServer(bool isShowMsg)
{
FMP_DEBUG() << __FUNCTION__;
packageServerReq();
QJsonDocument json(serverReqJsonObj);
QByteArray data = json.toJson(QJsonDocument::Compact);
url = FMPVipSettings::instance()->getServerUrl() + "/pay";
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();
}
}
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 TaskPay::packagePOSRsp()
{
posRspJsonObj[PosProps.StatusCode] = getServerJsonValue("statusCode");
posRspJsonObj[PosProps.Msg] = getServerJsonValue("msg");
posRspJsonObj[PosProps.StatusCode] = getServerJsonValue(PosProps.StatusCode);
posRspJsonObj[PosProps.Msg] = getServerJsonValue(PosProps.Msg);
posRspJsonObj[PosProps.Prompt] = 0;
posRspJsonObj[PosProps.Settlement] = 1;
posRspJsonObj[PosProps.Fm_open_id] = getServerJsonValue("account").toString();
posRspJsonObj[PosProps.Fm_id] = getServerJsonValue("memberTransId").toString();
posRspJsonObj[PosProps.Fm_open_id] = session()->data(PosProps.Fm_open_id).toString();
posRspJsonObj[PosProps.Fm_id] = getServerJsonValue(PosProps.Fm_id).toString();
QJsonArray servPayArray = getServerJsonValue("payList").toArray();
//支付方式描述
......@@ -294,16 +143,16 @@ void TaskPay::packagePOSRsp()
for(int i = 0; i < servPayArray.size(); i++)
{
QJsonObject pay_id;
pay_id["pay_id"] = servPayArray[i].toObject()["typeModeFlag"].toString();
pay_id["pay_str"] = description[servPayArray[i].toObject()["typeModeFlag"].toString()];
pay_id["pay_amount"] = servPayArray[i].toObject()["amount"].toInt();
pay_id["code"] = servPayArray[i].toObject()["code"].toString();
pay_id[PosProps.Pay_id] = servPayArray[i].toObject()[ServerProps(PosProps.Pay_id)].toString();
pay_id[PosProps.Pay_str] = description[servPayArray[i].toObject()["typeModeFlag"].toString()];
pay_id[PosProps.Pay_amount] = servPayArray[i].toObject()[ServerProps(PosProps.Pay_amount)].toInt();
pay_id[PosProps.Coupon_code] = servPayArray[i].toObject()[ServerProps(PosProps.Coupon_code)].toString();
pay_ids.push_back(pay_id);
totalPaid += pay_id["pay_amount"].toInt();
totalPaid += pay_id[PosProps.Pay_amount].toInt();
}
posRspJsonObj["paid_total_amount"] = totalPaid;
posRspJsonObj["pay_ids"] = pay_ids;
posRspJsonObj[PosProps.Paid_total_amount] = totalPaid;
posRspJsonObj[PosProps.Pay_ids] = pay_ids;
}
void TaskPay::onPay()
......@@ -311,69 +160,3 @@ void TaskPay::onPay()
sendToServer();
_window->close();
}
QJsonValue TaskPay::searchJsonValue(QJsonObject &searchJson, QString searchKey)
{
if(searchJson.contains(searchKey)) {
return searchJson[searchKey];
} else {
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 TaskPay::getServerJsonValue(const QString prop)
{
return searchJsonValue(serverRspJsonObj, prop);
}
QJsonValue TaskPay::getPosJsonValue(const QString prop)
{
return searchJsonValue(posReqJsonObj, prop);
}
QString TaskPay::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();
}
......@@ -3,67 +3,20 @@
#include "fmtask.h"
#include "taskcoupon.h"
class TaskPay : public QObject
class TaskPay : public FMTask
{
Q_OBJECT
public:
explicit TaskPay(QJsonObject &jsonObj, Session *session = 0, QObject *parent = 0);
~TaskPay();
QByteArray doTask();
QByteArray queryMemberInfo();
void setWindow();
void showWindow();
void packageServerReq();
bool sendToServer(bool isShowMsg = true);
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:
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
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