Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Q
qfmclient
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
shuai.liu
qfmclient
Commits
81dd0ace
Commit
81dd0ace
authored
Nov 24, 2017
by
刘帅
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
1. 设置门店信息、非码支付、支付查询、支付退款接口测试ok
parent
34dfc7cf
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
469 additions
and
111 deletions
+469
-111
qfmclient.cpp
+450
-100
qfmclient.h
+19
-11
No files found.
qfmclient.cpp
View file @
81dd0ace
...
...
@@ -8,6 +8,8 @@
#include <QFile>
#include <Qdebug>
#include <QJsonArray>
#include <QtAlgorithms>
#include <QDir>
#ifdef WIN32
#include <direct.h>
...
...
@@ -77,6 +79,30 @@ bool QFmClient::Init(QString proxy_IP, unsigned short proxy_port, unsigned short
return
true
;
}
/*初始化门店信息
* 启动时,如果存在门店信息文件,读取
* 如果不存在,新建
* 每次更新门店信息时,写入
*/
bool
QFmClient
::
InitStoreInfo
()
{
QString
fileName
=
qApp
->
applicationDirPath
();
fileName
.
append
(
QDir
::
separator
());
fileName
.
append
(
"store_info.ini"
);
if
(
QFile
::
exists
(
fileName
))
{
//read store info
}
else
{
QFile
storeInfoFileName
(
fileName
);
if
(
!
storeInfoFileName
.
open
(
QIODevice
::
ReadWrite
|
QIODevice
::
Text
))
qDebug
()
<<
"open file failed!
\n
"
<<
fileName
;
}
return
true
;
}
int
QFmClient
::
RecvSockData
(
int
sock
,
char
*
buffer
,
int
length
)
{
#ifdef WIN32
...
...
@@ -100,13 +126,13 @@ bool QFmClient::WaitForConnectReqFromPos()
int
sin_size
=
sizeof
(
struct
sockaddr_in
);
struct
sockaddr_in
c_add
;
if
(
0
<
_acceptedSock
)
{
RecvSockData
(
_acceptedSock
,
_recvbuf
,
(
MAX_BUF_LEN
-
1
));
CloseSocket
(
&
_acceptedSock
);
}
qDebug
()
<<
"wait for connection from pos"
;
_acceptedSock
=
accept
(
_listenSock
,
(
struct
sockaddr
*
)(
&
c_add
),
&
sin_size
);
if
(
-
1
==
_acceptedSock
)
{
...
...
@@ -240,12 +266,12 @@ char * QFmClient::DecodeRecvData(char * buf, int length, int * dLength)
int
QFmClient
::
WaitAndReadDataFromPos
(
int
type
,
int
flag
)
{
qDebug
()
<<
"wait
and
receive data from POS...
\r\n
"
;
qDebug
()
<<
"wait
to
receive data from POS...
\r\n
"
;
_rcvLength
=
0
;
int
recbytes
,
finLen
,
curPos
=
0
,
prosLen
=
0
,
checkCount
=
0
;
int
i
=
0
;
memset
(
_tempbuf
,
0
,
MAX_BUF_LEN
)
;
do
{
char
*
precvBuf
;
...
...
@@ -260,7 +286,6 @@ int QFmClient::WaitAndReadDataFromPos(int type, int flag)
return
-
1
;
}
#ifdef WIN32
qDebug
()
<<
"received data "
<<
_acceptedSock
<<
" : "
<<
_tempbuf
;
if
(
type
)
{
...
...
@@ -269,6 +294,7 @@ int QFmClient::WaitAndReadDataFromPos(int type, int flag)
//recbytes = GBKToUTF8( (unsigned char *)_sendbuf, recbytes, (unsigned char *)_tempbuf, MAX_BUF_LEN - 100);
}
#endif
qDebug
()
<<
"received data from pos(socket "
<<
_acceptedSock
<<
") :
\n
"
<<
_tempbuf
;
precvBuf
=
_tempbuf
;
_tempbuf
[
recbytes
]
=
'\0'
;
...
...
@@ -276,8 +302,6 @@ int QFmClient::WaitAndReadDataFromPos(int type, int flag)
if
(
1
==
flag
)
precvBuf
=
DecodeRecvData
(
_tempbuf
,
recbytes
,
&
recbytes
);
qDebug
()
<<
"received data from socket "
<<
_acceptedSock
<<
" : "
<<
precvBuf
;
while
(
0
<
recbytes
)
{
finLen
=
CheckIsCompleteJsonData
(
&
checkCount
,
precvBuf
+
prosLen
);
...
...
@@ -326,9 +350,18 @@ int QFmClient::CheckReqFromPos(char * pJsonData, int dLength, int chkValue)
return
ZH_checkChkValue
(
pJsonData
,
dLength
,
chkValue
);
}
/*
* 返回值
* -1 失败
* 0 成功
* SET_STORE_INFO
* FREEMUD_PAY
* QUERY_PAY
* REFUND_PAY
*/
int
QFmClient
::
ProcessPosReqData
(
QJsonObject
&
object
)
{
int
flag
=
0
;
int
nResult
=
0
;
QByteArray
recvdata
(
_recvbuf
);
QJsonParseError
json_error
;
...
...
@@ -343,72 +376,54 @@ int QFmClient::ProcessPosReqData(QJsonObject& object)
//! TODO: Json 转换
object
=
doc
.
object
();
int
fm_cmd
=
10031
;
int
fm_cmd
=
FREEMUD_PAY
;
if
(
object
.
contains
(
"fm_cmd"
))
{
fm_cmd
=
object
.
tak
e
(
"fm_cmd"
).
toInt
();
fm_cmd
=
object
.
valu
e
(
"fm_cmd"
).
toInt
();
switch
(
fm_cmd
)
{
case
10031
:
case
FREEMUD_PAY
:
nResult
=
FREEMUD_PAY
;
if
(
object
.
find
(
"store_id"
)
!=
object
.
end
())
{
GetStoreInfo
(
object
);
SetStoreInfo
(
object
);
}
qDebug
()
<<
"convert json format"
;
ConvertJsonFormat
(
object
);
ConvertRequestJsonFormat
(
object
);
break
;
case
SET_STORE_INFO
:
nResult
=
SET_STORE_INFO
;
SetStoreInfo
(
object
);
break
;
case
QUERY_PAY
:
nResult
=
QUERY_PAY
;
QueryPay
(
object
);
break
;
case
1000
:
GetStoreInfo
(
object
);
sendResponseToPos
(
1000
);
return
1
;
case
REFUND_PAY
:
nResult
=
REFUND_PAY
;
RefundPay
(
object
);
break
;
default
:
nResult
=
-
1
;
qDebug
()
<<
"unknown command: "
<<
fm_cmd
;
break
;
}
qDebug
()
<<
"request json:
\n
"
<<
object
;
}
do
{
_sockTimeOut
=
_longTimeOut
;
if
(
object
.
contains
(
"reqtype"
))
{
if
(
object
[
"reqtype"
]
!=
72
)
{
_sockTimeOut
=
_shortTimeOut
;
}
if
(
object
[
"reqtype"
]
==
72
||
object
[
"reqtype"
]
==
71
)
{
flag
=
1
;
}
}
else
else
{
qDebug
()
<<
"not found reqtype"
;
flag
=
-
1
;
break
;
qDebug
()
<<
"unknown command(can not find fm_cmd section) "
;
nResult
=
-
1
;
}
// if(!object.contains("checkValue") || !object["checkValue"].isDouble())
// {
// qDebug() << "checkValue failed!\r\n";
// flag = -1;
// break;
// }
AddReqCount
(
object
);
}
while
(
0
);
return
flag
;
return
nResult
;
}
//convert pos requst json format from
// 非码支付插件 API 对接说明.pdf
//to
// 非码支付FMClient商户版_20170921.pdf
bool
QFmClient
::
ConvertJsonFormat
(
QJsonObject
&
object
)
bool
QFmClient
::
Convert
Request
JsonFormat
(
QJsonObject
&
object
)
{
QJsonObject
newObject
;
QJsonArray
transactionArray
;
...
...
@@ -425,85 +440,409 @@ bool QFmClient::ConvertJsonFormat(QJsonObject &object)
if
(
object
.
contains
(
"trans_id"
))
{
QString
trans_id
=
object
.
tak
e
(
"trans_id"
).
toString
();
QString
trans_id
=
object
.
valu
e
(
"trans_id"
).
toString
();
newObject
.
insert
(
"trans_id"
,
trans_id
);
}
if
(
object
.
contains
(
"order_amount"
))
{
int
order_amount
=
object
.
tak
e
(
"order_amount"
).
toInt
();
int
order_amount
=
object
.
valu
e
(
"order_amount"
).
toInt
();
transactionObject
.
insert
(
"amount"
,
order_amount
);
}
if
(
object
.
contains
(
"undis_amount"
))
{
int
undis_amount
=
object
.
tak
e
(
"undis_amount"
).
toInt
();
int
undis_amount
=
object
.
valu
e
(
"undis_amount"
).
toInt
();
transactionObject
.
insert
(
"undis_amount"
,
undis_amount
);
}
if
(
object
.
contains
(
"barcode"
))
{
QString
barcode
=
object
.
tak
e
(
"barcode"
).
toString
();
QString
barcode
=
object
.
valu
e
(
"barcode"
).
toString
();
transactionObject
.
insert
(
"code"
,
barcode
);
}
if
(
object
.
contains
(
"products"
))
{
QJsonValue
products
=
object
.
tak
e
(
"products"
);
QJsonValue
products
=
object
.
valu
e
(
"products"
);
if
(
products
.
isArray
())
transactionObject
.
insert
(
"products"
,
products
);
}
transactionArray
.
append
(
transactionObject
);
newObject
.
insert
(
"transactions"
,
transactionArray
);
object
=
newObject
;
qSwap
(
object
,
newObject
)
;
qDebug
()
<<
object
;
return
true
;
}
//获取门店信息
void
QFmClient
::
GetStoreInfo
(
QJsonObject
&
object
)
/* 转换回复json格式
* object
* nType 回复类型
*/
bool
QFmClient
::
ConvertResponseJsonFormat
(
QJsonObject
&
object
,
int
nType
)
{
bool
bRtValue
=
true
;
qDebug
()
<<
"response json:
\n
"
<<
object
;
switch
(
nType
)
{
case
SET_STORE_INFO
:
break
;
case
FREEMUD_PAY
:
FreemudPayResponse
(
object
);
break
;
case
QUERY_PAY
:
QueryPayResponse
(
object
);
break
;
case
REFUND_PAY
:
RefundPayResponse
(
object
);
break
;
default
:
bRtValue
=
false
;
break
;
}
return
bRtValue
;
}
//设置门店信息
void
QFmClient
::
SetStoreInfo
(
QJsonObject
&
object
)
{
if
(
object
.
contains
(
"partner_id"
))
{
QString
partner_id
=
object
.
tak
e
(
"partner_id"
).
toString
();
QString
partner_id
=
object
.
valu
e
(
"partner_id"
).
toString
();
store_info
.
partner_id
=
partner_id
;
}
if
(
object
.
contains
(
"store_id"
))
{
QString
store_id
=
object
.
tak
e
(
"store_id"
).
toString
();
QString
store_id
=
object
.
valu
e
(
"store_id"
).
toString
();
store_info
.
store_id
=
store_id
;
}
if
(
object
.
contains
(
"pos_id"
))
{
QString
pos_id
=
object
.
tak
e
(
"pos_id"
).
toString
();
QString
pos_id
=
object
.
valu
e
(
"pos_id"
).
toString
();
store_info
.
pos_id
=
pos_id
;
}
if
(
object
.
contains
(
"business_date"
))
{
QString
business_date
=
object
.
tak
e
(
"business_date"
).
toString
();
QString
business_date
=
object
.
valu
e
(
"business_date"
).
toString
();
store_info
.
business_date
=
business_date
;
}
if
(
object
.
contains
(
"operator_id"
))
{
QString
operator_id
=
object
.
tak
e
(
"operator_id"
).
toString
();
QString
operator_id
=
object
.
valu
e
(
"operator_id"
).
toString
();
store_info
.
operator_id
=
operator_id
;
}
}
//nflag: 1000 response for set store infomation
void
QFmClient
::
sendResponseToPos
(
int
nflag
)
void
QFmClient
::
FreemudPay
(
QJsonObject
&
object
)
{
if
(
nflag
==
1000
)
do
{
_sockTimeOut
=
_longTimeOut
;
if
(
object
.
contains
(
"reqtype"
))
{
if
(
object
[
"reqtype"
]
!=
72
)
{
_sockTimeOut
=
_shortTimeOut
;
}
if
(
object
[
"reqtype"
]
==
72
||
object
[
"reqtype"
]
==
71
)
{
//flag = 1;
}
}
else
{
qDebug
()
<<
"not found reqtype"
;
//flag = -1;
break
;
}
// if(!object.contains("checkValue") || !object["checkValue"].isDouble())
// {
// qDebug() << "checkValue failed!\r\n";
// flag = -1;
// break;
// }
AddReqCount
(
object
);
}
while
(
0
);
}
//支付查询
bool
QFmClient
::
QueryPay
(
QJsonObject
&
object
)
{
QJsonObject
queryObject
;
QString
fm_order_id
;
QString
trans_id
;
if
(
object
.
contains
(
"trans_id"
))
{
trans_id
=
object
.
value
(
"trans_id"
).
toString
();
queryObject
.
insert
(
"trans_id"
,
trans_id
.
toInt
());
}
else
{
qDebug
()
<<
"can not find trans_id in json request!"
;
return
false
;
}
if
(
object
.
contains
(
"fm_order_id"
))
{
fm_order_id
=
object
.
value
(
"fm_order_id"
).
toString
();
}
queryObject
.
insert
(
"ver"
,
4
);
queryObject
.
insert
(
"reqtype"
,
52
);
queryObject
.
insert
(
"partnerId"
,
store_info
.
partner_id
.
toInt
());
queryObject
.
insert
(
"store_id"
,
store_info
.
store_id
);
queryObject
.
insert
(
"station_id"
,
store_info
.
pos_id
);
queryObject
.
insert
(
"operator_id"
,
store_info
.
operator_id
);
queryObject
.
insert
(
"fmid"
,
fm_order_id
);
queryObject
.
insert
(
"sign"
,
QString
());
qSwap
(
object
,
queryObject
);
return
true
;
}
//支付退款
bool
QFmClient
::
RefundPay
(
QJsonObject
&
object
)
{
QJsonObject
refundObject
;
QJsonArray
transactionArray
;
QJsonObject
transactionObject
;
QString
trans_id
;
QString
fm_trans_id
;
int
refund_amount
=
0
;
if
(
object
.
contains
(
"trans_id"
))
trans_id
=
object
.
value
(
"trans_id"
).
toString
();
if
(
object
.
contains
(
"fm_trans_id"
))
fm_trans_id
=
object
.
value
(
"fm_trans_id"
).
toString
();
if
(
object
.
contains
(
"refund_amount"
))
refund_amount
=
object
.
value
(
"refund_amount"
).
toInt
();
refundObject
.
insert
(
"ver"
,
2
);
refundObject
.
insert
(
"reqtype"
,
62
);
refundObject
.
insert
(
"partnerId"
,
store_info
.
partner_id
.
toInt
());
refundObject
.
insert
(
"store_id"
,
store_info
.
store_id
);
refundObject
.
insert
(
"station_id"
,
store_info
.
pos_id
);
refundObject
.
insert
(
"operator_id"
,
store_info
.
operator_id
);
refundObject
.
insert
(
"business_date"
,
store_info
.
business_date
);
refundObject
.
insert
(
"trans_id"
,
trans_id
.
toInt
());
transactionObject
.
insert
(
"fmid"
,
fm_trans_id
);
transactionObject
.
insert
(
"refund_count"
,
refund_amount
);
transactionArray
.
append
(
transactionObject
);
refundObject
.
insert
(
"transactions"
,
transactionArray
);
qSwap
(
object
,
refundObject
);
return
true
;
}
//非码支付回复处理
bool
QFmClient
::
FreemudPayResponse
(
QJsonObject
&
object
)
{
QJsonObject
payResponseObject
;
QJsonArray
pay_idsArray
;
QJsonObject
pay_idObject
;
QJsonValue
ext
;
int
statusCode
=
100
;
if
(
object
.
contains
(
"statusCode"
))
{
statusCode
=
object
.
value
(
"statusCode"
).
toInt
();
payResponseObject
.
insert
(
"status_code"
,
statusCode
);
}
if
(
object
.
contains
(
"msg"
))
{
QJsonValue
msg
=
object
.
value
(
"msg"
);
payResponseObject
.
insert
(
"msg"
,
msg
);
}
if
(
statusCode
!=
100
)
{
qSwap
(
object
,
payResponseObject
);
return
true
;
}
if
(
object
.
contains
(
"pay_transId"
))
{
QJsonValue
fm_trans_id
=
object
.
value
(
"pay_transId"
);
payResponseObject
.
insert
(
"fm_trans_id"
,
fm_trans_id
);
}
if
(
object
.
contains
(
"fmId"
))
{
QJsonValue
fm_order_id
=
object
.
value
(
"fmId"
);
payResponseObject
.
insert
(
"fm_order_id"
,
fm_order_id
);
}
if
(
object
.
contains
(
"total_amount"
))
{
QJsonValue
paid_total_amount
=
object
.
value
(
"total_amount"
);
payResponseObject
.
insert
(
"paid_total_amount"
,
paid_total_amount
);
pay_idObject
.
insert
(
"pay_amount"
,
paid_total_amount
);
}
if
(
object
.
contains
(
"invoice_amount"
))
{
QJsonValue
invoice_amount
=
object
.
value
(
"invoice_amount"
);
payResponseObject
.
insert
(
"invoice_amount"
,
invoice_amount
);
}
if
(
object
.
contains
(
"mcoupon_amount"
)
&&
object
.
contains
(
"pcoupon_amount"
))
{
int
platform_discount
=
object
.
value
(
"mcoupon_amount"
).
toInt
();
int
merchant_discount
=
object
.
value
(
"pcoupon_amount"
).
toInt
();
payResponseObject
.
insert
(
"discount_amount"
,
platform_discount
+
merchant_discount
);
pay_idObject
.
insert
(
"platform_discount"
,
platform_discount
);
pay_idObject
.
insert
(
"merchant_discount"
,
merchant_discount
);
}
if
(
object
.
contains
(
"pay_ebcode"
))
{
QJsonValue
pay_id
=
object
.
value
(
"pay_ebcode"
);
pay_idObject
.
insert
(
"pay_id"
,
pay_id
);
}
if
(
object
.
contains
(
"pay_id"
))
{
QJsonValue
pay_str
=
object
.
value
(
"pay_id"
);
pay_idObject
.
insert
(
"pay_str"
,
pay_str
);
}
if
(
object
.
contains
(
"pay_acount"
))
{
QJsonValue
pay_account
=
object
.
value
(
"pay_acount"
);
pay_idObject
.
insert
(
"pay_account"
,
pay_account
);
}
if
(
object
.
contains
(
"ext"
))
{
ext
=
object
.
value
(
"ext"
);
pay_idObject
.
insert
(
"ext"
,
ext
);
}
pay_idsArray
.
append
(
pay_idObject
);
payResponseObject
.
insert
(
"pay_ids"
,
pay_idsArray
);
qSwap
(
object
,
payResponseObject
);
return
true
;
}
//支付查询回复处理
bool
QFmClient
::
QueryPayResponse
(
QJsonObject
&
object
)
{
QJsonObject
queryPayResponseObject
;
QJsonArray
pay_idsArray
;
QJsonObject
pay_idObject
;
QJsonValue
ext
;
int
statusCode
=
100
;
if
(
object
.
contains
(
"statusCode"
))
{
statusCode
=
object
.
value
(
"statusCode"
).
toInt
();
queryPayResponseObject
.
insert
(
"status_code"
,
QString
::
number
(
statusCode
));
}
if
(
statusCode
!=
100
)
return
true
;
queryPayResponseObject
.
insert
(
"msg"
,
QString
::
fromLocal8Bit
(
"成功"
));
if
(
object
.
contains
(
"pay_transId"
))
{
QJsonValue
fm_trans_id
=
object
.
value
(
"pay_transId"
);
queryPayResponseObject
.
insert
(
"fm_trans_id"
,
fm_trans_id
);
}
if
(
object
.
contains
(
"fmId"
))
{
QJsonValue
fm_order_id
=
object
.
value
(
"fmId"
);
queryPayResponseObject
.
insert
(
"fm_order_id"
,
fm_order_id
);
}
if
(
object
.
contains
(
"total_amount"
))
{
QJsonValue
paid_total_amount
=
object
.
value
(
"total_amount"
);
queryPayResponseObject
.
insert
(
"paid_total_amount"
,
paid_total_amount
);
pay_idObject
.
insert
(
"pay_amount"
,
paid_total_amount
);
}
if
(
object
.
contains
(
"invoice_amount"
))
{
QJsonValue
invoice_amount
=
object
.
value
(
"invoice_amount"
);
queryPayResponseObject
.
insert
(
"invoice_amount"
,
invoice_amount
);
}
if
(
object
.
contains
(
"mcoupon_amount"
)
&&
object
.
contains
(
"pcoupon_amount"
))
{
int
platform_discount
=
object
.
value
(
"mcoupon_amount"
).
toInt
();
int
merchant_discount
=
object
.
value
(
"pcoupon_amount"
).
toInt
();
queryPayResponseObject
.
insert
(
"discount_amount"
,
platform_discount
+
merchant_discount
);
pay_idObject
.
insert
(
"platform_discount"
,
platform_discount
);
pay_idObject
.
insert
(
"merchant_discount"
,
merchant_discount
);
}
if
(
object
.
contains
(
"pay_ebcode"
))
{
QJsonValue
pay_id
=
object
.
value
(
"pay_ebcode"
);
pay_idObject
.
insert
(
"pay_id"
,
pay_id
);
}
if
(
object
.
contains
(
"pay_id"
))
{
QJsonValue
pay_str
=
object
.
value
(
"pay_id"
);
pay_idObject
.
insert
(
"pay_str"
,
pay_str
);
}
if
(
object
.
contains
(
"pay_acount"
))
{
QJsonValue
pay_account
=
object
.
value
(
"pay_acount"
);
pay_idObject
.
insert
(
"pay_account"
,
pay_account
);
}
if
(
object
.
contains
(
"ext"
))
{
ext
=
object
.
value
(
"ext"
);
pay_idObject
.
insert
(
"ext"
,
ext
);
}
pay_idsArray
.
append
(
pay_idObject
);
queryPayResponseObject
.
insert
(
"pay_ids"
,
pay_idsArray
);
qSwap
(
object
,
queryPayResponseObject
);
return
true
;
}
//支付退款回复处理
bool
QFmClient
::
RefundPayResponse
(
QJsonObject
&
object
)
{
QJsonObject
refundPayResponseObject
;
QJsonValue
ext
;
int
statusCode
=
100
;
if
(
object
.
contains
(
"statusCode"
))
{
statusCode
=
object
.
value
(
"statusCode"
).
toInt
();
refundPayResponseObject
.
insert
(
"status_code"
,
QString
::
number
(
statusCode
));
}
if
(
statusCode
!=
100
)
{
refundPayResponseObject
.
insert
(
"msg"
,
QString
::
fromLocal8Bit
(
"失败"
));
qSwap
(
object
,
refundPayResponseObject
);
return
true
;
}
refundPayResponseObject
.
insert
(
"msg"
,
QString
::
fromLocal8Bit
(
"成功"
));
if
(
object
.
contains
(
"ext"
))
{
ext
=
object
.
value
(
"ext"
);
refundPayResponseObject
.
insert
(
"ext"
,
ext
);
}
qSwap
(
object
,
refundPayResponseObject
);
return
true
;
}
/*发送设置门店信息响应
* bFlag true client处理成功
* false client处理失败
*/
void
QFmClient
::
sendSetResponseToPos
(
bool
bFlag
)
{
QJsonObject
responseObj
;
responseObj
.
insert
(
"status_code"
,
100
)
;
responseObj
.
insert
(
"msg"
,
QString
(
"set store infomation success"
)
);
QString
str
=
QJsonDocument
(
responseObj
).
toJson
(
);
char
*
pResponse
=
new
char
[
str
.
size
()
+
1
]
;
strcpy
(
pResponse
,
str
.
toStdString
().
c_str
());
int
status_code
=
bFlag
?
100
:
0
;
QString
msg
=
bFlag
?
QString
::
fromLocal8Bit
(
"成功"
)
:
QString
::
fromLocal8Bit
(
"失败"
);
responseObj
.
insert
(
"status_code"
,
status_code
);
responseObj
.
insert
(
"msg"
,
msg
)
;
int
nRt
=
SendSocketData
(
_acceptedSock
,
pResponse
,
str
.
size
(),
0
);
QString
str
=
QString
(
QJsonDocument
(
responseObj
).
toJson
(
QJsonDocument
::
Compact
));
QByteArray
byteArray
=
str
.
toLocal8Bit
();
const
char
*
temp
=
byteArray
.
data
();
size_t
st
=
strlen
(
temp
);
char
*
pResponse
=
new
char
[
st
+
1
];
strcpy
(
pResponse
,
temp
);
int
nRt
=
SendSocketData
(
_acceptedSock
,
pResponse
,
st
,
0
);
delete
[]
pResponse
;
if
(
nRt
==
0
)
qDebug
()
<<
"send response for set store info failed!"
;
}
}
int
QFmClient
::
Try2ConnectZhProxy
()
...
...
@@ -512,7 +851,7 @@ int QFmClient::Try2ConnectZhProxy()
int
rlt
=
0
;
unsigned
long
ul
=
1
;
unsigned
long
sendsize
=
32
;
//
unsigned long sendsize = 32;
BOOL
bNoDelay
=
TRUE
;
fd_set
fs
;
...
...
@@ -646,14 +985,12 @@ int QFmClient::SendCtrlInfo2Proxy()
#endif
return
-
1
;
}
return
0
;
}
int
QFmClient
::
RecvAndCheckDataFromSock
(
int
sock
,
int
flag
,
int
type
)
//type = 0 proxy re, = 1 pos re
{
int
recbytes
,
finLen
,
curPos
=
0
,
prosLen
=
0
,
checkCount
=
0
;
int
i
=
0
;
do
{
char
*
precvBuf
;
...
...
@@ -685,7 +1022,7 @@ int QFmClient::RecvAndCheckDataFromSock(int sock, int flag, int type) //type =
precvBuf
=
DecodeRecvData
(
_tempbuf
,
recbytes
,
&
recbytes
);
}
qDebug
()
<<
"received data from
socket "
<<
sock
<<
" :
"
<<
precvBuf
;
qDebug
()
<<
"received data from
proxy "
<<
sock
<<
" :
\n
"
<<
precvBuf
;
while
(
0
<
recbytes
)
{
...
...
@@ -768,7 +1105,7 @@ int QFmClient::CheckRecvedData()
return
0
;
}
int
QFmClient
::
ProcessZhProxyRspDataAndSend2Pos
()
int
QFmClient
::
ProcessZhProxyRspDataAndSend2Pos
(
int
nType
)
{
int
rlt
,
length
;
...
...
@@ -784,7 +1121,24 @@ int QFmClient::ProcessZhProxyRspDataAndSend2Pos()
//! TODO: 转换JSON
rlt
=
SendSocketData
(
_acceptedSock
,
_recvbuf
,
length
,
0
);
QByteArray
recvdata
(
_recvbuf
);
QJsonParseError
json_error
;
QJsonDocument
doc
=
QJsonDocument
::
fromJson
(
recvdata
,
&
json_error
);
QJsonObject
object
=
doc
.
object
();
ConvertResponseJsonFormat
(
object
,
nType
);
QString
str
=
QString
(
QJsonDocument
(
object
).
toJson
(
QJsonDocument
::
Compact
));
QByteArray
byteArray
=
str
.
toLocal8Bit
();
const
char
*
temp
=
byteArray
.
data
();
size_t
st
=
strlen
(
temp
);
char
*
pResponse
=
new
char
[
st
+
1
];
strcpy
(
pResponse
,
temp
);
length
=
st
;
rlt
=
SendSocketData
(
_acceptedSock
,
pResponse
,
length
,
0
);
delete
pResponse
;
if
(
rlt
!=
length
)
{
...
...
@@ -818,7 +1172,7 @@ void QFmClient::run()
emit
Error
(
"Init QFmClient failed"
);
}
qDebug
()
<<
"Init success"
;
qDebug
()
<<
"Init
QFmClient
success"
;
do
{
CloseSocket
(
&
_acceptedSock
);
...
...
@@ -831,12 +1185,10 @@ void QFmClient::run()
WaitAndSleep
(
3000
);
continue
;
}
do
{
int
rlt
,
needBackup
;
int
rlt
,
needBackup
=
1
;
int
nResult
=
0
;
if
(
!
WaitForConnectReqFromPos
())
{
break
;
...
...
@@ -845,29 +1197,32 @@ void QFmClient::run()
if
(
0
!=
WaitAndReadDataFromPos
(
1
,
0
))
{
CloseSocket
(
&
_acceptedSock
);
continue
;
}
QJsonObject
object
;
char
temp_recv
[
MAX_BUF_LEN
]
=
{
0
};
strcpy
(
temp_recv
,
_recvbuf
);
n
eedBackup
=
ProcessPosReqData
(
object
);
n
Result
=
ProcessPosReqData
(
object
);
if
(
0
>
n
eedBackup
)
if
(
0
>
n
Result
)
{
CloseSocket
(
&
_acceptedSock
);
qDebug
()
<<
"ProcessPosReqData error"
;
continue
;
}
if
(
nResult
==
SET_STORE_INFO
)
{
sendSetResponseToPos
(
true
);
CloseSocket
(
&
_acceptedSock
);
continue
;
}
if
(
0
!=
Try2ConnectZhProxy
())
{
qDebug
()
<<
"connect to proxy failed"
;
CloseSocket
(
&
_acceptedSock
);
continue
;
}
if
(
0
!=
SendCtrlInfo2Proxy
())
{
CloseSocket
(
&
_acceptedSock
);
...
...
@@ -882,7 +1237,7 @@ void QFmClient::run()
if
(
0
==
rlt
)
{
rlt
=
ProcessZhProxyRspDataAndSend2Pos
();
rlt
=
ProcessZhProxyRspDataAndSend2Pos
(
nResult
);
}
CloseSocket
(
&
_zhProxySock
);
...
...
@@ -891,17 +1246,13 @@ void QFmClient::run()
{
if
(
1
==
needBackup
)
{
//is write off data, need to check roll back
BackupPosReq
(
temp_recv
);
//BackupPosReq(temp_recv);
break
;
}
CloseSocket
(
&
_acceptedSock
);
}
CloseSocket
(
&
_acceptedSock
);
}
while
(
1
);
WaitAndSleep
(
3000
);
}
while
(
!
_endflag
);
qDebug
()
<<
"Exit ZH Client!
\r\n
"
;
...
...
@@ -909,7 +1260,6 @@ void QFmClient::run()
#ifdef WIN32
WSACleanup
();
#endif
}
void
QFmClient
::
CloseSocket
(
int
*
sock
)
...
...
qfmclient.h
View file @
81dd0ace
...
...
@@ -12,18 +12,20 @@
#define MAX_REQ_COUNT 25600
#define ROLL_BACK_FILE_NAME "fmclient.rbk"
#define SET_STORE_INFO 1000 //设置门店信息
#define FREEMUD_PAY 10031 //非码支付
#define QUERY_PAY 10030 //支付查询
#define REFUND_PAY 10041 //支付退款
class
QFmClient
:
public
QThread
{
Q_OBJECT
public
:
QFmClient
(
QObject
*
parent
=
NULL
);
void
run
();
bool
Init
(
QString
proxy_IP
,
unsigned
short
proxy_port
,
unsigned
short
listen_prot
,
unsigned
short
long_timeout
,
unsigned
short
short_timeout
);
bool
InitStoreInfo
();
signals
:
void
Error
(
QString
error
);
private
:
...
...
@@ -36,9 +38,17 @@ private:
void
WaitAndSleep
(
int
elapse
);
bool
WaitForConnectReqFromPos
();
int
ProcessPosReqData
(
QJsonObject
&
object
);
bool
ConvertJsonFormat
(
QJsonObject
&
object
);
//convert pos requst json format from 非码支付插件 API 对接说明.pdf to 非码支付FMClient商户版_20170921.pdf
void
GetStoreInfo
(
QJsonObject
&
object
);
//获取门店信息
void
sendResponseToPos
(
int
nflag
);
bool
ConvertRequestJsonFormat
(
QJsonObject
&
object
);
//convert pos request json format from 非码支付插件 API 对接说明.pdf to 非码支付FMClient商户版_20170921.pdf
bool
ConvertResponseJsonFormat
(
QJsonObject
&
object
,
int
nType
);
void
SetStoreInfo
(
QJsonObject
&
object
);
//设置门店信息
void
FreemudPay
(
QJsonObject
&
object
);
//非码支付
bool
QueryPay
(
QJsonObject
&
object
);
//支付查询
bool
RefundPay
(
QJsonObject
&
object
);
//支付退款
bool
FreemudPayResponse
(
QJsonObject
&
object
);
//非码支付回复处理
bool
QueryPayResponse
(
QJsonObject
&
object
);
//支付查询回复处理
bool
RefundPayResponse
(
QJsonObject
&
object
);
//支付退款回复处理
void
sendSetResponseToPos
(
bool
bFlag
);
void
AddReqCount
(
QJsonObject
&
object
);
int
CheckIsCompleteJsonData
(
int
*
count
,
char
*
data
);
int
RecvSockData
(
int
sock
,
char
*
buffer
,
int
length
);
...
...
@@ -51,17 +61,15 @@ private:
char
*
EncodeSendData
(
char
*
buf
,
int
length
,
int
*
eLength
);
int
SendData2ZhProxyAndWaitRspData
();
int
RecvAndCheckDataFromSock
(
int
sock
,
int
flag
,
int
type
);
int
ProcessZhProxyRspDataAndSend2Pos
();
int
ProcessZhProxyRspDataAndSend2Pos
(
int
nType
);
int
CheckRecvedData
();
void
BackupPosReq
(
char
*
req
);
private
:
private
:
bool
_endflag
;
char
_recvbuf
[
MAX_BUF_LEN
];
char
_tempbuf
[
MAX_BUF_LEN
];
char
_sendbuf
[
MAX_BUF_LEN
];
char
_codeBuf
[
MAX_BUF_LEN
];
unsigned
char
_codeKey
[
MAX_CODE_KEY
];
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment