Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
jinli gu
Jeepay
Commits
63bbef99
Commit
63bbef99
authored
Jul 19, 2021
by
terrfly
Browse files
Merge remote-tracking branch 'origin/dev' into master
parents
48c5d532
49edc927
Changes
39
Show whitespace changes
Inline
Side-by-side
jeepay-merchant/src/main/java/com/jeequan/jeepay/mch/ctrl/merchant/MchAppController.java
View file @
63bbef99
...
...
@@ -57,15 +57,9 @@ public class MchAppController extends CommonCtrl {
@GetMapping
public
ApiRes
list
()
{
MchApp
mchApp
=
getObject
(
MchApp
.
class
);
mchApp
.
setMchNo
(
getCurrentMchNo
());
LambdaQueryWrapper
<
MchApp
>
wrapper
=
MchApp
.
gw
();
wrapper
.
eq
(
MchApp:
:
getMchNo
,
getCurrentMchNo
());
if
(
StringUtils
.
isNotEmpty
(
mchApp
.
getAppId
()))
wrapper
.
eq
(
MchApp:
:
getAppId
,
mchApp
.
getAppId
());
if
(
StringUtils
.
isNotEmpty
(
mchApp
.
getAppName
()))
wrapper
.
eq
(
MchApp:
:
getAppName
,
mchApp
.
getAppName
());
if
(
mchApp
.
getState
()
!=
null
)
wrapper
.
eq
(
MchApp:
:
getState
,
mchApp
.
getState
());
wrapper
.
orderByDesc
(
MchApp:
:
getCreatedAt
);
IPage
<
MchApp
>
pages
=
mchAppService
.
page
(
getIPage
(
true
),
wrapper
);
IPage
<
MchApp
>
pages
=
mchAppService
.
selectPage
(
getIPage
(
true
),
mchApp
);
return
ApiRes
.
ok
(
pages
);
}
...
...
@@ -97,7 +91,7 @@ public class MchAppController extends CommonCtrl {
@PreAuthorize
(
"hasAnyAuthority('ENT_MCH_APP_VIEW', 'ENT_MCH_APP_EDIT')"
)
@GetMapping
(
"/{appId}"
)
public
ApiRes
detail
(
@PathVariable
(
"appId"
)
String
appId
)
{
MchApp
mchApp
=
mchAppService
.
ge
tById
(
appId
);
MchApp
mchApp
=
mchAppService
.
selec
tById
(
appId
);
if
(
mchApp
==
null
||
!
mchApp
.
getMchNo
().
equals
(
getCurrentMchNo
()))
{
return
ApiRes
.
fail
(
ApiCodeEnum
.
SYS_OPERATION_FAIL_SELETE
);
...
...
jeepay-merchant/src/main/java/com/jeequan/jeepay/mch/ctrl/merchant/MchPayInterfaceConfigController.java
View file @
63bbef99
...
...
@@ -17,17 +17,24 @@ package com.jeequan.jeepay.mch.ctrl.merchant;
import
com.alibaba.fastjson.JSONObject
;
import
com.jeequan.jeepay.core.aop.MethodLog
;
import
com.jeequan.jeepay.core.constants.ApiCodeEnum
;
import
com.jeequan.jeepay.core.constants.CS
;
import
com.jeequan.jeepay.core.entity.MchApp
;
import
com.jeequan.jeepay.core.entity.MchInfo
;
import
com.jeequan.jeepay.core.entity.PayInterfaceConfig
;
import
com.jeequan.jeepay.core.entity.PayInterfaceDefine
;
import
com.jeequan.jeepay.core.exception.BizException
;
import
com.jeequan.jeepay.core.model.ApiRes
;
import
com.jeequan.jeepay.core.model.params.NormalMchParams
;
import
com.jeequan.jeepay.core.mq.MqCommonService
;
import
com.jeequan.jeepay.core.utils.JsonKit
;
import
com.jeequan.jeepay.core.utils.StringKit
;
import
com.jeequan.jeepay.mch.ctrl.CommonCtrl
;
import
com.jeequan.jeepay.service.impl.MchAppService
;
import
com.jeequan.jeepay.service.impl.MchInfoService
;
import
com.jeequan.jeepay.service.impl.PayInterfaceConfigService
;
import
com.jeequan.jeepay.service.impl.SysConfigService
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.web.bind.annotation.*
;
...
...
@@ -49,6 +56,8 @@ public class MchPayInterfaceConfigController extends CommonCtrl {
@Autowired
private
PayInterfaceConfigService
payInterfaceConfigService
;
@Autowired
private
MchInfoService
mchInfoService
;
@Autowired
private
MqCommonService
mqCommonService
;
@Autowired
private
MchAppService
mchAppService
;
@Autowired
private
SysConfigService
sysConfigService
;
/**
* @Author: ZhuXiao
...
...
@@ -78,9 +87,25 @@ public class MchPayInterfaceConfigController extends CommonCtrl {
@GetMapping
(
"/{appId}/{ifCode}"
)
public
ApiRes
getByMchNo
(
@PathVariable
(
value
=
"appId"
)
String
appId
,
@PathVariable
(
value
=
"ifCode"
)
String
ifCode
)
{
PayInterfaceConfig
payInterfaceConfig
=
payInterfaceConfigService
.
getByInfoIdAndIfCode
(
CS
.
INFO_TYPE_MCH_APP
,
appId
,
ifCode
);
if
(
payInterfaceConfig
!=
null
&&
payInterfaceConfig
.
getIfRate
()
!=
null
)
{
if
(
payInterfaceConfig
!=
null
)
{
// 费率转换为百分比数值
if
(
payInterfaceConfig
.
getIfRate
()
!=
null
)
{
payInterfaceConfig
.
setIfRate
(
payInterfaceConfig
.
getIfRate
().
multiply
(
new
BigDecimal
(
"100"
)));
}
// 敏感数据脱敏
if
(
StringUtils
.
isNotBlank
(
payInterfaceConfig
.
getIfParams
()))
{
MchInfo
mchInfo
=
mchInfoService
.
getById
(
getCurrentMchNo
());
// 普通商户的支付参数执行数据脱敏
if
(
mchInfo
.
getType
()
==
CS
.
MCH_TYPE_NORMAL
)
{
NormalMchParams
mchParams
=
NormalMchParams
.
factory
(
payInterfaceConfig
.
getIfCode
(),
payInterfaceConfig
.
getIfParams
());
if
(
mchParams
!=
null
)
{
payInterfaceConfig
.
setIfParams
(
mchParams
.
deSenData
());
}
}
}
}
return
ApiRes
.
ok
(
payInterfaceConfig
);
}
...
...
@@ -117,6 +142,9 @@ public class MchPayInterfaceConfigController extends CommonCtrl {
//若配置存在,为saveOrUpdate添加ID,第一次配置添加创建者
if
(
dbRecoed
!=
null
)
{
payInterfaceConfig
.
setId
(
dbRecoed
.
getId
());
// 合并支付参数
payInterfaceConfig
.
setIfParams
(
StringKit
.
marge
(
dbRecoed
.
getIfParams
(),
payInterfaceConfig
.
getIfParams
()));
}
else
{
payInterfaceConfig
.
setCreatedUid
(
userId
);
payInterfaceConfig
.
setCreatedBy
(
realName
);
...
...
@@ -133,4 +161,25 @@ public class MchPayInterfaceConfigController extends CommonCtrl {
return
ApiRes
.
ok
();
}
/** 查询支付宝商户授权URL **/
@GetMapping
(
"/alipayIsvsubMchAuthUrls/{mchAppId}"
)
public
ApiRes
queryAlipayIsvsubMchAuthUrl
(
@PathVariable
String
mchAppId
)
{
MchApp
mchApp
=
mchAppService
.
getById
(
mchAppId
);
if
(
mchApp
==
null
||
!
mchApp
.
getMchNo
().
equals
(
getCurrentMchNo
()))
{
return
ApiRes
.
fail
(
ApiCodeEnum
.
SYS_OPERATION_FAIL_SELETE
);
}
MchInfo
mchInfo
=
mchInfoService
.
getById
(
mchApp
.
getMchNo
());
String
authUrl
=
sysConfigService
.
getDBApplicationConfig
().
genAlipayIsvsubMchAuthUrl
(
mchInfo
.
getIsvNo
(),
mchAppId
);
String
authQrImgUrl
=
sysConfigService
.
getDBApplicationConfig
().
genScanImgUrl
(
authUrl
);
JSONObject
result
=
new
JSONObject
();
result
.
put
(
"authUrl"
,
authUrl
);
result
.
put
(
"authQrImgUrl"
,
authQrImgUrl
);
return
ApiRes
.
ok
(
result
);
}
}
jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/alipay/ctrl/AlipayBizController.java
0 → 100644
View file @
63bbef99
/*
* Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com.jeequan.jeepay.pay.channel.alipay.ctrl
;
import
cn.hutool.core.util.URLUtil
;
import
com.alibaba.fastjson.JSONObject
;
import
com.alipay.api.domain.AlipayOpenAuthTokenAppModel
;
import
com.alipay.api.request.AlipayOpenAuthTokenAppRequest
;
import
com.alipay.api.response.AlipayOpenAuthTokenAppResponse
;
import
com.jeequan.jeepay.core.constants.CS
;
import
com.jeequan.jeepay.core.ctrls.AbstractCtrl
;
import
com.jeequan.jeepay.core.entity.MchApp
;
import
com.jeequan.jeepay.core.entity.PayInterfaceConfig
;
import
com.jeequan.jeepay.core.exception.BizException
;
import
com.jeequan.jeepay.core.model.params.alipay.AlipayConfig
;
import
com.jeequan.jeepay.core.model.params.alipay.AlipayIsvParams
;
import
com.jeequan.jeepay.core.mq.MqCommonService
;
import
com.jeequan.jeepay.core.utils.JsonKit
;
import
com.jeequan.jeepay.pay.channel.alipay.AlipayKit
;
import
com.jeequan.jeepay.pay.model.AlipayClientWrapper
;
import
com.jeequan.jeepay.pay.model.IsvConfigContext
;
import
com.jeequan.jeepay.pay.service.ConfigContextService
;
import
com.jeequan.jeepay.service.impl.MchAppService
;
import
com.jeequan.jeepay.service.impl.PayInterfaceConfigService
;
import
com.jeequan.jeepay.service.impl.SysConfigService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.web.bind.annotation.PathVariable
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
java.io.IOException
;
import
java.math.BigDecimal
;
/**
* 渠道侧自定义业务ctrl
*
* @author terrfly
* @site https://www.jeepay.vip
* @date 2021/7/15 11:49
*/
@Slf4j
@Controller
@RequestMapping
(
"/api/channelbiz/alipay"
)
public
class
AlipayBizController
extends
AbstractCtrl
{
@Autowired
private
ConfigContextService
configContextService
;
@Autowired
private
SysConfigService
sysConfigService
;
@Autowired
private
PayInterfaceConfigService
payInterfaceConfigService
;
@Autowired
private
MqCommonService
mqCommonService
;
@Autowired
private
MchAppService
mchAppService
;
/** 跳转到支付宝的授权页面 (统一从pay项目获取到isv配置信息)
* isvAndMchNo 格式: ISVNO_MCHAPPID
* example: https://pay.jeepay.cn/api/channelbiz/alipay/redirectAppToAppAuth/V1623998765_60cc41694ee0e6685f57eb1f
* **/
@RequestMapping
(
"/redirectAppToAppAuth/{isvAndMchAppId}"
)
public
void
redirectAppToAppAuth
(
@PathVariable
(
"isvAndMchAppId"
)
String
isvAndMchAppId
)
throws
IOException
{
String
isvNo
=
isvAndMchAppId
.
split
(
"_"
)[
0
];
IsvConfigContext
isvConfigContext
=
configContextService
.
getIsvConfigContext
(
isvNo
);
AlipayIsvParams
alipayIsvParams
=
isvConfigContext
.
getIsvParamsByIfCode
(
CS
.
IF_CODE
.
ALIPAY
,
AlipayIsvParams
.
class
);
alipayIsvParams
.
getSandbox
();
String
oauthUrl
=
AlipayConfig
.
PROD_APP_TO_APP_AUTH_URL
;
if
(
alipayIsvParams
.
getSandbox
()
!=
null
&&
alipayIsvParams
.
getSandbox
()
==
CS
.
YES
){
oauthUrl
=
AlipayConfig
.
SANDBOX_APP_TO_APP_AUTH_URL
;
}
String
redirectUrl
=
sysConfigService
.
getDBApplicationConfig
().
getPaySiteUrl
()
+
"/api/channelbiz/alipay/appToAppAuthCallback"
;
response
.
sendRedirect
(
String
.
format
(
oauthUrl
,
alipayIsvParams
.
getAppId
(),
URLUtil
.
encode
(
redirectUrl
),
isvAndMchAppId
));
}
/** 支付宝授权回调地址 **/
@RequestMapping
(
"/appToAppAuthCallback"
)
public
String
appToAppAuthCallback
()
{
String
errMsg
=
null
;
boolean
isAlipaySysAuth
=
true
;
//是否 服务商登录支付宝后台系统发起的商户授权, 此时无法获取authCode和商户的信息。
try
{
// isvAndMchAppId 格式: ISVNO_MCHAPPID, 如果isvAndMchNo为空说明是: 支付宝后台的二维码授权之后的跳转链接。
String
isvAndMchAppId
=
getValString
(
"state"
);
String
appAuthCode
=
getValString
(
"app_auth_code"
);
// 支付宝授权code
if
(
StringUtils
.
isNotEmpty
(
isvAndMchAppId
)
&&
StringUtils
.
isNotEmpty
(
appAuthCode
)){
isAlipaySysAuth
=
false
;
String
isvNo
=
isvAndMchAppId
.
split
(
"_"
)[
0
];
String
mchAppId
=
isvAndMchAppId
.
split
(
"_"
)[
1
];
AlipayClientWrapper
alipayClientWrapper
=
configContextService
.
getIsvConfigContext
(
isvNo
).
getAlipayClientWrapper
();
AlipayOpenAuthTokenAppRequest
request
=
new
AlipayOpenAuthTokenAppRequest
();
AlipayOpenAuthTokenAppModel
model
=
new
AlipayOpenAuthTokenAppModel
();
model
.
setGrantType
(
"authorization_code"
);
model
.
setCode
(
appAuthCode
);
request
.
setBizModel
(
model
);
// expiresIn: 该字段已作废,应用令牌长期有效,接入方不需要消费该字段
// reExpiresIn: 刷新令牌的有效时间(从接口调用时间作为起始时间),单位到秒
// DateUtil.offsetSecond(new Date(), Integer.parseInt(resp.getExpiresIn()));
AlipayOpenAuthTokenAppResponse
resp
=
alipayClientWrapper
.
execute
(
request
);
if
(!
resp
.
isSuccess
()){
throw
new
BizException
(
AlipayKit
.
appendErrMsg
(
resp
.
getMsg
(),
resp
.
getSubMsg
()));
}
String
appAuthToken
=
resp
.
getAppAuthToken
();
JSONObject
ifParams
=
new
JSONObject
();
ifParams
.
put
(
"appAuthToken"
,
appAuthToken
);
ifParams
.
put
(
"refreshToken"
,
resp
.
getAppRefreshToken
());
ifParams
.
put
(
"expireTimestamp"
,
resp
.
getExpiresIn
());
PayInterfaceConfig
dbRecord
=
payInterfaceConfigService
.
getByInfoIdAndIfCode
(
CS
.
INFO_TYPE_MCH_APP
,
mchAppId
,
CS
.
IF_CODE
.
ALIPAY
);
if
(
dbRecord
!=
null
){
PayInterfaceConfig
updateRecord
=
new
PayInterfaceConfig
();
updateRecord
.
setId
(
dbRecord
.
getId
());
updateRecord
.
setIfParams
(
ifParams
.
toJSONString
());
payInterfaceConfigService
.
updateById
(
updateRecord
);
}
else
{
dbRecord
=
new
PayInterfaceConfig
();
dbRecord
.
setInfoType
(
CS
.
INFO_TYPE_MCH_APP
);
dbRecord
.
setInfoId
(
mchAppId
);
dbRecord
.
setIfCode
(
CS
.
IF_CODE
.
ALIPAY
);
dbRecord
.
setIfParams
(
ifParams
.
toJSONString
());
dbRecord
.
setIfRate
(
new
BigDecimal
(
"0.006"
));
//默认费率
dbRecord
.
setState
(
CS
.
YES
);
dbRecord
.
setCreatedBy
(
"SYS"
);
dbRecord
.
setCreatedUid
(
0L
);
payInterfaceConfigService
.
save
(
dbRecord
);
}
MchApp
mchApp
=
mchAppService
.
getById
(
mchAppId
);
JSONObject
jsonObject
=
JsonKit
.
newJson
(
"mchNo"
,
mchApp
.
getMchNo
());
jsonObject
.
put
(
"appId"
,
mchApp
.
getAppId
());
mqCommonService
.
send
(
jsonObject
.
toJSONString
(),
CS
.
MQ
.
MQ_TYPE_MODIFY_MCH_APP
);
// 推送mq到目前节点进行更新数据
}
}
catch
(
Exception
e
)
{
log
.
error
(
"error"
,
e
);
errMsg
=
StringUtils
.
defaultIfBlank
(
e
.
getMessage
(),
"系统异常!"
);
}
request
.
setAttribute
(
"errMsg"
,
errMsg
);
request
.
setAttribute
(
"isAlipaySysAuth"
,
isAlipaySysAuth
);
return
"channel/alipay/isvsubMchAuth"
;
}
}
jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/wxpay/WxpayPaymentService.java
View file @
63bbef99
...
...
@@ -27,6 +27,7 @@ import com.jeequan.jeepay.pay.rqrs.AbstractRS;
import
com.jeequan.jeepay.pay.rqrs.payorder.UnifiedOrderRQ
;
import
com.jeequan.jeepay.pay.util.PaywayUtil
;
import
com.jeequan.jeepay.pay.model.MchAppConfigContext
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.stereotype.Service
;
/*
...
...
@@ -93,8 +94,10 @@ public class WxpayPaymentService extends AbstractPaymentService {
if
(
mchAppConfigContext
.
isIsvsubMch
()){
WxpayIsvsubMchParams
isvsubMchParams
=
mchAppConfigContext
.
getIsvsubMchParamsByIfCode
(
getIfCode
(),
WxpayIsvsubMchParams
.
class
);
request
.
setSubMchId
(
isvsubMchParams
.
getSubMchId
());
if
(
StringUtils
.
isNotBlank
(
isvsubMchParams
.
getSubMchAppId
()))
{
request
.
setSubAppId
(
isvsubMchParams
.
getSubMchAppId
());
}
}
return
request
;
}
...
...
@@ -128,7 +131,9 @@ public class WxpayPaymentService extends AbstractPaymentService {
reqJSON
.
put
(
"sp_appid"
,
wxPayService
.
getConfig
().
getAppId
());
reqJSON
.
put
(
"sp_mchid"
,
wxPayService
.
getConfig
().
getMchId
());
reqJSON
.
put
(
"sub_mchid"
,
isvsubMchParams
.
getSubMchId
());
if
(
StringUtils
.
isNotBlank
(
isvsubMchParams
.
getSubMchAppId
()))
{
reqJSON
.
put
(
"sub_appid"
,
isvsubMchParams
.
getSubMchAppId
());
}
}
else
{
// 普通商户
reqJSON
.
put
(
"appid"
,
wxPayService
.
getConfig
().
getAppId
());
reqJSON
.
put
(
"mchid"
,
wxPayService
.
getConfig
().
getMchId
());
...
...
jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/wxpay/kits/WxpayV3Util.java
View file @
63bbef99
...
...
@@ -27,6 +27,7 @@ import com.github.binarywang.wxpay.v3.auth.PrivateKeySigner;
import
com.github.binarywang.wxpay.v3.auth.WxPayCredentials
;
import
com.github.binarywang.wxpay.v3.auth.WxPayValidator
;
import
com.github.binarywang.wxpay.v3.util.PemUtils
;
import
com.github.binarywang.wxpay.v3.util.SignUtils
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.http.HttpStatus
;
import
org.apache.http.client.config.RequestConfig
;
...
...
@@ -71,9 +72,9 @@ public class WxpayV3Util {
ISV_URL_MAP
.
put
(
WxPayConstants
.
TradeType
.
MWEB
,
"/v3/pay/partner/transactions/h5"
);
}
public
static
JSONObject
unifiedOrderV3
(
String
u
rl
,
JSONObject
reqJSON
,
WxPayConfig
wxPayConfig
)
throws
WxPayException
{
String
response
=
postV3
(
PAY_BASE_URL
+
u
rl
,
reqJSON
.
toJSONString
(),
wxPayConfig
);
return
JSON
.
parseObject
(
response
);
public
static
JSONObject
unifiedOrderV3
(
String
reqU
rl
,
JSONObject
reqJSON
,
WxPayConfig
wxPayConfig
)
throws
WxPayException
{
String
response
=
postV3
(
PAY_BASE_URL
+
reqU
rl
,
reqJSON
.
toJSONString
(),
wxPayConfig
);
return
JSON
Object
.
parseObject
(
getPayInfo
(
response
,
wxPayConfig
)
);
}
public
static
JSONObject
queryOrderV3
(
String
url
,
WxPayConfig
wxPayConfig
)
throws
WxPayException
{
...
...
@@ -215,4 +216,59 @@ public class WxpayV3Util {
return
httpPost
;
}
public
static
String
getPayInfo
(
String
response
,
WxPayConfig
wxPayConfig
)
throws
WxPayException
{
try
{
JSONObject
resJSON
=
JSON
.
parseObject
(
response
);
String
timestamp
=
String
.
valueOf
(
System
.
currentTimeMillis
()
/
1000L
);
String
nonceStr
=
SignUtils
.
genRandomStr
();
String
prepayId
=
resJSON
.
getString
(
"prepay_id"
);
switch
(
wxPayConfig
.
getTradeType
())
{
case
WxPayConstants
.
TradeType
.
JSAPI
:
{
Map
<
String
,
String
>
payInfo
=
new
HashMap
<>();
// 如果用JsonObject会出现签名错误
payInfo
.
put
(
"appId"
,
wxPayConfig
.
getAppId
());
payInfo
.
put
(
"timeStamp"
,
timestamp
);
payInfo
.
put
(
"nonceStr"
,
nonceStr
);
payInfo
.
put
(
"package"
,
"prepay_id="
+
prepayId
);
payInfo
.
put
(
"signType"
,
"RSA"
);
String
beforeSign
=
String
.
format
(
"%s\n%s\n%s\n%s\n"
,
wxPayConfig
.
getAppId
(),
timestamp
,
nonceStr
,
"prepay_id="
+
prepayId
);
payInfo
.
put
(
"paySign"
,
SignUtils
.
sign
(
beforeSign
,
PemUtils
.
loadPrivateKey
(
new
FileInputStream
(
wxPayConfig
.
getPrivateKeyPath
()))));
// 签名以后在增加prepayId参数
payInfo
.
put
(
"prepayId"
,
prepayId
);
return
JSON
.
toJSONString
(
payInfo
);
}
case
WxPayConstants
.
TradeType
.
MWEB
:
{
return
response
;
}
case
WxPayConstants
.
TradeType
.
APP
:
{
Map
<
String
,
String
>
payInfo
=
new
HashMap
<>();
// APP支付绑定的是微信开放平台上的账号,APPID为开放平台上绑定APP后发放的参数
String
wxAppId
=
wxPayConfig
.
getSubAppId
();
// 此map用于参与调起sdk支付的二次签名,格式全小写,timestamp只能是10位,格式固定,切勿修改
String
partnerId
=
wxPayConfig
.
getSubMchId
();
String
packageValue
=
"Sign=WXPay"
;
// 此map用于客户端与微信服务器交互
String
beforeSign
=
String
.
format
(
"%s\n%s\n%s\n%s\n"
,
wxAppId
,
timestamp
,
nonceStr
,
"prepay_id="
+
prepayId
);
payInfo
.
put
(
"sign"
,
SignUtils
.
sign
(
beforeSign
,
PemUtils
.
loadPrivateKey
(
new
FileInputStream
(
wxPayConfig
.
getPrivateKeyPath
()))));
payInfo
.
put
(
"prepayId"
,
prepayId
);
payInfo
.
put
(
"partnerId"
,
partnerId
);
payInfo
.
put
(
"appId"
,
wxAppId
);
payInfo
.
put
(
"package"
,
packageValue
);
payInfo
.
put
(
"timeStamp"
,
timestamp
);
payInfo
.
put
(
"nonceStr"
,
nonceStr
);
return
JSON
.
toJSONString
(
payInfo
);
}
case
WxPayConstants
.
TradeType
.
NATIVE
:
return
response
;
default
:
return
null
;
}
}
catch
(
Exception
e
)
{
throw
(
e
instanceof
WxPayException
)
?
(
WxPayException
)
e
:
new
WxPayException
(
e
.
getMessage
(),
e
);
}
}
}
jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/wxpay/paywayV3/WxApp.java
View file @
63bbef99
...
...
@@ -23,12 +23,12 @@ import com.jeequan.jeepay.core.entity.PayOrder;
import
com.jeequan.jeepay.pay.channel.wxpay.WxpayPaymentService
;
import
com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayKit
;
import
com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayV3Util
;
import
com.jeequan.jeepay.pay.model.MchAppConfigContext
;
import
com.jeequan.jeepay.pay.rqrs.AbstractRS
;
import
com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg
;
import
com.jeequan.jeepay.pay.rqrs.payorder.UnifiedOrderRQ
;
import
com.jeequan.jeepay.pay.rqrs.payorder.payway.WxAppOrderRS
;
import
com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg
;
import
com.jeequan.jeepay.pay.util.ApiResBuilder
;
import
com.jeequan.jeepay.pay.model.MchAppConfigContext
;
import
org.springframework.stereotype.Service
;
/*
...
...
@@ -50,6 +50,7 @@ public class WxApp extends WxpayPaymentService {
public
AbstractRS
pay
(
UnifiedOrderRQ
rq
,
PayOrder
payOrder
,
MchAppConfigContext
mchAppConfigContext
)
{
WxPayService
wxPayService
=
mchAppConfigContext
.
getWxServiceWrapper
().
getWxPayService
();
wxPayService
.
getConfig
().
setTradeType
(
WxPayConstants
.
TradeType
.
APP
);
// 构造请求数据
JSONObject
reqJSON
=
buildV3OrderRequest
(
payOrder
,
mchAppConfigContext
);
...
...
jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/wxpay/paywayV3/WxH5.java
View file @
63bbef99
...
...
@@ -24,13 +24,13 @@ import com.jeequan.jeepay.core.entity.PayOrder;
import
com.jeequan.jeepay.pay.channel.wxpay.WxpayPaymentService
;
import
com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayKit
;
import
com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayV3Util
;
import
com.jeequan.jeepay.pay.model.MchAppConfigContext
;
import
com.jeequan.jeepay.pay.rqrs.AbstractRS
;
import
com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg
;
import
com.jeequan.jeepay.pay.rqrs.payorder.UnifiedOrderRQ
;
import
com.jeequan.jeepay.pay.rqrs.payorder.payway.WxH5OrderRQ
;
import
com.jeequan.jeepay.pay.rqrs.payorder.payway.WxH5OrderRS
;
import
com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg
;
import
com.jeequan.jeepay.pay.util.ApiResBuilder
;
import
com.jeequan.jeepay.pay.model.MchAppConfigContext
;
import
org.springframework.stereotype.Service
;
/*
...
...
@@ -54,6 +54,7 @@ public class WxH5 extends WxpayPaymentService {
WxH5OrderRQ
bizRQ
=
(
WxH5OrderRQ
)
rq
;
WxPayService
wxPayService
=
mchAppConfigContext
.
getWxServiceWrapper
().
getWxPayService
();
wxPayService
.
getConfig
().
setTradeType
(
WxPayConstants
.
TradeType
.
MWEB
);
// 构造请求数据
JSONObject
reqJSON
=
buildV3OrderRequest
(
payOrder
,
mchAppConfigContext
);
...
...
jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/wxpay/paywayV3/WxJsapi.java
View file @
63bbef99
...
...
@@ -23,13 +23,13 @@ import com.jeequan.jeepay.core.entity.PayOrder;
import
com.jeequan.jeepay.pay.channel.wxpay.WxpayPaymentService
;
import
com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayKit
;
import
com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayV3Util
;
import
com.jeequan.jeepay.pay.model.MchAppConfigContext
;
import
com.jeequan.jeepay.pay.rqrs.AbstractRS
;
import
com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg
;
import
com.jeequan.jeepay.pay.rqrs.payorder.UnifiedOrderRQ
;
import
com.jeequan.jeepay.pay.rqrs.payorder.payway.WxJsapiOrderRQ
;
import
com.jeequan.jeepay.pay.rqrs.payorder.payway.WxJsapiOrderRS
;
import
com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg
;
import
com.jeequan.jeepay.pay.util.ApiResBuilder
;
import
com.jeequan.jeepay.pay.model.MchAppConfigContext
;
import
org.springframework.stereotype.Service
;
/*
...
...
@@ -57,16 +57,15 @@ public class WxJsapi extends WxpayPaymentService {
// 构造请求数据
JSONObject
reqJSON
=
buildV3OrderRequest
(
payOrder
,
mchAppConfigContext
);
String
reqUrl
;
// 请求地址
wxPayService
.
getConfig
().
setTradeType
(
WxPayConstants
.
TradeType
.
JSAPI
);
String
reqUrl
;
if
(
mchAppConfigContext
.
isIsvsubMch
()){
// 特约商户
reqUrl
=
WxpayV3Util
.
ISV_URL_MAP
.
get
(
WxPayConstants
.
TradeType
.
JSAPI
);
JSONObject
payer
=
new
JSONObject
();
payer
.
put
(
"sp_openid"
,
bizRQ
.
getOpenid
());
reqJSON
.
put
(
"payer"
,
payer
);
}
else
{
reqUrl
=
WxpayV3Util
.
NORMALMCH_URL_MAP
.
get
(
WxPayConstants
.
TradeType
.
JSAPI
);
JSONObject
payer
=
new
JSONObject
();
payer
.
put
(
"openid"
,
bizRQ
.
getOpenid
());
reqJSON
.
put
(
"payer"
,
payer
);
...
...
jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/wxpay/paywayV3/WxLite.java
View file @
63bbef99
...
...
@@ -23,13 +23,13 @@ import com.jeequan.jeepay.core.entity.PayOrder;
import
com.jeequan.jeepay.pay.channel.wxpay.WxpayPaymentService
;
import
com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayKit
;
import
com.jeequan.jeepay.pay.channel.wxpay.kits.WxpayV3Util
;
import
com.jeequan.jeepay.pay.model.MchAppConfigContext
;
import
com.jeequan.jeepay.pay.rqrs.AbstractRS
;
import
com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg
;
import
com.jeequan.jeepay.pay.rqrs.payorder.UnifiedOrderRQ
;
import
com.jeequan.jeepay.pay.rqrs.payorder.payway.WxJsapiOrderRQ
;
import
com.jeequan.jeepay.pay.rqrs.payorder.payway.WxJsapiOrderRS
;
import
com.jeequan.jeepay.pay.rqrs.msg.ChannelRetMsg
;
import
com.jeequan.jeepay.pay.util.ApiResBuilder
;
import
com.jeequan.jeepay.pay.model.MchAppConfigContext
;
import
org.springframework.stereotype.Service
;
/*
...
...
@@ -57,6 +57,8 @@ public class WxLite extends WxpayPaymentService {
// 构造请求数据
JSONObject
reqJSON
=
buildV3OrderRequest
(
payOrder
,
mchAppConfigContext
);
wxPayService
.
getConfig
().
setTradeType
(
WxPayConstants
.
TradeType
.
JSAPI
);
String
reqUrl
;
// 请求地址
if
(
mchAppConfigContext
.
isIsvsubMch
()){
// 特约商户
reqUrl
=
WxpayV3Util
.
ISV_URL_MAP
.
get
(
WxPayConstants
.
TradeType
.
JSAPI
);
...
...
jeepay-payment/src/main/java/com/jeequan/jeepay/pay/channel/wxpay/paywayV3/WxNative.java
View file @
63bbef99
...
...
@@ -58,7 +58,8 @@ public class WxNative extends WxpayPaymentService {
// 构造请求数据
JSONObject
reqJSON
=
buildV3OrderRequest
(
payOrder
,
mchAppConfigContext
);
String
reqUrl
;
// 请求地址
wxPayService
.
getConfig
().
setTradeType
(
WxPayConstants
.
TradeType
.
NATIVE
);
String
reqUrl
;
if
(
mchAppConfigContext
.
isIsvsubMch
()){
// 特约商户
reqUrl
=
WxpayV3Util
.
ISV_URL_MAP
.
get
(
WxPayConstants
.
TradeType
.
NATIVE
);
}
else
{
...
...
jeepay-payment/src/main/java/com/jeequan/jeepay/pay/mq/ActiveMqMessage.java
View file @
63bbef99
...
...
@@ -22,6 +22,7 @@ import com.jeequan.jeepay.pay.mq.receive.MqReceiveCommon;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.activemq.ScheduledMessage
;
import
org.apache.activemq.command.ActiveMQQueue
;
import
org.apache.activemq.command.ActiveMQTopic
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Qualifier
;
import
org.springframework.context.annotation.Bean
;
...
...
@@ -75,6 +76,16 @@ public class ActiveMqMessage extends MqCommonService {
@Qualifier
(
"activePayOrderMchNotifyInner"
)
private
Queue
mqQueue4PayOrderMchNotifyInner
;
@Bean
(
"activeMqSendModifyMchApp"
)
public
ActiveMQTopic
mqTopic4ModifyMchApp
(){
return
new
ActiveMQTopic
(
CS
.
MQ
.
TOPIC_MODIFY_MCH_APP
);
}
@Lazy
@Autowired
@Qualifier
(
"activeMqSendModifyMchApp"
)
private
ActiveMQTopic
mqTopic4ModifyMchApp
;
/**
* 发送消息
* @param msg
...
...
@@ -86,6 +97,8 @@ public class ActiveMqMessage extends MqCommonService {
channelOrderQuery
(
msg
);
}
else
if
(
sendType
.
equals
(
CS
.
MQ
.
MQ_TYPE_PAY_ORDER_MCH_NOTIFY
))
{
payOrderMchNotify
(
msg
);
}
else
if
(
sendType
.
equals
(
CS
.
MQ
.
MQ_TYPE_MODIFY_MCH_APP
))
{
// 商户应用修改
this
.
jmsTemplate
.
convertAndSend
(
mqTopic4ModifyMchApp
,
msg
);
}
}
...
...
jeepay-payment/src/main/java/com/jeequan/jeepay/pay/mq/RabbitMqMessage.java
View file @
63bbef99
...
...
@@ -53,6 +53,8 @@ public class RabbitMqMessage extends MqCommonService {
channelOrderQuery
(
msg
);
}
else
if
(
sendType
.
equals
(
CS
.
MQ
.
MQ_TYPE_PAY_ORDER_MCH_NOTIFY
))
{
payOrderMchNotify
(
msg
);
}
else
if
(
sendType
.
equals
(
CS
.
MQ
.
MQ_TYPE_MODIFY_MCH_APP
))
{
// 商户应用修改
directModifyMchApp
(
msg
);
}
}
...
...
@@ -91,6 +93,12 @@ public class RabbitMqMessage extends MqCommonService {
});
}
/** 发送商户应用修改消息 **/
public
void
directModifyMchApp
(
String
msg
)
{
rabbitTemplate
.
convertAndSend
(
CS
.
DIRECT_EXCHANGE
,
CS
.
MQ
.
TOPIC_MODIFY_MCH_APP
,
msg
);
}
/** 接收 查单消息 **/
@RabbitListener
(
queues
=
CS
.
MQ
.
QUEUE_CHANNEL_ORDER_QUERY
)
public
void
receiveChannelOrderQuery
(
String
msg
)
{
...
...
jeepay-payment/src/main/java/com/jeequan/jeepay/pay/mq/RocketMqMessage.java
View file @
63bbef99
...
...
@@ -57,6 +57,8 @@ public class RocketMqMessage extends MqCommonService {
channelOrderQuery
(
msg
);
}
else
if
(
sendType
.
equals
(
CS
.
MQ
.
MQ_TYPE_PAY_ORDER_MCH_NOTIFY
))
{
payOrderMchNotify
(
msg
);
}
else
if
(
sendType
.
equals
(
CS
.
MQ
.
MQ_TYPE_MODIFY_MCH_INFO
))
{
// 商户信息修改
modifyMchInfo
(
msg
);
}
}
...
...
@@ -127,4 +129,17 @@ public class RocketMqMessage extends MqCommonService {
mqReceiveCommon
.
payOrderMchNotify
(
msg
);
}
}
/** 发送商户信息修改消息 **/
public
void
modifyMchInfo
(
String
msg
)
{
sendMsg
(
msg
,
CS
.
MQ
.
TOPIC_MODIFY_MCH_INFO
);
}
public
void
sendMsg
(
String
msg
,
String
group
)
{
// 这里的分组和消息名称未做区分
rocketMQTemplate
.
getProducer
().
setProducerGroup
(
group
);
this
.
rocketMQTemplate
.
convertAndSend
(
group
,
msg
);
}
}
jeepay-payment/src/main/resources/templates/channel/alipay/isvsubMchAuth.ftl
0 → 100644
View file @
63bbef99
<!
DOCTYPE
html>
<
html
>
<
head
>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>授权提示</title>
<link rel="stylesheet" href="https://cdn.staticfile.org/layui/2.4.3/css/layui.css">
<style>
.mainDiv1
{
color
:
lightseagreen
;
text-align
:
center
;
margin-top
:
50
px
;
}
.mainDiv2
{
text-align
:
center
;
margin-top
:
10
px
;
}
.mainDiv3
{
text-align
:
center
;
margin-top
:
200
px
;
}
.mainDivTitle
{
text-align
:
center
;
margin-top
:
20
px
;
color
:
orangered
}
</style>
</
head
>
<
body
>
<#
if
errMsg != null >
<div class="mainDiv1 layui-fluid">
<i class="layui-icon" style="font-size:100px; color:orangered">ဇ</i>
</div>
<div class="mainDiv2 layui-fluid">
<span style="font-size:16px; ">授权失败</span>
<div class="mainDivTitle layui-fluid">
<span style="font-size:14px">错误提示:$
{
errMsg
!''
}
</span>
</div>
</div>
<#
else
>
<div class="mainDiv1 layui-fluid">
<i class="layui-icon" style="font-size:100px;">စ</i>
</div>
<div class="mainDiv2 layui-fluid">
<span style="font-size:16px">授权成功</span>
</div>
<#if isAlipaySysAuth>
<div class="mainDivTitle layui-fluid">
<span style="font-size:14px">提示: 请联系您的 [服务商]
登录支付宝管理平台获取 [<span style="font-style: oblique">授权Token</span>] 进行下一步配置!</span>
</div>
</#if>
</#
if
>
<
div
class="mainDiv3 layui-fluid">
<a class="layui-btn layui-btn-primary closeBtn">关闭页面</a>
</
div
>
<
script
src="https://cdn.staticfile.org/layui/2.4.3/layui.min.js"></script>
<
script
>
layui.use(['jquery'], function()
{
layui
.$
(
".closeBtn"
)
.click
(
function
(){
var
ua
=
navigator
.userAgent.toLowerCase
()
;
if
(
ua
.match
(
/
M
icroMessenger
/
i
)
==
"micromessenger"
)
{
W
eixinJSBridge
.call
(
'
closeWindow
'
)
;
}
else
if
(
ua
.indexOf
(
"alipay"
)
!=
-1
){
A
lipayJSBridge
.call
(
'
closeWebview
'
)
;
}
else
{
window
.close
()
;
}
})
;
}
);
</
script
>
</
body
>
</
html
>
jeepay-service/src/main/java/com/jeequan/jeepay/service/impl/MchAppService.java
View file @
63bbef99
package
com.jeequan.jeepay.service.impl
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.jeequan.jeepay.core.constants.ApiCodeEnum
;
import
com.jeequan.jeepay.core.constants.CS
;
...
...
@@ -8,7 +10,9 @@ import com.jeequan.jeepay.core.entity.MchPayPassage;
import
com.jeequan.jeepay.core.entity.PayInterfaceConfig
;
import
com.jeequan.jeepay.core.entity.PayOrder
;
import
com.jeequan.jeepay.core.exception.BizException
;
import
com.jeequan.jeepay.core.utils.StringKit
;
import
com.jeequan.jeepay.service.mapper.MchAppMapper
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
...
...
@@ -49,4 +53,30 @@ public class MchAppService extends ServiceImpl<MchAppMapper, MchApp> {
throw
new
BizException
(
ApiCodeEnum
.
SYS_OPERATION_FAIL_DELETE
);
}
}
public
MchApp
selectById
(
String
appId
)
{
MchApp
mchApp
=
this
.
getById
(
appId
);
if
(
mchApp
==
null
)
{
return
null
;
}
mchApp
.
setAppSecret
(
StringKit
.
str2Star
(
mchApp
.
getAppSecret
(),
6
,
6
,
6
));
return
mchApp
;
}
public
IPage
<
MchApp
>
selectPage
(
IPage
iPage
,
MchApp
mchApp
)
{
LambdaQueryWrapper
<
MchApp
>
wrapper
=
MchApp
.
gw
();
if
(
StringUtils
.
isNotBlank
(
mchApp
.
getMchNo
()))
wrapper
.
eq
(
MchApp:
:
getMchNo
,
mchApp
.
getMchNo
());
if
(
StringUtils
.
isNotEmpty
(
mchApp
.
getAppId
()))
wrapper
.
eq
(
MchApp:
:
getAppId
,
mchApp
.
getAppId
());
if
(
StringUtils
.
isNotEmpty
(
mchApp
.
getAppName
()))
wrapper
.
eq
(
MchApp:
:
getAppName
,
mchApp
.
getAppName
());
if
(
mchApp
.
getState
()
!=
null
)
wrapper
.
eq
(
MchApp:
:
getState
,
mchApp
.
getState
());
wrapper
.
orderByDesc
(
MchApp:
:
getCreatedAt
);
IPage
<
MchApp
>
pages
=
this
.
page
(
iPage
,
wrapper
);
pages
.
getRecords
().
stream
().
forEach
(
item
->
item
.
setAppSecret
(
StringKit
.
str2Star
(
item
.
getAppSecret
(),
6
,
6
,
6
)));
return
pages
;
}
}
jeepay-service/src/main/java/com/jeequan/jeepay/service/impl/PayInterfaceConfigService.java
View file @
63bbef99
...
...
@@ -127,6 +127,7 @@ public class PayInterfaceConfigService extends ServiceImpl<PayInterfaceConfigMap
.
isNotNull
(
PayInterfaceConfig:
:
getIfParams
));
for
(
PayInterfaceConfig
config
:
isvConfigList
)
{
config
.
addExt
(
"mchType"
,
mchInfo
.
getType
());
isvPayConfigMap
.
put
(
config
.
getIfCode
(),
config
);
}
}
...
...
jeepay-service/src/main/java/com/jeequan/jeepay/service/mapper/MchPayPassageMapper.xml
View file @
63bbef99
...
...
@@ -18,7 +18,7 @@
<!-- 根据支付方式查询可用的支付接口列表 -->
<select
id=
"selectAvailablePayInterfaceList"
resultType=
"com.alibaba.fastjson.JSONObject"
parameterType=
"java.util.Map"
>
select pid.if_code ifCode, pid.if_name ifName, pid.bg_color bgColor, pid.icon icon, pic.if_params ifParams, pic.if_rate ifRate from t_pay_interface_define pid
select pid.if_code ifCode, pid.if_name ifName,
pid.config_page_type configPageType,
pid.bg_color bgColor, pid.icon icon, pic.if_params ifParams, pic.if_rate ifRate from t_pay_interface_define pid
inner join t_pay_interface_config pic on pid.if_code = pic.if_code
where JSON_CONTAINS(pid.way_codes, JSON_OBJECT('wayCode', #{wayCode}))
and pid.state = 1
...
...
jeepay-service/src/main/java/com/jeequan/jeepay/service/mapper/PayInterfaceDefineMapper.xml
View file @
63bbef99
...
...
@@ -8,6 +8,7 @@
<result
column=
"if_name"
property=
"ifName"
/>
<result
column=
"is_mch_mode"
property=
"isMchMode"
/>
<result
column=
"is_isv_mode"
property=
"isIsvMode"
/>
<result
column=
"config_page_type"
property=
"configPageType"
/>
<result
column=
"isv_params"
property=
"isvParams"
/>
<result
column=
"isvsub_mch_params"
property=
"isvsubMchParams"
/>
<result
column=
"normal_mch_params"
property=
"normalMchParams"
/>
...
...
pom.xml
View file @
63bbef99
...
...
@@ -16,7 +16,7 @@
<parent>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-parent
</artifactId>
<version>
2.4.
5
</version>
<version>
2.4.
8
</version>
</parent>
<!-- 声明子项目 -->
...
...
@@ -37,14 +37,14 @@
<properties>
<java.version>
1.8
</java.version>
<!-- 指定java版本号 -->
<project.build.sourceEncoding>
UTF-8
</project.build.sourceEncoding>
<!-- 项目构建输出编码 -->
<isys.version>
1.
3
.0
</isys.version>
<!-- 指定当前[项目]版本号 -->
<isys.version>
1.
4
.0
</isys.version>
<!-- 指定当前[项目]版本号 -->
<!-- 其他工具包 -->
<jeepay.sdk.java.version>
1.1.0
</jeepay.sdk.java.version>
<fastjson.version>
1.2.76
</fastjson.version>
<!-- fastjson -->
<mybatis.plus.starter.version>
3.4.2
</mybatis.plus.starter.version>
<!-- mybatis plus -->
<hutool.util.version>
5.6.6
</hutool.util.version>
<!-- hutool -->
<spring.security.version>
5.4.
6
</spring.security.version>
<!-- 用于core的scope依赖 -->
<spring.security.version>
5.4.
7
</spring.security.version>
<!-- 用于core的scope依赖 -->
<jjwt.version>
0.9.1
</jjwt.version>
<binarywang.weixin.java.version>
4.1.0
</binarywang.weixin.java.version>
<rocketmq.spring.boot.starter.version>
2.0.3
</rocketmq.spring.boot.starter.version>
...
...
Prev
1
2
Next
Write
Preview
Supports
Markdown
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