Commit a4fa15b0 by LIDINGDA\ldd

1.支付,退款基本逻辑调通

parent a646c885
...@@ -9,3 +9,9 @@ ...@@ -9,3 +9,9 @@
*/plugins/*.pdb */plugins/*.pdb
*/plugins/*.rc */plugins/*.rc
*/configuration/*.* */configuration/*.*
fmp_network/
include/interface/fmp_network_i.h
debug/bin/fmcrypt.dll
lib/fmcrypt.lib
debug/
*.rar
...@@ -7,6 +7,7 @@ SUBDIRS += fmp_manager \ ...@@ -7,6 +7,7 @@ SUBDIRS += fmp_manager \
# fmp_uiloader \ # fmp_uiloader \
fmp_syncer \ fmp_syncer \
fmp_epay \ fmp_epay \
fmp_network \
# fmp_epayview \ # fmp_epayview \
# fmp_eventadmin \ # fmp_eventadmin \
fmp_home \ fmp_home \
......
#include "fmp_database.h"
#include <QDebug>
#include <QSqlError>
#include <QSqlQuery>
#include <QVariantHash>
#include <QSqlQueryModel>
#include <fmp_logger_i.h>
FMPDataBase::FMPDataBase(QString dbname, FMPLoggerInterface *logger, QObject *parent) : QObject(parent), _logger(logger)
{
_db = QSqlDatabase::addDatabase("QSQLITE");
_db.setDatabaseName(dbname);
_isopen = _db.open();
}
FMPDataBase::~FMPDataBase()
{
if(_isopen)
_db.close();
}
bool FMPDataBase::creat(QString sql)
{
if(!_isopen)
return false;
QSqlQuery query(_db);
bool flag = query.exec(sql);
if(!flag)
FMP_WARN(_logger) << query.lastError();
return flag;
}
bool FMPDataBase::insert(QString table, QVariantHash data)
{
if(!_isopen)
return false;
QString sql;
QStringList columnnamelist;
QStringList columnvaluelist;
if(!getSql(table, data, columnnamelist, columnvaluelist))
{
_db.close();
return false;
}
QSqlQuery query(_db);
sql = QString("insert into %1 (").arg(table) + columnnamelist.join(", ") + ") values (" + columnvaluelist.join(", ") + ")";
FMP_INFO(_logger) << "inset sql : " << sql;
qDebug() << "inset sql : " << sql;
bool flag = query.exec(sql);
if(!flag)
FMP_WARN(_logger) << query.lastError();
return flag;
}
bool FMPDataBase::update(QString table, QVariantHash data, QString condition)
{
if(!_isopen)
return false;
QString sql;
if(!getSql(table, data, sql))
{
_db.close();
return false;
}
QSqlQuery query(_db);
sql = QString("update %1 set ").arg(table) + sql + " where " + condition;
FMP_INFO(_logger) << "update sql : " << sql;
bool flag = query.exec(sql);
if(!flag)
FMP_WARN(_logger) << query.lastError();
return flag;
}
bool FMPDataBase::find(QString table, QSqlQuery &query, QStringList keylist, QString condition)
{
if(!_isopen)
return false;
QSqlQuery tmpquery(_db);
QString sql = "select ";
if(keylist.size() != 0)
sql += keylist.join(", ");
else
sql += "*";
if(condition == "")
condition = "1=1";
sql += QString(" from %1 where ").arg(table) + condition;
FMP_INFO(_logger) << "find sql : " << sql;
bool flag = tmpquery.exec(sql);
if(!flag)
FMP_WARN(_logger) << tmpquery.lastError();
query = tmpquery;
return flag;
}
bool FMPDataBase::getSql(QString table, QVariantHash data, QStringList& columnnamelist, QStringList& columnvaluelist)
{
QSqlQuery query(_db);
QString tmpsql = QString("PRAGMA table_info(%1)").arg(table);
query.exec(tmpsql);
while(query.next())
{
QString columnname = query.value(1).toString();
if(data.contains(columnname))
{
/**
*add support type;
* */
// switch (data.value(columnname).type()) {
// case QVariant::Int:
// columnnamelist.append(columnname);
// columnvaluelist.append(QString("'") + QString::number(data.value(columnname).toInt()) + "'");
// break;
// case QVariant::String:
// columnnamelist.append(columnname);
// columnvaluelist.append(QString("'") + data.value(columnname).toString() + "'");
// break;
// case QVariant::Bool:
// columnnamelist.append(columnname);
// columnvaluelist.append(QString("'") + QString::number(data.value(columnname).toBool()? 1 : 0) + "'");
// break;
// default:
// break;
// }
columnnamelist.append(columnname);
columnvaluelist.append(QString("'") + data.value(columnname).toString() + "'");
}
continue ;
}
if(columnnamelist.size() == 0)
return false;
return true;
}
bool FMPDataBase::getSql(QString table, QVariantHash data, QString& sql)
{
QSqlQuery query(_db);
QString tmpsql = QString("PRAGMA table_info(%1)").arg(table);
query.exec(tmpsql);
QStringList list;
while(query.next())
{
QString columnname = query.value(1).toString();
if(data.contains(columnname))
{
/**
*add support type(mysql/sqlserver/...);
* */
// switch (data.value(columnname).type()) {
// case QVariant::Int:
// list.append(columnname + " = '" + QString::number(data.value(columnname).toInt()) + "'");
// break;
// case QVariant::String:
// list.append(columnname + " = '" + data.value(columnname).toString() + "'");
// break;
// case QVariant::Bool:
// list.append(columnname + " = '" + QString::number(data.value(columnname).toBool()? 1 : 0) + "'");
// break;
// default:
// break;
// }
/**
* sqlite
* */
list.append(columnname + " = '" + data.value(columnname).toString() + "'");
}
continue ;
}
if(list.size() == 0)
return false;
sql = list.join(", ");
return true;
}
#ifndef FMP_DATABASE_H
#define FMP_DATABASE_H
#include <QObject>
#include <QSqlDatabase>
class FMPLoggerInterface;
class QSqlQuery;
class QSqlDatabase;
class FMPDataBase : public QObject
{
Q_OBJECT
public:
FMPDataBase(QString dbname, FMPLoggerInterface *logger, QObject *parent = 0);
~FMPDataBase();
bool insert(QString table, QVariantHash data);
bool update(QString table, QVariantHash data, QString condition);
bool find(QString table, QSqlQuery &query, QStringList keylist = QStringList(), QString condition = QString(""));
bool creat(QString sql);
private:
bool exist(QString table);
bool getSql(QString table, QVariantHash data, QString &sql);
bool getSql(QString table, QVariantHash data, QStringList &columnnamelist, QStringList &columnvaluelist);
private:
QSqlDatabase _db;
FMPLoggerInterface *_logger;
bool _isopen;
};
#endif // FMP_DATABASE_H
#include "fmp_epay_p.h" #include "fmp_epay_p.h"
#include "fmp_epay_def.h"
#include "fmp_pe_handlers.h" #include "fmp_pe_handlers.h"
class ctkPluginContext; class ctkPluginContext;
FMPePay::FMPePay(ctkPluginContext *context) FMPePay::FMPePay(ctkPluginContext *context)
: FMPePayInterface(context), : FMPePayInterface(context),
_url(DEFAULT_EPAY_RWQUESTURL),
_inited(false), _inited(false),
_databasename(DEFAULT_EPAY_DATABASENAME),
_table(DEFAULT_EPAY_TABLE),
d_ptr(new FMPePayPrivate(this)) d_ptr(new FMPePayPrivate(this))
{ {
FMPStartEventHandler *ste_handler = new FMPStartEventHandler(_ctx, this); FMPStartEventHandler *ste_handler = new FMPStartEventHandler(_ctx, this);
......
...@@ -20,6 +20,9 @@ public: ...@@ -20,6 +20,9 @@ public:
int Pay(); int Pay();
private: private:
bool _inited; bool _inited;
QString _url;
QString _databasename;
QString _table;
FMPePayPrivate* d_ptr; FMPePayPrivate* d_ptr;
}; };
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
TEMPLATE = lib TEMPLATE = lib
QT += core gui network QT += core gui network sql concurrent
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11 CONFIG += c++11
...@@ -16,9 +16,9 @@ SOURCES += \ ...@@ -16,9 +16,9 @@ SOURCES += \
fmp_epay_p.cpp \ fmp_epay_p.cpp \
fmp_epay_plugin.cpp \ fmp_epay_plugin.cpp \
fmp_pe_handlers.cpp \ fmp_pe_handlers.cpp \
fmp_epaycontrol.cpp \
fmp_epayview_dialog.cpp \ fmp_epayview_dialog.cpp \
fmp_epayview_wait.cpp fmp_epayview_wait.cpp \
fmp_database.cpp
HEADERS +=\ HEADERS +=\
fmp_epay.h \ fmp_epay.h \
...@@ -27,11 +27,10 @@ HEADERS +=\ ...@@ -27,11 +27,10 @@ HEADERS +=\
fmp_epay_plugin_p.h \ fmp_epay_plugin_p.h \
fmp_pe_handlers.h \ fmp_pe_handlers.h \
fmp_epay_def.h \ fmp_epay_def.h \
fmp_epaycontrol.h \
fmp_epaycontrol_i.h \
fmp_epayview_dialog.h \ fmp_epayview_dialog.h \
fmp_epayview_focuslineedit.h \ fmp_epayview_focuslineedit.h \
fmp_epayview_wait.h fmp_epayview_wait.h \
fmp_database.h
unix { unix {
target.path = /usr/lib target.path = /usr/lib
......
#ifndef FMP_EPAY_DEF #ifndef FMP_EPAY_DEF
#define FMP_EPAY_DEF #define FMP_EPAY_DEF
//门店信息 //公用字段
#define FMP_EPAY_VER "ver" #define FMP_EPAY_VER "ver"
#define FMP_EPAY_CLIENTREQCOUNT "clientReqCount" #define FMP_EPAY_CLIENTREQCOUNT "clientReqCount"
#define FMP_EPAY_BUSINESSDATE "business_date" #define FMP_EPAY_BUSINESSDATE "business_date"
...@@ -14,10 +14,38 @@ ...@@ -14,10 +14,38 @@
#define FMP_EPAY_TRANSTRACTION_AMOUNT "amount" #define FMP_EPAY_TRANSTRACTION_AMOUNT "amount"
#define FMP_EPAY_TRANSTRACTION_CODE "code" #define FMP_EPAY_TRANSTRACTION_CODE "code"
#define FMP_EPAY_REFUND_TRANSTRACTION_FMID "fmID" //支付返回
#define FMP_RPAY_PAY_RETURN_PAYID "pay_id"
#define FMP_RPAY_PAY_RETURN_TRANSID "pay_transId"
#define FMP_RPAY_PAY_RETURN_EBCODE "pay_ebcode"
#define FMP_RPAY_PAY_RETURN_TOTAL "total_amount"
#define FMP_RPAY_PAY_RETURN_MCUPON "mcoupon_amount"
#define FMP_RPAY_PAY_RETURN_ALIPAY "alipay_amount"
#define FMP_RPAY_PAY_RETURN_STATUSCODE "statusCode"
#define FMP_RPAY_PAY_RETURN_MSG "msg"
//退款请求
#define FMP_EPAY_REFUND_TRANSTRACTION_FMID "fmId"
#define FMP_EPAY_REFUND_TRANSTRACTION_AMOUNT "refund_count" #define FMP_EPAY_REFUND_TRANSTRACTION_AMOUNT "refund_count"
#define FMP_EPAY_REFUND_TRANSTRACTION_TRANSID "paied_trans_id" #define FMP_EPAY_REFUND_TRANSTRACTION_TRANSID "paied_trans_id"
#define FMP_EPAY_REFUND_TRANSTRACTION_EBCODE "paied_ebcode" #define FMP_EPAY_REFUND_TRANSTRACTION_EBCODE "paied_ebcode"
//sql字段
#define SQL_KEY_ISREFUND "isrefund"
#define SQL_KEY_PAYID "pay_id"
#define SQL_KEY_TRANSID "pay_transId"
#define SQL_KEY_CODE "code"
#define SQL_KEY_FMID "fmId"
#define SQL_KEY_EBCODE "paied_ebcode"
#define SQL_KEY_TOTALAMOUNT "total_amount"
//缺省
#define DEFAULT_EPAY_RWQUESTURL "http://115.159.142.32:80/api?partner=aisen"
#define DEFAULT_EPAY_DATABASENAME "fmp_test.db"
#define DEFAULT_EPAY_TABLE "fmp_pay"
#endif // FMP_EPAY_DEF #endif // FMP_EPAY_DEF
#include "fmp_epay_p.h" #include <QDebug>
#include <QDateTime>
#include <fmp_settings_i.h> #include <fmp_settings_i.h>
#include <QCoreApplication> #include <QCoreApplication>
#include <QDateTime>
#include <ctkPluginContext.h> #include <ctkPluginContext.h>
#include <ctkServiceReference.h> #include <ctkServiceReference.h>
#include <QDebug> #include "fmp_epay_p.h"
#include "fmp_epay_def.h"
#include "fmp_logger_i.h"
#include "fmp_pe_handlers.h" #include "fmp_pe_handlers.h"
#include "fmp_epayview_dialog.h" #include "fmp_epayview_dialog.h"
#include "fmp_epaycontrol.h" #include "fmp_network_i.h"
#include "fmp_database.h"
#include <QJsonParseError>
#include <QJsonDocument>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QtConcurrent>
#include <QTimer>
#include <QSqlQuery>
unsigned int FMPePayPrivate::s_ClientReqCount = 10000;
FMPePayPrivate::FMPePayPrivate(FMPePay *parent) FMPePayPrivate::FMPePayPrivate(FMPePay *parent)
: q_ptr(parent), : q_ptr(parent),
_payDialog(nullptr), _payDialog(nullptr),
_setting(nullptr) _setting(nullptr),
_logger(nullptr),
_network(nullptr),
_db(nullptr),
_reverse_flag(false)
{ {
} }
...@@ -22,22 +41,16 @@ FMPePayPrivate::~FMPePayPrivate() ...@@ -22,22 +41,16 @@ FMPePayPrivate::~FMPePayPrivate()
if(_payDialog != nullptr) { if(_payDialog != nullptr) {
delete _payDialog; delete _payDialog;
} }
}
//int FMPePayPrivate::StartService()
//{
// qDebug() << "======== ePay init ===========";
// Q_Q(FMPePay);
// q->_inited = true; if(_db != nullptr){
// return FMP_SUCCESS; delete _db;
//} }
}
int FMPePayPrivate::StopService() int FMPePayPrivate::StopService()
{ {
Q_Q(FMPePay); Q_Q(FMPePay);
//! Clean up
q->_inited = false; q->_inited = false;
return FMP_SUCCESS; return FMP_SUCCESS;
} }
...@@ -52,9 +65,324 @@ int FMPePayPrivate::Pay() ...@@ -52,9 +65,324 @@ int FMPePayPrivate::Pay()
void FMPePayPrivate::onShowPayWnd() void FMPePayPrivate::onShowPayWnd()
{ {
Q_Q(FMPePay); Q_Q(FMPePay);
if(_logger == nullptr)
{
_logger = q->GetService<FMPLoggerInterface>(q->_ctx);
}
if(_network == nullptr)
{
_network = q->GetService<FMPNetworkInterface>(q->_ctx);
}
if(_db == nullptr)
{
_db = new FMPDataBase(q->_databasename, _logger);
QString sql = "create table " + q->_table + " ("
"fmId varchar(40) primary key, "
"code varchar(40), "
"pay_transId varchar(40), "
"pay_id varchar(40), "
"pay_ebcode varchar(20), "
"total_amount integer, "
"pcoupon_amount integer, "
"mcoupon_amount integer, "
"alipay_amount integer, "
"invoice_amount integer, "
"isrefund boolean"
")";
FMP_INFO(_logger) << " creat table sql:" << sql;
if(_db->creat(sql))
{
FMP_WARN(_logger) << "creat table fmp_pay failed";
}
}
if(_payDialog == nullptr) { if(_payDialog == nullptr) {
_setting = q->GetService<FMPSettingsInterface>(q->_ctx); _setting = q->GetService<FMPSettingsInterface>(q->_ctx);
_payDialog = new FMPPayDialog(new FMPControl(_setting), _setting); _payDialog = new FMPPayDialog(this, _logger);
} }
_payDialog->show(); _payDialog->show();
} }
void FMPePayPrivate::ControlPayJson(QString sum, QString code, QString date)
{
Q_Q(FMPePay);
QtConcurrent::run( [q, sum, code, date, this ]()
{
if(_reverse_flag)
{
emit error(QString::fromLocal8Bit("网络连接异常(冲正...)"));
return ;
}
if(!GetPayJson(sum, code, date))
{
emit error(QString::fromLocal8Bit("获取门店信息失败"));
return ;
}
FMP_INFO(_logger) << "pay json : " << _current_json;
QString errors;
QJsonObject outjson;
if(!HttpPost(outjson, _current_json ,errors, 10))
{
emit error(errors);
}
else
{
outjson.insert(SQL_KEY_ISREFUND, false);
outjson.insert(SQL_KEY_CODE, code);
_db->insert(q->_table, outjson.toVariantHash());
emit finished(outjson);
}
});
}
bool FMPePayPrivate::HttpPost(QJsonObject& outjson, QJsonObject json, QString &error, int timeout)
{
Q_Q(FMPePay);
QEventLoop loop;
QTimer timer;
QNetworkAccessManager manger;
QNetworkRequest request(q->_url);
request.setRawHeader("Content-Type","text/json");
QNetworkReply* reply = manger.post(request, QJsonDocument(json).toJson());
connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);
connect(&manger, &QNetworkAccessManager::finished, &loop, &QEventLoop::quit);
connect(reply, static_cast<void (QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error), &loop, &QEventLoop::quit);
timer.start(timeout*1000);
loop.exec();
reply->deleteLater();
if(reply->error() != QNetworkReply::NoError)
{
error = QString::fromLocal8Bit("网络异常");
return false;
}
if(!checkReturnJson(reply->readAll(), outjson))
{
error = QString::fromLocal8Bit("返回数据错误");
return false;
}
FMP_INFO(_logger) << outjson;
if(outjson[FMP_RPAY_PAY_RETURN_STATUSCODE].toInt() == 100)
return true;
if(outjson.contains(FMP_RPAY_PAY_RETURN_MSG))
error = outjson[FMP_RPAY_PAY_RETURN_MSG].toString() + QString("[%1]").arg(outjson[FMP_RPAY_PAY_RETURN_STATUSCODE].toInt());
else
error = QString::fromLocal8Bit("未定义错误") + QString("[%1]").arg(outjson[FMP_RPAY_PAY_RETURN_STATUSCODE].toInt());
return false;
}
bool FMPePayPrivate::checkReturnJson(QByteArray data, QJsonObject &returnjson)
{
QJsonParseError json_error;
QJsonDocument doc = QJsonDocument::fromJson( data, &json_error);
if(json_error.error != QJsonParseError::NoError || !doc.isObject())
{
return false;
}
returnjson = doc.object();
FMP_INFO(_logger) << "get return json : " << returnjson;
return true;
}
void FMPePayPrivate::ControlRefundJson(QString sum, QString code)
{
Q_Q(FMPePay);
QtConcurrent::run( [q, sum, code, this ]()
{
QString ebcode;
QStringList keylist;
QSqlQuery query;
keylist.append(SQL_KEY_TRANSID);
if(_reverse_flag)
{
emit error(QString::fromLocal8Bit("网络连接异常(冲正...)"));
return ;
}
if(!((code[0] >= 'a' && code[0] <= 'z') || (code[0] >= 'A' && code[0] <= 'Z')))
{
if(!_db->find(q->_table, query, keylist, QString(QString(SQL_KEY_TRANSID) + " = '%1'").arg(code)) || !query.next())
{
emit error(QString::fromLocal8Bit("交易记录不存在"));
return ;
}
}
if(!GetRefundJson(sum, code, ebcode))
{
emit error(QString::fromLocal8Bit("获取门店信息失败"));
return ;
}
FMP_INFO(_logger) << "refund json : " << _current_json;
QString errors;
QJsonObject outjson;
if(!HttpPost(outjson, _current_json ,errors))
{
emit error(errors);
}
else
{
QVariantHash hash;
QSqlQuery tmpquery;
QStringList tmpkeylist;
tmpkeylist << SQL_KEY_TRANSID << SQL_KEY_FMID << SQL_KEY_PAYID;
hash.insert(SQL_KEY_ISREFUND, true);
if(!_db->update(q->_table, hash, QString("pay_transId = '%1' or fmId = '%2'").arg(code).arg(code)))
{
FMP_ERROR(_logger) << "refund data update failed";
}
if(!_db->find(q->_table, tmpquery, tmpkeylist, QString("pay_transId = '%1' or fmId = '%2'").arg(code).arg(code)) || !tmpquery.next())
{
FMP_ERROR(_logger) << "refund data update failed";
outjson.insert(SQL_KEY_TRANSID, code);
outjson.insert(SQL_KEY_FMID, code);
outjson.insert(SQL_KEY_PAYID, QString::fromLocal8Bit("未知"));
outjson.insert(SQL_KEY_TOTALAMOUNT, sum);
}
else
{
outjson.insert(SQL_KEY_TRANSID, tmpquery.value(0).toString());
outjson.insert(SQL_KEY_FMID, tmpquery.value(0).toString());
outjson.insert(SQL_KEY_PAYID, tmpquery.value(0).toString());
outjson.insert(SQL_KEY_TOTALAMOUNT, sum);
}
FMP_INFO(_logger) << "refund success view json : " << outjson;
emit finished(outjson);
}
});
}
void FMPePayPrivate::ControlReverseJson()
{
_reverse_flag = true;
GetReverseJson();
qDebug() << "using network send Reverse data to server";
qDebug() << _current_json;
}
bool FMPePayPrivate::GetPayJson(const QString& sum, const QString& code, const QString& date)
{
_current_json = QJsonObject::fromVariantMap( QVariantMap() );
QJsonObject transaction;
QJsonArray transactionarry;
/**
* settings get store infomation(or return false)
**/
qDebug() << "get store infomation from settings";
QString storeid = "99999";
QString station = "07";
QString oprt = "08";
int ver = 2;
transaction.insert(FMP_EPAY_TRANSTRACTION_CODE, code);
transaction.insert(FMP_EPAY_TRANSTRACTION_AMOUNT, (int)((sum.toDouble() + 0.005) * 100));
transactionarry.append( transaction);
_current_json.insert( FMP_EPAY_VER, ver);
_current_json.insert( FMP_EPAY_REQUESTTYPE, 72);
_current_json.insert( FMP_EPAY_BUSINESSDATE, date);
_current_json.insert( FMP_EPAY_CLIENTREQCOUNT, (int)((++s_ClientReqCount)%=10000000));
_current_json.insert( FMP_EPAY_STOREID, storeid);
_current_json.insert( FMP_EPAY_STATIONID, station);
_current_json.insert( FMP_EPAY_OPERATORID, oprt);
_current_json.insert( FMP_EPAY_TRANSID, QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz"));
_current_json.insert( FMP_EPAY_TRANSTRACTION, transactionarry);
return true;
}
bool FMPePayPrivate::GetRefundJson(const QString &sum, const QString &code, QString ebcode)
{
Q_Q(FMPePay);
_current_json = QJsonObject::fromVariantMap( QVariantMap() );
QJsonObject transaction;
QJsonArray transactionarry;
/**
* settings get store infomation(or return false)
**/
qDebug() << "get store infomation from settings";
QString storeid = "99999";
QString station = "07";
QString oprt = "08";
int ver = 2;
if((code[0] >= 'a' && code[0] <= 'z') || (code[0] >= 'A' && code[0] <= 'Z'))
{
transaction.insert(FMP_EPAY_REFUND_TRANSTRACTION_FMID, code);
transaction.insert(FMP_EPAY_REFUND_TRANSTRACTION_AMOUNT, (int)((sum.toDouble() + 0.005) * 100));
}else
{
transaction.insert(FMP_EPAY_REFUND_TRANSTRACTION_EBCODE, ebcode);
transaction.insert(FMP_EPAY_REFUND_TRANSTRACTION_TRANSID, code);
transaction.insert(FMP_EPAY_REFUND_TRANSTRACTION_AMOUNT, (int)((sum.toDouble() + 0.005) * 100));
}
transactionarry.append( transaction);
_current_json.insert( FMP_EPAY_VER, ver);
_current_json.insert( FMP_EPAY_REQUESTTYPE, 62);
_current_json.insert( FMP_EPAY_CLIENTREQCOUNT, (int)((++s_ClientReqCount)%=10000000));
_current_json.insert( FMP_EPAY_STOREID, storeid);
_current_json.insert( FMP_EPAY_STATIONID, station);
_current_json.insert( FMP_EPAY_OPERATORID, oprt);
_current_json.insert( FMP_EPAY_TRANSID, QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz"));
_current_json.insert( FMP_EPAY_TRANSTRACTION, transactionarry);
return true;
}
void FMPePayPrivate::GetReverseJson()
{
_current_json[FMP_EPAY_REQUESTTYPE] = 3;
}
...@@ -3,9 +3,13 @@ ...@@ -3,9 +3,13 @@
#include "fmp_epay.h" #include "fmp_epay.h"
#include <QObject> #include <QObject>
#include <QJsonObject>
class FMPPayDialog; class FMPPayDialog;
class FMPSettingsInterface; class FMPSettingsInterface;
class FMPLoggerInterface;
class FMPNetworkInterface;
class FMPDataBase;
class FMPePayPrivate : public QObject class FMPePayPrivate : public QObject
{ {
...@@ -15,22 +19,61 @@ public: ...@@ -15,22 +19,61 @@ public:
explicit FMPePayPrivate(FMPePay* parent); explicit FMPePayPrivate(FMPePay* parent);
~FMPePayPrivate(); ~FMPePayPrivate();
// int StartService();
int StopService(); int StopService();
int Pay(); int Pay();
void ControlPayJson(QString sum, QString code, QString date);
void ControlRefundJson(QString sum, QString code);
private:
void ControlReverseJson();
bool GetRefundJson(const QString &sum, const QString &code, QString ebcode);
void GetReverseJson();
bool GetPayJson(const QString &sum, const QString &code, const QString &date);
bool HttpPost(QJsonObject& outjson, QJsonObject json, QString &error, int timeout = 60);
bool checkReturnJson(QByteArray data, QJsonObject &returnjson);
signals: signals:
void showPayWnd(); void showPayWnd();
void error(QString errormsg);
void finished(QJsonObject json);
public slots: public slots:
void onShowPayWnd(); void onShowPayWnd();
public: public:
FMPePay *q_ptr; FMPePay *q_ptr;
FMPPayDialog *_payDialog; FMPPayDialog *_payDialog;
FMPSettingsInterface *_setting; FMPSettingsInterface *_setting;
FMPLoggerInterface *_logger;
FMPNetworkInterface *_network;
private: private:
QJsonObject _current_json;
bool _reverse_flag;
static unsigned int s_ClientReqCount;
FMPDataBase *_db;
}; };
#endif // FMP_EPAY_P_H #endif // FMP_EPAY_P_H
#include "fmp_epaycontrol.h"
#include "fmp_epay_def.h"
#include <QJsonObject>
#include <QJsonArray>
#include <QVariant>
#include <QDateTime>
#include <QDebug>
unsigned int FMPControl::s_ClientReqCount = 10000;
FMPControl::FMPControl(FMPSettingsInterface* &settings, QObject *parent) : _settings(settings), FMPControlInterface(parent)
{
_reverse_flag = false;
}
void FMPControl::ControlPayJson(QString sum, QString code, QString date)
{
if(_reverse_flag)
{
emit error(QString::fromLocal8Bit("网络连接异常(冲正...)"));
return ;
}
if(!GetPayJson(sum, code, date))
{
emit error(QString::fromLocal8Bit("获取门店信息失败"));
return ;
}
//network send infomation
qDebug() << "using network send pay data to server";
qDebug() << _current_json;
}
void FMPControl::ControlRefundJson(QString sum, QString code)
{
if(_reverse_flag)
{
emit error(QString::fromLocal8Bit("网络连接异常(冲正...)"));
return ;
}
if(!GetRefundJson(sum, code))
{
emit error(QString::fromLocal8Bit("获取门店信息失败"));
return ;
}
//network send infomation
qDebug() << "using network send pay data to server";
qDebug() << _current_json;
}
void FMPControl::ControlReverseJson()
{
_reverse_flag = true;
GetReverseJson();
qDebug() << "using network send Reverse data to server";
qDebug() << _current_json;
}
bool FMPControl::GetPayJson(const QString& sum, const QString& code, const QString& date)
{
_current_json = QJsonObject::fromVariantMap( QVariantMap() );
QJsonObject transaction;
QJsonArray transactionarry;
/**
* settings get store infomation(or return false)
**/
qDebug() << "get store infomation from settings";
QString storeid = "99998";
QString station = "07";
QString oprt = "08";
int ver = 2;
transaction.insert(FMP_EPAY_TRANSTRACTION_CODE, code);
transaction.insert(FMP_EPAY_TRANSTRACTION_AMOUNT, (int)((sum.toDouble() + 0.05) * 100));
transactionarry.append( transaction);
_current_json.insert( FMP_EPAY_VER, ver);
_current_json.insert( FMP_EPAY_REQUESTTYPE, 72);
_current_json.insert( FMP_EPAY_BUSINESSDATE, date);
_current_json.insert( FMP_EPAY_CLIENTREQCOUNT, (int)++s_ClientReqCount);
_current_json.insert( FMP_EPAY_STOREID, storeid);
_current_json.insert( FMP_EPAY_STATIONID, station);
_current_json.insert( FMP_EPAY_OPERATORID, oprt);
_current_json.insert( FMP_EPAY_TRANSID, QDateTime::currentDateTime().toString("yyyyMMddhhmmssddd"));
_current_json.insert( FMP_EPAY_TRANSTRACTION, transactionarry);
return true;
}
bool FMPControl::GetRefundJson(const QString &sum, const QString &code)
{
_current_json = QJsonObject::fromVariantMap( QVariantMap() );
QJsonObject transaction;
QJsonArray transactionarry;
/**
* settings get store infomation(or return false)
**/
qDebug() << "get store infomation from settings";
QString storeid = "99998";
QString station = "07";
QString oprt = "08";
int ver = 2;
if((code[0] >= 'a' && code[0] <= 'z') || (code[0] >= 'A' && code[0] <= 'Z'))
{
transaction.insert(FMP_EPAY_REFUND_TRANSTRACTION_FMID, code);
transaction.insert(FMP_EPAY_REFUND_TRANSTRACTION_AMOUNT, (int)((sum.toDouble() + 0.05) * 100));
}else
{
/**
* sql get pay infomation(or return false)
**/
qDebug() << "get ebcode from db";
QString ebcode = "10004";
transaction.insert(FMP_EPAY_REFUND_TRANSTRACTION_EBCODE, ebcode);
transaction.insert(FMP_EPAY_REFUND_TRANSTRACTION_TRANSID, code);
transaction.insert(FMP_EPAY_REFUND_TRANSTRACTION_AMOUNT, (int)((sum.toDouble() + 0.05) * 100));
}
transactionarry.append( transaction);
_current_json.insert( FMP_EPAY_VER, ver);
_current_json.insert( FMP_EPAY_REQUESTTYPE, 62);
_current_json.insert( FMP_EPAY_CLIENTREQCOUNT, (int)++s_ClientReqCount);
_current_json.insert( FMP_EPAY_STOREID, storeid);
_current_json.insert( FMP_EPAY_STATIONID, station);
_current_json.insert( FMP_EPAY_OPERATORID, oprt);
_current_json.insert( FMP_EPAY_TRANSID, QDateTime::currentDateTime().toString("yyyyMMddhhmmssddd"));
_current_json.insert( FMP_EPAY_TRANSTRACTION, transactionarry);
return true;
}
void FMPControl::GetReverseJson()
{
_current_json[FMP_EPAY_REQUESTTYPE] = 3;
}
#ifndef FMPCONTROL_H
#define FMPCONTROL_H
#include <fmp_settings_i.h>
#include "fmp_epaycontrol_i.h"
class FMPSettingsInterface;
class FMPControl : public FMPControlInterface
{
public:
FMPControl(FMPSettingsInterface* &settings, QObject *parent = 0);
void ControlPayJson(QString sum, QString code, QString date);
void ControlRefundJson(QString sum, QString code);
private:
void ControlReverseJson();
bool GetRefundJson(const QString &sum, const QString &code);
void GetReverseJson();
bool GetPayJson(const QString &sum, const QString &code, const QString &date);
private:
FMPSettingsInterface* _settings;
QJsonObject _current_json;
bool _reverse_flag;
static unsigned int s_ClientReqCount;
};
#endif // FMPCONTROL_H
#ifndef FMP_CONTROL_I_H
#define FMP_CONTROL_I_H
#include <QObject>
#include <QJsonObject>
class FMPControlInterface : public QObject
{
Q_OBJECT
public:
FMPControlInterface(QObject *parent = 0) : QObject(parent) {}
/**
* @brief ControlPayJson
* 获取发送支付请求
* @param sum
* @param code
* @param code
*/
virtual void ControlPayJson(QString sum, QString code, QString date) = 0;
/**
* @brief ControlRefundJson
* 获取发送退款请求
* @param sum
* @param code(fmID/pay_transId)
*/
virtual void ControlRefundJson(QString sum, QString code) = 0;
protected:
/**
* @brief ControlReverseJson
* 冲正
*/
virtual void ControlReverseJson() = 0;
signals:
void error(QString errormsg);
void finished(QJsonObject json);
};
#endif // FMP_CONTROL_I_H
#include "fmp_epayview_dialog.h" #include "fmp_epayview_dialog.h"
#include "ui_fmp_epayview_dialog.h" #include "ui_fmp_epayview_dialog.h"
#include "fmp_epaycontrol_i.h" #include "fmp_epay_def.h"
#include "fmp_epay_p.h"
#include <QDebug> #include <QDebug>
#include <fmp_settings_i.h> #include <fmp_settings_i.h>
#include <fmp_logger_i.h>
FMPPayDialog::FMPPayDialog(FMPControlInterface *control, FMPSettingsInterface* &settings, QWidget *parent) : FMPPayDialog::FMPPayDialog(FMPePayPrivate *control, FMPLoggerInterface *logger, QWidget *parent) :
_logger(logger),
_control(control), _control(control),
_settings(settings),
QDialog(parent), QDialog(parent),
ui(new Ui::FMPPayDialog) ui(new Ui::FMPPayDialog)
{ {
...@@ -36,8 +39,8 @@ FMPPayDialog::FMPPayDialog(FMPControlInterface *control, FMPSettingsInterface* & ...@@ -36,8 +39,8 @@ FMPPayDialog::FMPPayDialog(FMPControlInterface *control, FMPSettingsInterface* &
connect(ui->lineedit_num, &FMPFocusLineEdit::focusIn, this, &FMPPayDialog::onLineeditCodeGetFocus); connect(ui->lineedit_num, &FMPFocusLineEdit::focusIn, this, &FMPPayDialog::onLineeditCodeGetFocus);
connect(ui->lineedit_code, &FMPFocusLineEdit::focusIn, this, &FMPPayDialog::onLineeditCodeGetFocus); connect(ui->lineedit_code, &FMPFocusLineEdit::focusIn, this, &FMPPayDialog::onLineeditCodeGetFocus);
connect(_control, &FMPControlInterface::error, this, &FMPPayDialog::showErrorMsg); connect(_control, &FMPePayPrivate::error, this, &FMPPayDialog::showErrorMsg);
connect(_control, &FMPControlInterface::finished, this, &FMPPayDialog::showSuccessMsg); connect(_control, &FMPePayPrivate::finished, this, &FMPPayDialog::showSuccessMsg);
getBusinessDate(); getBusinessDate();
...@@ -98,6 +101,25 @@ FMPPayDialog::~FMPPayDialog() ...@@ -98,6 +101,25 @@ FMPPayDialog::~FMPPayDialog()
void FMPPayDialog::setPaySuccessView(QJsonObject json) void FMPPayDialog::setPaySuccessView(QJsonObject json)
{ {
ui->lb5->show();
ui->tlb5->show();
ui->lb6->show();
ui->tlb6->show();
ui->suc2->setText(QString::fromLocal8Bit("支付成功"));
ui->tlb1->setText(QString::fromLocal8Bit("支付渠道"));
ui->lb1->setText(json[FMP_RPAY_PAY_RETURN_PAYID].toString());
ui->tlb2->setText(QString::fromLocal8Bit("非码交易号"));
ui->lb2->setText(json[FMP_EPAY_REFUND_TRANSTRACTION_FMID].toString());
ui->tlb3->setText(QString::fromLocal8Bit("支付交易号"));
ui->lb3->setText(json[FMP_RPAY_PAY_RETURN_TRANSID].toString().insert(15, "\n"));
ui->tlb4->setText(QString::fromLocal8Bit("应付金额"));
ui->lb4->setText(QString::number(json[FMP_RPAY_PAY_RETURN_TOTAL].toDouble()/100));
ui->tlb5->setText(QString::fromLocal8Bit("优惠金额"));
ui->lb5->setText(QString::number(json[FMP_RPAY_PAY_RETURN_MCUPON].toDouble()/100));
ui->tlb6->setText(QString::fromLocal8Bit("实付金额"));
ui->lb6->setText(QString::number(json[FMP_RPAY_PAY_RETURN_ALIPAY].toDouble()/100));
ui->stackedWidget->setCurrentIndex(1);
} }
void FMPPayDialog::setRefundSuccessView(QJsonObject json) void FMPPayDialog::setRefundSuccessView(QJsonObject json)
...@@ -107,6 +129,9 @@ void FMPPayDialog::setRefundSuccessView(QJsonObject json) ...@@ -107,6 +129,9 @@ void FMPPayDialog::setRefundSuccessView(QJsonObject json)
void FMPPayDialog::setPayView() void FMPPayDialog::setPayView()
{ {
ui->btn_pay->setChecked(true);
ui->btn_refund->setChecked(false);
ui->lineedit_num->setFocus(); ui->lineedit_num->setFocus();
_current_LineEdit = ui->lineedit_num; _current_LineEdit = ui->lineedit_num;
...@@ -126,6 +151,9 @@ void FMPPayDialog::setPayView() ...@@ -126,6 +151,9 @@ void FMPPayDialog::setPayView()
void FMPPayDialog::setRefundView() void FMPPayDialog::setRefundView()
{ {
ui->btn_pay->setChecked(false);
ui->btn_refund->setChecked(true);
ui->lineedit_num->setFocus(); ui->lineedit_num->setFocus();
_current_LineEdit = ui->lineedit_num; _current_LineEdit = ui->lineedit_num;
...@@ -153,7 +181,6 @@ void FMPPayDialog::on_btn_pay_clicked() ...@@ -153,7 +181,6 @@ void FMPPayDialog::on_btn_pay_clicked()
{ {
setPayView(); setPayView();
} }
void FMPPayDialog::on_btn_refund_clicked() void FMPPayDialog::on_btn_refund_clicked()
{ {
setRefundView(); setRefundView();
...@@ -168,12 +195,19 @@ void FMPPayDialog::on_btn_confirm_clicked() ...@@ -168,12 +195,19 @@ void FMPPayDialog::on_btn_confirm_clicked()
_wait->setModal(true); _wait->setModal(true);
} }
_wait->SetContent(FMPPayWait::LOADING, QString::fromLocal8Bit("支付中..."));
if(ui->btn_pay->isChecked()) if(ui->btn_pay->isChecked())
{
_wait->SetContent(FMPPayWait::LOADING, QString::fromLocal8Bit("支付中..."));
_control->ControlPayJson(ui->lineedit_num->text(), ui->lineedit_code->text(), ui->label_date->text()); _control->ControlPayJson(ui->lineedit_num->text(), ui->lineedit_code->text(), ui->label_date->text());
}
else else
{
_wait->SetContent(FMPPayWait::LOADING, QString::fromLocal8Bit("退款中..."));
_control->ControlRefundJson(ui->lineedit_num->text(), ui->lineedit_code->text()); _control->ControlRefundJson(ui->lineedit_num->text(), ui->lineedit_code->text());
}
_wait->show(); _wait->show();
} }
......
...@@ -12,8 +12,9 @@ ...@@ -12,8 +12,9 @@
#include "fmp_epayview_wait.h" #include "fmp_epayview_wait.h"
#include "fmp_epayview_focuslineedit.h" #include "fmp_epayview_focuslineedit.h"
class FMPePayPrivate;
class FMPSettingsInterface; class FMPSettingsInterface;
class FMPControlInterface; class FMPLoggerInterface;
namespace Ui { namespace Ui {
class FMPPayDialog; class FMPPayDialog;
...@@ -24,7 +25,7 @@ class FMPPayDialog : public QDialog ...@@ -24,7 +25,7 @@ class FMPPayDialog : public QDialog
Q_OBJECT Q_OBJECT
public: public:
explicit FMPPayDialog(FMPControlInterface *control, FMPSettingsInterface* &settings, QWidget *parent = 0); explicit FMPPayDialog(FMPePayPrivate *control, FMPLoggerInterface *logger, QWidget *parent = 0);
~FMPPayDialog(); ~FMPPayDialog();
public slots: public slots:
...@@ -72,9 +73,11 @@ private: ...@@ -72,9 +73,11 @@ private:
FMPSettingsInterface* _settings; FMPSettingsInterface* _settings;
FMPControlInterface *_control; FMPePayPrivate *_control;
FMPPayWait *_wait; FMPPayWait *_wait;
FMPLoggerInterface *_logger;
}; };
#endif // DIALOG_H #endif // DIALOG_H
...@@ -551,7 +551,7 @@ background-color:rgb(210,210,210); ...@@ -551,7 +551,7 @@ background-color:rgb(210,210,210);
}</string> }</string>
</property> </property>
<property name="currentIndex"> <property name="currentIndex">
<number>0</number> <number>1</number>
</property> </property>
<widget class="QWidget" name="paypage"> <widget class="QWidget" name="paypage">
<widget class="QPushButton" name="btn_confirm02"> <widget class="QPushButton" name="btn_confirm02">
...@@ -1739,7 +1739,7 @@ border:0</string> ...@@ -1739,7 +1739,7 @@ border:0</string>
</property> </property>
<property name="styleSheet"> <property name="styleSheet">
<string notr="true">background-color: rgb(255, 255, 255); <string notr="true">background-color: rgb(255, 255, 255);
image: url(:/res/fmclient-icon_payment_success.png);</string> image: url(:/img/fmclient-icon_payment_success.png);</string>
</property> </property>
<property name="text"> <property name="text">
<string/> <string/>
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
FMPPayWait::FMPPayWait(QWidget *parent) : QDialog(parent), ui(new Ui::FMPPayWait) FMPPayWait::FMPPayWait(QWidget *parent) : QDialog(parent), ui(new Ui::FMPPayWait)
{ {
ui->setupUi(this); ui->setupUi(this);
...@@ -31,9 +32,11 @@ void FMPPayWait::SetContent(FMPPayWait::Type type, const QString &msg) ...@@ -31,9 +32,11 @@ void FMPPayWait::SetContent(FMPPayWait::Type type, const QString &msg)
switch (type) { switch (type) {
case FMPPayWait::SUCCESS: case FMPPayWait::SUCCESS:
ui->btn_confirm->setVisible(true);
ui->label_logo->setStyleSheet("#label_logo { border-image: url(:/img/loading.png); }"); ui->label_logo->setStyleSheet("#label_logo { border-image: url(:/img/loading.png); }");
break; break;
case FMPPayWait::ERROR: case FMPPayWait::ERROR:
ui->btn_confirm->setVisible(true);
ui->label_logo->setStyleSheet("#label_logo { border-image: url(:/img/fmclient-icon_payment_fail.png);}"); ui->label_logo->setStyleSheet("#label_logo { border-image: url(:/img/fmclient-icon_payment_fail.png);}");
break; break;
case FMPPayWait::LOADING: case FMPPayWait::LOADING:
...@@ -41,6 +44,7 @@ void FMPPayWait::SetContent(FMPPayWait::Type type, const QString &msg) ...@@ -41,6 +44,7 @@ void FMPPayWait::SetContent(FMPPayWait::Type type, const QString &msg)
ui->btn_confirm->setVisible(false); ui->btn_confirm->setVisible(false);
break; break;
default: default:
ui->btn_confirm->setVisible(true);
ui->label_logo->setStyleSheet("#label_logo { border-image: url(:/img/loading.png); }"); ui->label_logo->setStyleSheet("#label_logo { border-image: url(:/img/loading.png); }");
break; break;
} }
......
...@@ -27,3 +27,30 @@ void FMPStartEventHandler::handleEvent(const ctkEvent &event) ...@@ -27,3 +27,30 @@ void FMPStartEventHandler::handleEvent(const ctkEvent &event)
FMP_DEBUG_CTX(_ctx) << "No handler instance for event" << event.getTopic(); FMP_DEBUG_CTX(_ctx) << "No handler instance for event" << event.getTopic();
} }
} }
FMPNetWorkEventHandler::FMPNetWorkEventHandler(ctkPluginContext *ctx, FMPePay *epay)
: FMPePayEventHandler(FMP_TOPICS_SERVICES FMPE_SERVICE_ACK_START "/"
+ QString::number(ctx->getPlugin()->getPluginId()), epay),
_ctx(ctx)
{
FMPProps props;
props[ctkEventConstants::EVENT_TOPIC] = _topic;
_ctx->registerService<ctkEventHandler>(this, props);
}
void FMPNetWorkEventHandler::handleEvent(const ctkEvent &event)
{
if (_epay) {
if (event.getProperty(FMP_PROPKEY_AGREED).toBool()) {
_epay->Pay();
}
else {
FMP_WARN_CTX(_ctx) << "Refused start request" << event.getTopic();
}
}
else {
FMP_DEBUG_CTX(_ctx) << "No handler instance for event" << event.getTopic();
}
}
...@@ -34,4 +34,21 @@ private: ...@@ -34,4 +34,21 @@ private:
ctkPluginContext* _ctx; ctkPluginContext* _ctx;
}; };
/**
* 升级事件处理类(网络)
* @brief TheNetWorkFMPUpgradeEventHandler class
*/
class FMPNetWorkEventHandler : public QObject, public FMPePayEventHandler
{
Q_OBJECT
Q_INTERFACES(ctkEventHandler)
public:
explicit FMPNetWorkEventHandler(ctkPluginContext *ctx, FMPePay *epay);
void handleEvent(const ctkEvent &event);
private:
ctkPluginContext* _ctx;
};
#endif // FMP_MANAGER_EVENT_HANDLERS_H #endif // FMP_MANAGER_EVENT_HANDLERS_H
...@@ -11,5 +11,6 @@ ...@@ -11,5 +11,6 @@
<file>img/fm-icon_close_02.png</file> <file>img/fm-icon_close_02.png</file>
<file>img/logo.png</file> <file>img/logo.png</file>
<file>img/sys.ico</file> <file>img/sys.ico</file>
<file>img/loading.png</file>
</qresource> </qresource>
</RCC> </RCC>
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
#define VER_MINOR 1 #define VER_MINOR 1
#define VER_REVISION 0 #define VER_REVISION 0
#define VER_BUILD 12 #define VER_BUILD 13
//! Convert version numbers to string //! Convert version numbers to string
#define _STR(S) #S #define _STR(S) #S
......
Plugin-SymbolicName: fmp.syncer
Plugin-Version: 0.1.0
Plugin-Name: fmp.syncer
Plugin-Copyright: Freemud Ltd. Copyright (C) 2014-2017
Plugin-Vendor: Freemud
<RCC>
<qresource prefix="/fmp.syncer/META-INF">
<file>MANIFEST.MF</file>
</qresource>
</RCC>
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by fmproxy_service.rc
// ¶һĬֵ
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 101
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
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