Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Z
zhichan
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
蒋勇
zhichan
Commits
a4ba3e12
Commit
a4ba3e12
authored
Jan 12, 2020
by
王栋源
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wdy
parent
9a6967b6
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
526 additions
and
0 deletions
+526
-0
center-app/app/base/api/impl/payment/paymentApi.js
+63
-0
center-app/app/base/service/impl/utilsSve/utilstlbankSve.js
+463
-0
No files found.
center-app/app/base/api/impl/payment/paymentApi.js
0 → 100644
View file @
a4ba3e12
var
APIBase
=
require
(
"../../api.base"
);
var
system
=
require
(
"../../../system"
);
class
PaymentAPI
extends
APIBase
{
constructor
()
{
super
();
this
.
utilstlbankSve
=
system
.
getObject
(
"service.utilsSve.utilstlbankSve"
);
}
async
test
(
pobj
,
query
,
req
)
{
// var tmp = await this.orderSve.createLicense(pobj.action_body);
return
system
.
getResultSuccess
({
req
:
"ok"
});
}
async
h5payment
(
p
,
o
,
r
){
var
a
=
await
this
.
utilstlbankSve
.
getH5Url
(
o
.
app_id
,
o
.
order_num
,
o
.
total_fee
,
null
,
o
.
body_desc
,
null
,
o
.
opType
);
return
a
;
}
async
getQrCode
(
pobj
,
o
,
r
){
var
rtn
=
await
this
.
utilstlbankSve
.
getQrCode
(
pobj
.
actionBody
.
uapp_id
,
pobj
.
actionBody
.
order_num
,
pobj
.
actionBody
.
total_fee
,
pobj
.
actionBody
.
body_desc
,
pobj
.
actionBody
.
opType
);
return
rtn
;
}
async
queryOrder
(
pobj
,
o
,
r
){
var
rtn
=
await
this
.
utilstlbankSve
.
queryOrder
(
pobj
.
actionBody
.
uapp_id
,
pobj
.
actionBody
.
trxid
);
return
rtn
;
}
async
receiveCallBackNotify
(
pobj
,
o
,
r
){
var
rtn
=
await
this
.
utilstlbankSve
.
receiveCallBackNotify
(
pobj
.
actionBody
.
parmas
,
pobj
.
client_ip
);
return
rtn
;
}
exam
()
{
return
""
;
}
classDesc
()
{
return
{
groupName
:
""
,
groupDesc
:
""
,
name
:
""
,
desc
:
""
,
exam
:
""
,
};
}
methodDescs
()
{
return
[
{
methodDesc
:
""
,
methodName
:
""
,
paramdescs
:
[
{
paramDesc
:
""
,
paramName
:
""
,
paramType
:
""
,
defaultValue
:
""
,
}
],
rtnTypeDesc
:
""
,
rtnType
:
""
}
];
}
}
module
.
exports
=
PaymentAPI
;
\ No newline at end of file
center-app/app/base/service/impl/utilsSve/utilstlbankSve.js
0 → 100644
View file @
a4ba3e12
var
System
=
require
(
"../../../system"
);
var
settings
=
require
(
"../../../../config/settings"
);
// const uiconfig = System.getUiConfig2(settings.wxconfig.appId);
// const logCtl = System.getObject("web.oplogCtl");
// const cacheManager = System.getObject("db.cacheManager");
const
querystring
=
require
(
'querystring'
);
// var moment = require("moment");
const
md5
=
require
(
"MD5"
);
class
utilsTlBankSve
{
constructor
()
{
this
.
wxMethod
=
"W01"
;
//微信订单支付
this
.
aliMethod
=
"A01"
;
//阿里订单支付
this
.
notifyUrl
=
"https://igirl.gongsibao.com/api/tl/zxNotify"
;
this
.
restClient
=
System
.
getObject
(
"util.restClient"
);
this
.
oplogDao
=
System
.
getObject
(
"db.common.oplogDao"
);
}
async
getpaymentinfo
(
appid
)
{
var
sql
=
"select * from p_app_payparam where uapp_id="
+
appid
;
var
appinfo
=
await
this
.
oplogDao
.
customQuery
(
sql
);
if
(
appinfo
)
{
console
.
log
(
appinfo
);
return
appinfo
[
0
];
}
else
{
return
null
}
}
async
getappinfo
(
appid
)
{
var
sql
=
"select * from p_app where uapp_id="
+
appid
;
var
appinfo
=
await
this
.
oplogDao
.
customQuery
(
sql
);
if
(
appinfo
)
{
console
.
log
(
appinfo
);
return
appinfo
[
0
];
}
else
{
return
null
}
}
//-------------------------------------------h5支付-----------------开始
/**
* 唤起H5支付---只供简单应用
* @param {*} company_id 公司ID
* @param {*} pay_title 支付显示标题
* @param {*} total_sum 支付金额
* @param {*} order_no 订单号
* @param {*} returl 支付成功后返回的url
*/
async
getH5Url
(
app_id
,
pay_title
,
total_sum
,
order_no
,
returl
)
{
// appid:00000003,商户号(mch_id):990440148166000,md5key(pay_key):a0ea3fa20dbd7bb4d5abf1d59d63bae8
// var payParam = await this.companypayparamDao.getOneByCompanyId(company_id, 1);
var
payParam
=
await
this
.
getpaymentinfo
(
app_id
);
if
(
!
payParam
)
{
return
{
status
:
-
210
,
msg
:
"公司没有对应的支付凭证"
}
}
var
timestamp
=
Date
.
now
();
var
jsonObj
=
{
appid
:
payParam
.
pay_appid
,
cusid
:
payParam
.
mch_id
,
version
:
12
,
trxamt
:
total_sum
,
//单位为分
reqsn
:
order_no
,
//order_num + "_" + company_id.toString(),
charset
:
"UTF-8"
,
returl
:
returl
,
notify_url
:
payParam
.
notifyUrl
||
this
.
notifyUrl
,
body
:
pay_title
,
remark
:
"h5paypagesywdy"
,
randomstr
:
timestamp
.
toString
()
//随机字符串,不长于32位
}
var
param_result
=
await
this
.
getReqBeforeParam
(
jsonObj
,
"1352105537612345789"
);
if
(
param_result
.
status
!=
0
)
{
return
param_result
;
}
var
paramStr
=
Object
.
keys
(
jsonObj
).
sort
().
map
(
key
=>
{
return
`
${
encodeURIComponent
(
key
)}
=
${
encodeURIComponent
(
jsonObj
[
key
])}
`
}).
join
(
'&'
);
return
{
status
:
0
,
payUrl
:
"https://syb.allinpay.com/apiweb/h5unionpay/unionorder?"
+
paramStr
};
}
//-------------------------------------------h5支付-----------------结束
//----------------------------------------------------------------------------------------请求银行接口开始---------------------------------------------------
/*
company_id:公司id、
order_num:订单号、
total_fee:订单金额单位为分、
product_id:产品id、
body_desc:内容描述(可以是产品名称)、
create_ip:创建ip、
opType:操作类型,1微信、2支付宝
返回错误码:成功为1
返回错误码:成功为1
-210:公司没有对应的支付凭证
-230:请求参数信息为空
-250:请求组装签名参数信息为空
-280:请求结算接口返回失败
-310:返回值信息data为空
-230:返回值参数信息为空
-250:返回值组装签名参数信息为空
-280:返回值签名验证失败
-400:请求接口请求返回值错误
-410:请求结算接口返回空
*/
async
getQrCode
(
app_id
,
order_num
,
total_fee
,
body_desc
,
opType
)
{
//获取微信支付二维码
// var payParam = await this.companypayparamDao.getOneByCompanyId(company_id, 1);
var
payParam
=
await
this
.
getpaymentinfo
(
app_id
);
if
(
!
payParam
)
{
return
{
status
:
-
210
,
msg
:
"公司没有对应的支付凭证"
}
}
var
reqMethod
=
this
.
wxMethod
;
if
(
opType
==
"alipay"
)
{
reqMethod
=
this
.
aliMethod
;
}
var
timestamp
=
Date
.
now
();
var
jsonObj
=
{
appid
:
payParam
.
pay_appid
,
cusid
:
payParam
.
mch_id
,
trxamt
:
total_fee
,
//单位为分
reqsn
:
"qft"
+
order_num
+
"_"
+
app_id
.
toString
(),
paytype
:
reqMethod
,
randomstr
:
timestamp
.
toString
(),
//随机字符串,不长于32位
body
:
body_desc
,
notify_url
:
this
.
notifyUrl
,
}
var
param_result
=
await
this
.
getReqBeforeParam
(
jsonObj
,
payParam
.
pay_key
);
if
(
param_result
.
status
!=
0
)
{
return
param_result
;
}
var
reqUrl
=
payParam
.
pay_url
+
"/pay"
;
var
result
=
await
this
.
execReqInfo
(
"getQrCode"
,
reqUrl
,
param_result
.
req_param
);
if
(
result
.
status
!=
0
)
{
return
result
;
}
var
signResult
=
await
this
.
resultSign
(
result
.
data
,
payParam
.
pay_key
);
if
(
signResult
.
status
!=
0
)
{
return
signResult
;
}
result
.
data
=
{
payinfo
:
result
.
data
.
payinfo
,
reqsn
:
result
.
data
.
reqsn
,
//商户订单号
chnltrxid
:
result
.
data
.
chnltrxid
,
// 支付渠道交易单号,如支付宝,微信平台的交易单号
trxid
:
result
.
data
.
trxid
,
// 交易单号,平台的交易流水号
// 交易状态,0000:交易成功、1001:交易不存在、
//2008或者2000 : 交易处理中,请查询交易,如果是实时交易(例如刷卡支付,交易撤销,退货),建议每隔一段时间(10秒)查询交易、
//3888-流水号重复、其他3开头的错误码代表交易失败
trxstatus
:
result
.
data
.
trxstatus
,
fintime
:
result
.
data
.
fintime
,
// 交易完成时间 yyyyMMddHHmmss
errmsg
:
result
.
data
.
errmsg
,
// 错误原因
};
return
result
;
}
async
getReqBeforeParam
(
jsonObj
,
pay_key
)
{
//获取请求前的参数信息
jsonObj
.
key
=
pay_key
;
var
reqResult
=
{
status
:
0
,
msg
:
"ok"
,
req_param
:
null
};
var
signArr
=
[];
var
keys
=
Object
.
keys
(
jsonObj
).
sort
();
if
(
keys
.
length
==
0
)
{
reqResult
.
status
=
-
230
;
reqResult
.
msg
=
"请求参数信息为空"
;
return
reqResult
;
}
for
(
let
k
=
0
;
k
<
keys
.
length
;
k
++
)
{
const
tKey
=
keys
[
k
];
if
(
tKey
!=
"sign"
&&
jsonObj
[
tKey
])
{
signArr
.
push
(
tKey
+
"="
+
jsonObj
[
tKey
]);
}
}
if
(
signArr
.
length
==
0
)
{
reqResult
.
status
=
-
250
;
reqResult
.
msg
=
"请求组装签名参数信息为空"
;
return
reqResult
;
}
var
signStr
=
signArr
.
join
(
"&"
);
var
tmpSign
=
md5
(
signStr
).
toUpperCase
();
jsonObj
.
sign
=
tmpSign
;
delete
jsonObj
[
"key"
];
reqResult
.
req_param
=
jsonObj
;
return
reqResult
;
}
async
resultSign
(
resultData
,
pay_key
)
{
//返回值进行验签
var
rtnResult
=
{
status
:
0
,
msg
:
"SUCCESS"
};
if
(
!
resultData
||
!
resultData
.
appid
)
{
rtnResult
.
status
=
-
310
;
rtnResult
.
msg
=
"返回值信息data为空"
;
return
rtnResult
;
}
resultData
.
key
=
pay_key
;
var
resultSignArr
=
[];
var
keys
=
Object
.
keys
(
resultData
).
sort
();
if
(
keys
.
length
==
0
)
{
rtnResult
.
status
=
-
330
;
rtnResult
.
msg
=
"返回值参数信息为空"
;
return
rtnResult
;
}
for
(
let
k
=
0
;
k
<
keys
.
length
;
k
++
)
{
const
tKey
=
keys
[
k
];
if
(
tKey
!=
"sign"
&&
resultData
[
tKey
])
{
resultSignArr
.
push
(
tKey
+
"="
+
resultData
[
tKey
]);
}
}
if
(
resultSignArr
.
length
==
0
)
{
rtnResult
.
status
=
-
350
;
rtnResult
.
msg
=
"返回值组装签名参数信息为空"
;
return
rtnResult
;
}
var
resultSignStr
=
resultSignArr
.
join
(
"&"
);
var
resultTmpSign
=
md5
(
resultSignStr
).
toUpperCase
();
delete
resultData
[
"key"
];
if
(
resultData
.
sign
!=
resultTmpSign
)
{
rtnResult
.
status
=
-
380
;
rtnResult
.
msg
=
"返回值签名验证失败"
;
return
rtnResult
;
}
return
rtnResult
;
}
async
execReqInfo
(
self_method_name
,
reqUrl
,
param
)
{
try
{
var
req_param
=
querystring
.
stringify
(
param
);
var
rtn
=
await
this
.
restClient
.
execPost2
(
req_param
,
reqUrl
);
var
rtnResult
=
{
status
:
0
,
msg
:
"SUCCESS"
,
data
:
{}
};
if
(
rtn
&&
rtn
.
stdout
)
{
var
tmpResult
=
JSON
.
parse
(
rtn
.
stdout
);
if
(
tmpResult
.
retcode
==
"FAIL"
)
{
rtnResult
.
status
=
-
400
;
rtnResult
.
msg
=
tmpResult
.
retmsg
;
}
else
{
rtnResult
.
data
=
tmpResult
;
}
}
else
{
rtnResult
.
status
=
-
410
;
rtnResult
.
msg
=
'请求结算接口返回空'
;
}
return
rtnResult
;
}
catch
(
e
)
{
throw
new
Error
(
e
.
stack
);
}
}
/*
company_id:公司id、
order_num:订单号、
opType:操作类型,1微信、2支付宝
返回错误码:成功为1
-210:公司没有对应的支付凭证
-230:请求参数信息为空
-250:请求组装签名参数信息为空
-280:请求结算接口返回失败
-310:返回值信息data为空
-230:返回值参数信息为空
-250:返回值组装签名参数信息为空
-280:返回值签名验证失败
-400:请求接口请求返回值错误
-410:请求结算接口返回空
*/
async
queryOrder
(
uapp_id
,
trxid
)
{
//查询订单支付状态
var
payParam
=
await
this
.
getpaymentinfo
(
uapp_id
);
if
(
!
payParam
)
{
return
{
status
:
-
210
,
msg
:
"公司没有对应的支付凭证"
}
}
var
timestamp
=
Date
.
now
();
var
jsonObj
=
{
appid
:
payParam
.
pay_appid
,
cusid
:
payParam
.
mch_id
,
// reqsn: order_num + "_" + uapp_id.toString(),//reqsn和trxid必填其一
trxid
:
trxid
,
//平台交易流水
randomstr
:
timestamp
.
toString
(),
//随机字符串,不长于32位
}
var
param_result
=
await
this
.
getReqBeforeParam
(
jsonObj
,
payParam
.
pay_key
);
if
(
param_result
.
status
!=
0
)
{
return
param_result
;
}
var
reqUrl
=
payParam
.
pay_url
+
"/query"
;
console
.
log
(
param_result
.
req_param
,
"data............"
);
var
result
=
await
this
.
execReqInfo
(
"queryOrder"
,
reqUrl
,
param_result
.
req_param
);
if
(
result
.
status
!=
0
)
{
return
result
;
}
var
signResult
=
await
this
.
resultSign
(
result
.
data
,
payParam
.
pay_key
);
if
(
signResult
.
status
!=
0
)
{
return
signResult
;
}
result
.
data
=
{
trxcode
:
result
.
data
.
trxcode
,
//交易类型,VSP501 微信支付、VSP511 支付宝支付
trxamt
:
result
.
data
.
trxamt
,
//交易金额 单位为分
reqsn
:
result
.
data
.
reqsn
,
//商户订单号
chnltrxid
:
result
.
data
.
chnltrxid
,
// 支付渠道交易单号,如支付宝,微信平台的交易单号
trxid
:
result
.
data
.
trxid
,
// 交易单号,平台的交易流水号
// 交易状态,0000:交易成功、1001:交易不存在、
//2008或者2000 : 交易处理中,请查询交易,如果是实时交易(例如刷卡支付,交易撤销,退货),建议每隔一段时间(10秒)查询交易、
//3888-流水号重复、其他3开头的错误码代表交易失败
trxstatus
:
result
.
data
.
trxstatus
,
fintime
:
result
.
data
.
fintime
,
// 交易完成时间 yyyyMMddHHmmss
errmsg
:
result
.
data
.
errmsg
,
// 错误原因
};
return
result
;
}
async
getReqBeforeParam
(
jsonObj
,
pay_key
)
{
//获取请求前的参数信息
jsonObj
.
key
=
pay_key
;
var
reqResult
=
{
status
:
0
,
msg
:
"ok"
,
req_param
:
null
};
var
signArr
=
[];
var
keys
=
Object
.
keys
(
jsonObj
).
sort
();
if
(
keys
.
length
==
0
)
{
reqResult
.
status
=
-
230
;
reqResult
.
msg
=
"请求参数信息为空"
;
return
reqResult
;
}
for
(
let
k
=
0
;
k
<
keys
.
length
;
k
++
)
{
const
tKey
=
keys
[
k
];
if
(
tKey
!=
"sign"
&&
jsonObj
[
tKey
])
{
signArr
.
push
(
tKey
+
"="
+
jsonObj
[
tKey
]);
}
}
if
(
signArr
.
length
==
0
)
{
reqResult
.
status
=
-
250
;
reqResult
.
msg
=
"请求组装签名参数信息为空"
;
return
reqResult
;
}
var
signStr
=
signArr
.
join
(
"&"
);
var
tmpSign
=
md5
(
signStr
).
toUpperCase
();
jsonObj
.
sign
=
tmpSign
;
delete
jsonObj
[
"key"
];
reqResult
.
req_param
=
jsonObj
;
return
reqResult
;
}
async
receiveCallBackNotify
(
parmas
,
client_ip
)
{
//收到通联回调通知---post请求
var
result
=
"FAIL"
;
try
{
if
(
!
parmas
)
{
result
=
"回调parmas中参数信息为空"
;
return
result
;
}
var
isVerify
=
await
this
.
verifyCallBackParams
(
parmas
);
if
(
isVerify
)
{
result
=
isVerify
;
return
result
;
}
let
attachList
=
[];
if
(
parmas
.
cusorderid
.
indexOf
(
"_"
)
>=
0
)
{
attachList
=
parmas
.
cusorderid
.
split
(
"_"
);
}
else
{
attachList
.
push
(
parmas
.
cusorderid
);
}
if
(
attachList
.
length
<
2
)
{
result
=
"回调cusorderid参数错误,没有_标识"
;
return
result
;
}
var
uappid
=
attachList
.
length
==
2
?
attachList
[
1
]
:
attachList
[
2
];
var
payParam
=
await
this
.
getpaymentinfo
(
uappid
);
if
(
!
payParam
)
{
result
.
return_msg
=
"回调公司没有对应的支付凭证"
;
return
jsonBuilder
.
buildObject
(
result
);
}
var
appinfo
=
await
this
.
getappinfo
(
uappid
);
if
(
!
appinfo
)
{
result
.
return_msg
=
"回调公司没有对应的支付凭证"
;
return
jsonBuilder
.
buildObject
(
result
);
}
var
signResult
=
await
this
.
resultSign
(
parmas
,
payParam
.
pay_key
);
if
(
signResult
.
status
!=
0
)
{
result
=
signResult
.
msg
;
return
result
;
}
//解析支付参数
parmas
.
out_trade_no
=
attachList
[
0
].
substr
(
3
);
parmas
.
uappid
=
attachList
.
length
==
2
?
attachList
[
1
]
:
attachList
[
2
];
//重写新签名
var
newparmas
=
await
this
.
getReqBeforeParam
(
parmas
,
appinfo
.
upp_secret
);
var
backResult
=
await
this
.
execReqInfo
(
null
,
payParam
.
notify_url
,
newparmas
);
if
(
backResult
.
status
!=
0
)
{
result
=
backResult
.
msg
;
return
result
;
}
return
result
;
}
catch
(
e
)
{
result
=
"回调业务处理---error异常"
;
return
result
;
}
}
async
verifyCallBackParams
(
getParams
)
{
//验证回调参数
if
(
!
getParams
.
trxcode
)
{
return
"回调trxcode参数为空"
;
}
if
(
getParams
.
trxcode
!=
"VSP501"
&&
getParams
.
trxcode
!=
"VSP511"
)
{
return
"回调trxcode值错误"
;
}
if
(
!
getParams
.
trxstatus
||
getParams
.
trxstatus
!=
"0000"
)
{
return
"回调trxstatus信息为空或不等于0000"
;
}
if
(
!
getParams
.
cusorderid
)
{
return
"回调商户订单号cusorderid参数为空"
;
}
return
""
;
}
async
opBackNotify
(
getParams
,
opDesc
)
{
//操作回调业务逻辑
try
{
//日志记录
logCtl
.
info
({
optitle
:
(
new
Date
()).
Format
(
"yyyy-MM-dd hh:mm:ss"
)
+
":支付回调信息====="
+
opDesc
+
",method="
+
getParams
.
trxcode
,
op
:
"base/service/impl/utilszxbankSve.js/opBackNotify"
,
content
:
JSON
.
stringify
(
getParams
),
clientIp
:
getParams
.
client_ip
||
""
});
//获取充值业务锁
var
locker
=
await
cacheManager
[
"ZxPayLocker"
].
enter
(
getParams
.
trxid
);
if
(
locker
&&
locker
==
"1"
)
{
if
(
getParams
.
trxcode
==
"VSP501"
)
{
getParams
.
req_accountType
=
"wx"
;
}
else
{
getParams
.
req_accountType
=
"alipay"
;
}
// if (getParams.method == "VSP511") {
// getParams.req_accountType="alipay";
// }
return
await
this
.
notifyOpDb
(
getParams
);
}
else
{
// await cacheManager["ZxPayLocker"].release(getParams.trxid);//---测试时放开
logCtl
.
info
({
optitle
:
"通联回调操作频繁---太频繁了,太频繁了"
,
op
:
"/app/config/routes/api.js"
,
content
:
"参数="
+
JSON
.
stringify
(
getParams
),
clientIp
:
getParams
.
client_ip
||
""
});
return
{
status
:
-
510
,
msg
:
"中信回调操作频繁---太频繁了,太频繁了"
};
}
}
catch
(
e
)
{
await
cacheManager
[
"ZxPayLocker"
].
release
(
getParams
.
trxid
);
throw
new
Error
(
e
.
stack
);
}
}
}
module
.
exports
=
utilsTlBankSve
;
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