Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
O
order-group
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
order-group-application
order-group
Commits
44c4bf18
Commit
44c4bf18
authored
Sep 17, 2021
by
ping.wu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
支付实现独立
parent
acff27ca
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
773 additions
and
0 deletions
+773
-0
order-application-service/src/main/java/cn/freemud/service/impl/PayServiceimpl.java
+773
-0
No files found.
order-application-service/src/main/java/cn/freemud/service/impl/PayServiceimpl.java
0 → 100644
View file @
44c4bf18
package
cn
.
freemud
.
service
.
impl
;
import
cn.freemud.adapter.OrderAdapter
;
import
cn.freemud.amp.config.DlPaymentMqConfig
;
import
cn.freemud.amqp.Header
;
import
cn.freemud.amqp.MQAction
;
import
cn.freemud.amqp.MQMessage
;
import
cn.freemud.amqp.MQService
;
import
cn.freemud.base.entity.BaseResponse
;
import
cn.freemud.base.util.DateUtil
;
import
cn.freemud.constant.RedisKeyConstant
;
import
cn.freemud.constant.ResponseCodeConstant
;
import
cn.freemud.entities.dto.SvcComPayRequestDto
;
import
cn.freemud.entities.dto.SvcComPayResponseDto
;
import
cn.freemud.entities.dto.order.CreatePrepayRequestDto
;
import
cn.freemud.entities.dto.pay.CombPayResponse
;
import
cn.freemud.entities.dto.pay.OrderPayResponse
;
import
cn.freemud.entities.dto.pay.PaymentMqMessageDto
;
import
cn.freemud.entities.dto.pay.svc.SVCCardAmountRequestDto
;
import
cn.freemud.entities.dto.pay.svc.SVCCardAmountResponseDto
;
import
cn.freemud.entities.vo.CreateOrderResponseVo
;
import
cn.freemud.entities.vo.CreateOrderVo
;
import
cn.freemud.entities.vo.PaysuccessNoticeMessage
;
import
cn.freemud.enums.OrderMarketType
;
import
cn.freemud.enums.PayChannel
;
import
cn.freemud.enums.PaySuccessSource
;
import
cn.freemud.enums.ResponseResult
;
import
cn.freemud.interceptor.ServiceException
;
import
cn.freemud.redis.RedisCache
;
import
cn.freemud.service.OrderAdapterService
;
import
cn.freemud.service.thirdparty.ComPayClient
;
import
cn.freemud.service.thirdparty.SvcAppClient
;
import
cn.freemud.service.thirdparty.SvcComPayClient
;
import
cn.freemud.utils.AppLogUtil
;
import
cn.freemud.utils.RedisUtil
;
import
cn.freemud.utils.ResponseUtil
;
import
cn.freemud.utils.ValidationCode
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformIappWxappStore
;
import
com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformPartner
;
import
com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformPartnerConfig
;
import
com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformWxapp
;
import
com.freemud.api.assortment.datamanager.manager.AssortmentOpenPlatformIappWxappStoreManager
;
import
com.freemud.api.assortment.datamanager.manager.AssortmentOpenPlatformPartnerConfigManager
;
import
com.freemud.api.assortment.datamanager.manager.AssortmentOpenPlatformPartnerManager
;
import
com.freemud.api.assortment.datamanager.manager.AssortmentOpenPlatformWxappManager
;
import
com.freemud.application.sdk.api.config.TopicExchangeConfig
;
import
com.freemud.application.sdk.api.constant.ResponseResultEnum
;
import
com.freemud.application.sdk.api.log.LogThreadLocal
;
import
com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1
;
import
com.freemud.application.sdk.api.ordercenter.entities.v1.ProductBeanV1
;
import
com.freemud.application.sdk.api.ordercenter.enums.AfterSalesType
;
import
com.freemud.application.sdk.api.ordercenter.enums.OrderClientType
;
import
com.freemud.application.sdk.api.ordercenter.enums.PayChannelType
;
import
com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto
;
import
com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderPayItemResp
;
import
com.freemud.application.sdk.api.paymentcenter.client.request.CodePayRequest
;
import
com.freemud.application.sdk.api.paymentcenter.client.response.CodePayResponse
;
import
com.freemud.application.sdk.api.paymentcenter.client.service.PaymentNewService
;
import
com.freemud.sdk.api.assortment.order.request.order.CancelOrderRequest
;
import
com.freemud.sdk.api.assortment.order.request.order.OrderEditRequest
;
import
com.freemud.sdk.api.assortment.order.request.order.OrderStatusChangeRequestDto
;
import
com.freemud.sdk.api.assortment.order.request.order.PaymentRequest
;
import
com.freemud.sdk.api.assortment.order.request.payment.CombPayRequest
;
import
com.freemud.sdk.api.assortment.order.response.order.BaseOrderResponse
;
import
com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService
;
import
com.freemud.sdk.api.assortment.payment.request.UnifiedOrderRequest
;
import
com.freemud.sdk.api.assortment.payment.response.UnifiedOrderResponse
;
import
com.freemud.sdk.api.assortment.payment.service.StandardPaymentService
;
import
com.google.common.collect.Lists
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang.ObjectUtils
;
import
org.apache.commons.lang.StringUtils
;
import
org.springframework.amqp.core.Message
;
import
org.springframework.amqp.core.MessageProperties
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
java.math.BigDecimal
;
import
java.time.LocalDateTime
;
import
java.time.format.DateTimeFormatter
;
import
java.util.*
;
import
java.util.concurrent.TimeUnit
;
import
java.util.stream.Collectors
;
public
class
PayServiceimpl
{
@Autowired
private
MQService
mqService
;
@Autowired
private
PaymentNewService
paymentNewService
;
@Autowired
private
SvcComPayClient
svcComPayClient
;
@Autowired
private
StandardPaymentService
standardPaymentService
;
@Autowired
private
SvcAppClient
svcAppClient
;
@Autowired
private
ComPayClient
comPayClient
;
@Autowired
private
RedisCache
redisCache
;
@Autowired
private
AssortmentOpenPlatformWxappManager
openPlatformWxappManager
;
@Autowired
private
AssortmentOpenPlatformPartnerManager
assortmentOpenPlatformPartnerManager
;
@Autowired
private
AssortmentOpenPlatformPartnerConfigManager
openPlatformPartnerConfigManager
;
@Autowired
private
AssortmentOpenPlatformIappWxappStoreManager
assortmentOpenPlatformIappWxappStoreManager
;
@Autowired
private
OrderCenterSdkService
orderCenterSdkService
;
@Autowired
private
OrderAdapterService
orderAdapterService
;
@Autowired
private
OrderAdapter
orderAdapter
;
@Value
(
"${saas.reverseNotifyiDcUrl}"
)
private
String
reverseNotifyiDcUrl
;
@Value
(
"${collage.pre_order_pay.goods_tag_list}"
)
private
String
collageGoodsTagList
;
@Value
(
"${collage.pre_order_pay.goods_tag}"
)
private
String
collageGoodsTag
;
@Value
(
"${program.backorders_change_order_status_consumer_queue}"
)
private
String
backOrdersChangeOrderStatusConsumerQueue
;
@Value
(
"${program.backorders_notify_activity_exchange}"
)
private
String
backOrdersNotifyActivityExchange
;
/**
* 创建预支付订单
*/
public
BaseResponse
createPrepayOrder
(
CreatePrepayRequestDto
createPrepayRequestDto
)
{
CreateOrderResponseVo
createOrderResponse
;
OrderPayResponse
orderPayResponse
=
null
;
PaymentRequest
paymentRequest
=
orderBodyConvertToPaymentBody
(
createPrepayRequestDto
.
getOpenId
(),
createPrepayRequestDto
.
getPartnerId
(),
createPrepayRequestDto
.
getWxAppId
(),
createPrepayRequestDto
.
getPayCode
(),
createPrepayRequestDto
.
getFatherOrderBean
().
getShopId
());
long
totalAmount
=
createPrepayRequestDto
.
getTotalAmount
();
String
cardCode
=
createPrepayRequestDto
.
getCardCode
();
String
transId
=
createPrepayRequestDto
.
getTransId
();
if
(
totalAmount
<
0
)
{
throw
new
ServiceException
(
ResponseResult
.
PAY_AMOUNT_ERROR
);
}
else
if
(
totalAmount
>
0
&&
Objects
.
nonNull
(
createPrepayRequestDto
.
getUnionPayCard
()))
{
// 电子风味卡支付
orderPayResponse
=
uSvcPay
(
createPrepayRequestDto
.
getFatherOrderBean
(),
paymentRequest
,
transId
,
LogThreadLocal
.
getTrackingNo
(),
createPrepayRequestDto
.
getUnionPayCard
());
}
else
if
(
totalAmount
>
0
&&
StringUtils
.
isBlank
(
cardCode
))
{
//现金线上支付
String
partnerPayOvertime
=
this
.
getPartnerPayOvertime
(
createPrepayRequestDto
.
getPartnerId
());
orderPayResponse
=
getPreOrderPay
(
createPrepayRequestDto
.
getFatherOrderBean
(),
paymentRequest
,
LogThreadLocal
.
getTrackingNo
(),
createPrepayRequestDto
.
getCardAmount
(),
transId
,
partnerPayOvertime
,
createPrepayRequestDto
.
getOrderExtInfoDTO
());
}
else
if
(
totalAmount
>
0
&&
StringUtils
.
isNotBlank
(
cardCode
))
{
//混合支付+svc卡(礼品卡)
orderPayResponse
=
switchSvcOrComb
(
totalAmount
,
cardCode
,
createPrepayRequestDto
.
getFatherOrderBean
(),
paymentRequest
,
transId
,
createPrepayRequestDto
.
getChannel
(),
createPrepayRequestDto
.
getStoreId
(),
LogThreadLocal
.
getTrackingNo
());
}
else
{
// 0元订单如果不需要支付,自定义支付单号
orderPayResponse
=
getOrderPayResponse
(
paymentRequest
,
createPrepayRequestDto
.
getFatherOrderBean
());
}
if
(
orderPayResponse
==
null
||
Objects
.
isNull
(
orderPayResponse
.
getFmId
()))
{
BaseResponse
baseResponse
=
failPreOrderPay
(
LogThreadLocal
.
getTrackingNo
(),
createPrepayRequestDto
.
getProductOrderBean
(),
cardCode
,
createPrepayRequestDto
.
getOrderClient
(),
Objects
.
isNull
(
orderPayResponse
)
?
null
:
orderPayResponse
.
getMsg
());
// 电子风味卡需要给用户特殊的返回
if
(
totalAmount
>
0
&&
Objects
.
nonNull
(
createPrepayRequestDto
.
getUnionPayCard
()))
{
baseResponse
.
setMessage
(
Objects
.
nonNull
(
orderPayResponse
)
&&
(
ResponseCodeConstant
.
PASSWORD_WRONG
.
equals
(
orderPayResponse
.
getPayTransId
())
||
ResponseCodeConstant
.
NOT_SUFFICIENT_FUND
.
equals
(
orderPayResponse
.
getPayTransId
()))
?
orderPayResponse
.
getMsg
()
:
"支付失败"
);
}
return
baseResponse
;
}
createOrderResponse
=
orderAdapter
.
convent2CreateFatherSonOrderResponseVo
(
orderPayResponse
,
createPrepayRequestDto
.
getProductOrderBean
());
BaseResponse
baseEditResponse
=
this
.
updateOrderInfo
(
orderPayResponse
,
createPrepayRequestDto
.
getOrderExtInfoDTO
(),
createPrepayRequestDto
.
getProductOrderBean
(),
LogThreadLocal
.
getTrackingNo
());
if
(
baseEditResponse
!=
null
)
{
return
baseEditResponse
;
}
if
(
totalAmount
>
0
&&
StringUtils
.
isBlank
(
cardCode
)
&&
Objects
.
isNull
(
createPrepayRequestDto
.
getUnionPayCard
()))
{
createOrderResponse
.
setPaySuccess
(
false
);
}
else
if
(
orderPayResponse
.
getPayChannelType
()
!=
null
&&
PayChannelType
.
COMB
.
getEbcode
().
equals
(
orderPayResponse
.
getPayChannelType
().
getEbcode
()))
{
createOrderResponse
.
setPaySuccess
(
false
);
}
else
if
(
orderPayResponse
.
getPayChannelType
()
!=
null
&&
PayChannelType
.
SVC
.
getEbcode
().
equals
(
orderPayResponse
.
getPayChannelType
().
getEbcode
()))
{
createOrderResponse
.
setPaySuccess
(
true
);
}
else
{
createOrderResponse
.
setPaySuccess
(
true
);
}
if
(!
createOrderResponse
.
getPaySuccess
())
{
return
ResponseUtil
.
success
(
createOrderResponse
);
}
else
{
//如果是商品券支付0元,调用回调接口
/**
* - 老的svc卡或是0元订单下单成功直接核销 这里不处理
* - 混合支付纯svc支付 需要直接内部核销 其他支付方式需依靠外部回调
*/
PaysuccessNoticeMessage
message
=
new
PaysuccessNoticeMessage
();
message
.
setResult_code
(
100
);
message
.
setOut_trade_no
(
createOrderResponse
.
getFmId
());
message
.
setTrans_id
(
createOrderResponse
.
getOid
());
message
.
setTotal_fee
(
0
);
message
.
setOpenid
(
createPrepayRequestDto
.
getOpenId
());
message
.
setPlatform_coupon
(
0
);
message
.
setMerchant_coupon
(
0
);
message
.
setSource
(
PaySuccessSource
.
OUTSIDE
.
getSource
());
orderAdapterService
.
paySuccessCallback
(
message
);
return
ResponseUtil
.
success
(
createOrderResponse
);
}
}
private
PaymentRequest
orderBodyConvertToPaymentBody
(
String
openId
,
String
partnerId
,
String
appId
,
String
payCode
,
String
storeId
)
{
PaymentRequest
paymentRequest
=
this
.
orderBodyConvertToPaymentBody
(
openId
,
partnerId
,
appId
,
payCode
);
// fisherman 2227 测试商户号, 下个版本需要删除
boolean
isTrue
=
"2080"
.
equals
(
partnerId
);
if
(
isTrue
)
{
//【ID1035981】【蜜雪冰城】订单C端,拼接order_body字段:蜜雪冰城+门店编号
paymentRequest
.
setPrincipalName
(
"蜜雪冰城"
+
storeId
+
"店"
);
}
return
paymentRequest
;
}
private
PaymentRequest
orderBodyConvertToPaymentBody
(
String
openId
,
String
partnerId
,
String
appId
,
String
payCode
)
{
//设置支付信息
PaymentRequest
paymentRequest
=
new
PaymentRequest
();
paymentRequest
.
setOpenId
(
openId
);
paymentRequest
.
setWxAppId
(
appId
);
AssortmentOpenPlatformWxapp
wxApp
=
openPlatformWxappManager
.
findByPartnerIdAndWxappId
(
partnerId
,
appId
);
AssortmentOpenPlatformPartner
platformPartner
=
null
;
if
(
wxApp
==
null
)
{
platformPartner
=
assortmentOpenPlatformPartnerManager
.
selectOpenPlatformPartner
(
partnerId
);
}
paymentRequest
.
setPrincipalName
(
wxApp
!=
null
?
wxApp
.
getPrincipalName
()
:
platformPartner
!=
null
?
platformPartner
.
getCompanyName
()
:
"上海非码网络科技有限公司"
);
paymentRequest
.
setReverseNotifyiDcUrl
(
reverseNotifyiDcUrl
);
paymentRequest
.
setPayCode
(
payCode
);
return
paymentRequest
;
}
public
OrderPayResponse
getPreOrderPay
(
OrderBeanV1
orderBean
,
PaymentRequest
paymentRequest
,
String
trackingNo
,
Integer
cardAmount
,
String
transId
,
String
partnerPayOvertime
,
OrderExtInfoDto
orderExtInfoDto
)
{
OrderPayResponse
orderPayResponse
;
// try {
UnifiedOrderRequest
request
=
orderAdapter
.
convent2UnifiedOrderRequest
(
orderBean
,
paymentRequest
,
orderBean
.
getAmount
(),
cardAmount
,
transId
,
partnerPayOvertime
);
// add by miaohui for 拼单群收款判断拼单人数大于1时参与微信平台补贴活动,创建预支付时上送goodsTag,后续抽成促销服务活动时删除此逻辑 start
if
(
null
!=
orderBean
.
getMarketingType
()
&&
OrderMarketType
.
COLLAGE
.
getIndex
()
==
orderBean
.
getMarketingType
())
{
// 拼单人数大于1人时参加拼单补贴
if
(
null
!=
orderBean
.
getProductList
()
&&
orderBean
.
getProductList
().
stream
().
map
(
ProductBeanV1:
:
getUserId
).
distinct
().
collect
(
Collectors
.
toList
()).
size
()
>
1
)
{
Map
<
String
,
String
>
goodsTagMap
=
this
.
goodsTagMap
();
String
goodsTag
=
goodsTagMap
.
get
(
orderBean
.
getCompanyId
());
request
.
setGoodsTag
(
StringUtils
.
isBlank
(
goodsTag
)
?
collageGoodsTag
:
goodsTag
);
}
}
// add by miaohui for 拼单群收款判断拼单人数大于1时参与微信平台补贴活动,创建预支付时上送goodsTag,后续抽成促销服务活动时删除此逻辑 end
if
(
orderExtInfoDto
!=
null
&&
StringUtils
.
isNotBlank
(
orderExtInfoDto
.
getStationId
()))
{
request
.
setStationId
(
orderExtInfoDto
.
getStationId
());
}
com
.
freemud
.
application
.
sdk
.
api
.
base
.
BaseResponse
<
UnifiedOrderResponse
>
responseBase
=
standardPaymentService
.
unifiedOrder
(
request
,
trackingNo
);
if
(!
ResponseCodeConstant
.
RESPONSE_SUCCESS_STR
.
equals
(
responseBase
.
getCode
()))
{
// 1.9.34 预支付失败需要把原因进行记录
orderPayResponse
=
new
OrderPayResponse
();
orderPayResponse
.
setMsg
(
responseBase
.
getMessage
());
}
else
{
putDelMq
(
request
.
getPartnerId
(),
request
.
getStoreId
(),
responseBase
.
getData
().
getFmId
(),
orderBean
.
getOid
());
orderPayResponse
=
orderAdapter
.
convent2OrderPayResponse
(
responseBase
.
getData
());
orderPayResponse
.
setWxAppid
(
paymentRequest
.
getWxAppId
());
orderPayResponse
.
setOpenId
(
paymentRequest
.
getOpenId
());
orderPayResponse
.
setPartnerId
(
orderBean
.
getCompanyId
());
orderPayResponse
.
setOrderId
(
orderBean
.
getOid
());
orderPayResponse
.
setPayChannelType
(
PayChannelType
.
WECHAT
);
if
(
orderPayResponse
.
getPayOrder
()
!=
null
&&
StringUtils
.
isNotBlank
(
orderPayResponse
.
getPayOrder
().
getAliPayOrder
()))
{
orderPayResponse
.
setPayChannelType
(
PayChannelType
.
ALIPAY
);
}
//抖音支付
if
(
PayChannelType
.
TIKTOKPAY
.
getIndex
().
toString
().
equalsIgnoreCase
(
orderBean
.
getPayChannelType
()))
{
orderPayResponse
.
setPayChannelType
(
PayChannelType
.
TIKTOKPAY
);
}
}
// } catch (Exception e) {
// AppLogUtil.errorLog("getPreOrderPay_error", JSONObject.toJSONString(orderBean), JSONObject.toJSONString(paymentRequest));
//TODO 邮件告警
// orderPayResponse = new OrderPayResponse();
// orderPayResponse.setMsg("getPreOrderPay_error");
// }
return
orderPayResponse
;
}
private
BaseResponse
failPreOrderPay
(
String
trackingNo
,
OrderBeanV1
orderBean
,
String
cardCode
,
OrderClientType
orderClient
,
String
msg
)
{
List
<
OrderClientType
>
notCancelOrderClientList
=
Lists
.
newArrayList
(
OrderClientType
.
APP
);
if
(!
notCancelOrderClientList
.
contains
(
orderClient
))
{
//失败冲正库存,冲正活动库存,取消订单
CancelOrderRequest
cancelOrderRequest
=
orderAdapter
.
convent2CancelOrderRequest
(
orderBean
.
getOid
(),
orderBean
.
getCompanyId
(),
AfterSalesType
.
SYSTEM_CANCEL
,
StringUtils
.
join
(
new
String
[]{
"获取预支付失败"
,
msg
},
'-'
),
trackingNo
,
null
);
orderCenterSdkService
.
orderCancel
(
cancelOrderRequest
);
// TODO: 2019/9/10 hubowen mq推送变更
backOrdersStatusChange
(
orderBean
.
getOid
(),
orderBean
.
getStatus
());
}
//svc 卡支付失败
if
(
StringUtils
.
isNotBlank
(
cardCode
))
{
return
ResponseUtil
.
error
(
ResponseResultEnum
.
PAY_BACKEND_CONFIG_ERROR
.
getCode
(),
StringUtils
.
isNotBlank
(
msg
)
?
msg
:
ResponseResultEnum
.
PAY_BACKEND_CONFIG_ERROR
.
getMessage
(),
null
);
}
return
ResponseUtil
.
error
(
ResponseResultEnum
.
PAY_UNIFIED_ORDER_ERROR
.
getCode
(),
ResponseResultEnum
.
PAY_UNIFIED_ORDER_ERROR
.
getMessage
(),
null
);
}
public
void
backOrdersStatusChange
(
String
oid
,
Integer
orderStatus
)
{
if
(
StringUtils
.
isEmpty
(
oid
))
{
return
;
}
AppLogUtil
.
infoLog
(
"backOrdersStatusChange oid:{} orderStatus:{}"
,
oid
,
String
.
valueOf
(
orderStatus
));
OrderStatusChangeRequestDto
requestDto
=
new
OrderStatusChangeRequestDto
();
requestDto
.
setOid
(
oid
);
requestDto
.
setOrderStatus
(
orderStatus
);
try
{
Header
header
=
new
Header
(
MQAction
.
INSERT
.
getAction
(),
"backOrdersStatusChange"
,
oid
,
backOrdersChangeOrderStatusConsumerQueue
);
MQMessage
<
OrderStatusChangeRequestDto
>
message
=
new
MQMessage
<>(
header
,
requestDto
);
mqService
.
convertAndSend
(
backOrdersNotifyActivityExchange
,
backOrdersChangeOrderStatusConsumerQueue
,
message
);
}
catch
(
Exception
e
)
{
AppLogUtil
.
errorLog
(
"ActivityReverse"
,
JSON
.
toJSONString
(
requestDto
),
""
,
e
);
}
}
private
OrderPayResponse
switchSvcOrComb
(
Long
totalAmount
,
String
cardCode
,
OrderBeanV1
orderBean
,
PaymentRequest
paymentRequest
,
String
transId
,
String
channel
,
String
storeId
,
String
trackingNo
)
{
OrderPayResponse
orderPayResponse
=
null
;
//混合支付开关
boolean
check
=
this
.
checkSvcComPay
(
orderBean
.
getCompanyId
(),
orderBean
.
getShopId
());
//混合支付
if
(
check
&&
StringUtils
.
isNotBlank
(
channel
))
{
String
partnerPayOvertime
=
this
.
getPartnerPayOvertime
(
orderBean
.
getCompanyId
());
orderPayResponse
=
comPayOrder
(
cardCode
,
orderBean
,
paymentRequest
,
partnerPayOvertime
,
totalAmount
.
intValue
(),
channel
,
storeId
,
trackingNo
);
}
else
{
//svc 支付
orderPayResponse
=
svcPay
(
cardCode
,
orderBean
,
paymentRequest
,
transId
,
trackingNo
);
}
return
orderPayResponse
;
}
public
OrderPayResponse
svcPay
(
String
cardCode
,
OrderBeanV1
orderBean
,
PaymentRequest
paymentRequest
,
String
transId
,
String
trackingNo
)
{
CodePayRequest
request
=
new
CodePayRequest
();
OrderPayResponse
orderPayResponse
=
new
OrderPayResponse
();
String
partnerId
=
orderBean
.
getCompanyId
();
request
.
setBody
(
orderBean
.
getShopName
());
request
.
setBusinessDate
(
DateUtil
.
convert2String
(
new
Date
(),
DateUtil
.
FORMAT_YYYY_MM_DD_HHMMSS
));
request
.
setCode
(
cardCode
);
request
.
setPartnerId
(
partnerId
);
request
.
setStoreId
(
orderBean
.
getShopId
());
request
.
setAmount
(
orderBean
.
getAmount
());
request
.
setTransId
(
transId
);
request
.
setStationId
(
"1"
);
request
.
setOperatorId
(
"1"
);
request
.
setVer
(
"2"
);
request
.
setMerchantDiscount
(
orderBean
.
getOriginalAmount
().
longValue
()-
orderBean
.
getAmount
());
SVCCardAmountRequestDto
svcRequest
=
new
SVCCardAmountRequestDto
();
svcRequest
.
setPartnerId
(
partnerId
);
svcRequest
.
setCardCodes
(
Arrays
.
asList
(
cardCode
));
//查询svc卡余额
BaseResponse
<
SVCCardAmountResponseDto
>
svcCardAmountResponseBaseResponse
=
svcAppClient
.
batchQueryCardAmount
(
svcRequest
);
if
(
svcCardAmountResponseBaseResponse
==
null
||
!
ResponseCodeConstant
.
RESPONSE_SUCCESS_STR
.
equals
(
svcCardAmountResponseBaseResponse
.
getCode
())
||
svcCardAmountResponseBaseResponse
.
getResult
()
==
null
||
CollectionUtils
.
isEmpty
(
svcCardAmountResponseBaseResponse
.
getResult
().
getCardSimpleInfos
()))
{
orderPayResponse
.
setMsg
(
Objects
.
isNull
(
svcCardAmountResponseBaseResponse
)
?
"获取卡余额异常"
:
svcCardAmountResponseBaseResponse
.
getMessage
());
return
orderPayResponse
;
}
Integer
amount
=
svcCardAmountResponseBaseResponse
.
getResult
().
getCardSimpleInfos
().
get
(
0
).
getAmount
();
Integer
vamount
=
svcCardAmountResponseBaseResponse
.
getResult
().
getCardSimpleInfos
().
get
(
0
).
getVamount
();
Integer
applyType
=
svcCardAmountResponseBaseResponse
.
getResult
().
getCardSimpleInfos
().
get
(
0
).
getApplyType
();
applyType
=
applyType
==
null
?
3
:
applyType
;
// String payMode = applyType == 3 ? PayChannelType.SVC.getEbcode() : PayChannelType.GIFTCARD.getEbcode();
PayChannelType
payChannelType
=
applyType
==
3
?
PayChannelType
.
SVC
:
PayChannelType
.
GIFTCARD
;
if
(
amount
+
vamount
<
orderBean
.
getAmount
())
{
orderPayResponse
.
setMsg
(
"卡余额不足"
);
return
orderPayResponse
;
}
//svc卡支付
com
.
freemud
.
application
.
sdk
.
api
.
base
.
BaseResponse
<
CodePayResponse
>
responseBase
=
paymentNewService
.
codePay
(
request
,
trackingNo
);
if
(
responseBase
==
null
||
!
ResponseCodeConstant
.
RESPONSE_SUCCESS_STR
.
equals
(
responseBase
.
getCode
())
||
responseBase
.
getData
().
getData
()
==
null
)
{
// 1.9.34 预支付失败需要把原因进行记录
orderPayResponse
.
setMsg
(
Objects
.
isNull
(
responseBase
)
?
"卡支付异常"
:
responseBase
.
getMessage
());
}
else
{
CodePayResponse
.
CodePayDate
codePayResponse
=
responseBase
.
getData
().
getData
();
orderPayResponse
.
setFmId
(
codePayResponse
.
getFmId
());
orderPayResponse
.
setPayTransId
(
codePayResponse
.
getPayTransId
());
orderPayResponse
.
setWxAppid
(
paymentRequest
.
getWxAppId
());
orderPayResponse
.
setOpenId
(
paymentRequest
.
getOpenId
());
orderPayResponse
.
setPartnerId
(
orderBean
.
getCompanyId
());
orderPayResponse
.
setOrderId
(
orderBean
.
getOid
());
orderPayResponse
.
setPayChannelType
(
payChannelType
);
}
return
orderPayResponse
;
}
/**
* 创建混合支付
*
* @param orderBean
* @param paymentRequest
* @param partnerPayOvertime
* @param totalAmount
* @param channel
* @param storeId
* @param trackingNo
* @return
*/
public
OrderPayResponse
comPayOrder
(
String
cardNo
,
OrderBeanV1
orderBean
,
PaymentRequest
paymentRequest
,
String
partnerPayOvertime
,
Integer
totalAmount
,
String
channel
,
String
storeId
,
String
trackingNo
)
{
String
ebCode
=
this
.
getPayCodeByChanel
(
paymentRequest
.
getWxAppId
(),
channel
,
storeId
);
OrderPayResponse
orderPayResponse
=
new
OrderPayResponse
();
if
(
StringUtils
.
isBlank
(
ebCode
))
{
orderPayResponse
.
setMsg
(
"请先联系相关人员配置商户对应的支付渠道"
);
return
orderPayResponse
;
}
CombPayRequest
combPayRequest
=
orderAdapter
.
convent2CombPayOrderRequest
(
cardNo
,
orderBean
,
paymentRequest
,
partnerPayOvertime
,
ebCode
,
channel
,
totalAmount
);
CombPayResponse
combPayResponse
=
comPayClient
.
combPay
(
combPayRequest
,
combPayRequest
.
getPartner_id
());
if
(
combPayResponse
==
null
||
!
ResponseCodeConstant
.
PAYMENT_RESPONSE_SUCCESS
.
equals
(
combPayResponse
.
getCode
()))
{
orderPayResponse
.
setMsg
(
combPayResponse
!=
null
?
"支付:"
+
combPayResponse
.
getMsg
()
:
"混合支付忙不过来啦,请稍后再试"
);
return
orderPayResponse
;
}
List
<
CombPayResponse
.
PayPlatform
>
payPlatforms
=
combPayResponse
.
getData
().
getPayPlatformResponseList
();
if
(
payPlatforms
.
size
()
==
0
)
{
orderPayResponse
.
setMsg
(
"混合支付:生成预支付失败"
);
return
orderPayResponse
;
}
orderPayResponse
.
setWxAppid
(
paymentRequest
.
getWxAppId
());
orderPayResponse
.
setOpenId
(
paymentRequest
.
getOpenId
());
orderPayResponse
.
setPartnerId
(
orderBean
.
getCompanyId
());
orderPayResponse
.
setOrderId
(
orderBean
.
getOid
());
orderPayResponse
.
setMsg
(
"success"
);
orderPayResponse
.
setPayId
(
""
);
CombPayResponse
.
PayPlatform
cashPay
=
null
;
for
(
CombPayResponse
.
PayPlatform
pt
:
payPlatforms
)
{
if
(!
PayChannelType
.
SVC
.
getEbcode
().
equals
(
pt
.
getEbCode
())){
cashPay
=
pt
;
}
orderPayResponse
.
setFmId
(
pt
.
getTransId
());
orderPayResponse
.
setPayTransId
(
pt
.
getTransId
());
PayChannelType
payChannelType
=
PayChannelType
.
getByEbcode
(
pt
.
getEbCode
());
if
(
pt
.
getCardType
()
!=
null
&&
pt
.
getCardType
()
==
0
){
payChannelType
=
PayChannelType
.
GIFTCARD
;
}
orderPayResponse
.
setPayChannelType
(
payChannelType
);
orderPayResponse
.
setPayEbcode
(
pt
.
getEbCode
());
OrderPayItemResp
payItem
=
new
OrderPayItemResp
();
payItem
.
setFmTradeNo
(
pt
.
getFmTradeNo
());
payItem
.
setStoreId
(
storeId
);
payItem
.
setPayChannelType
(
payChannelType
.
getIndex
().
intValue
());
payItem
.
setPayChannelName
(
payChannelType
.
getName
());
payItem
.
setTransId
(
pt
.
getTransId
());
payItem
.
setPartnerId
(
combPayRequest
.
getPartner_id
());
payItem
.
setPayAmount
(
new
BigDecimal
(
pt
.
getPayAmount
()));
orderPayResponse
.
getPayItem
().
add
(
payItem
);
CombPayResponse
.
PayPlatform
.
PayOrderBean
payOrderBean
=
pt
.
getPayOrder
();
if
(
null
!=
payOrderBean
)
{
OrderPayResponse
.
PayOrderBean
payBean
=
new
OrderPayResponse
.
PayOrderBean
();
payBean
.
setAppid
(
payOrderBean
.
getAppId
());
payBean
.
setNonceStr
(
payOrderBean
.
getNonceStr
());
payBean
.
setPackageX
(
payOrderBean
.
getPackageX
());
payBean
.
setSign
(
payOrderBean
.
getPaySign
());
payBean
.
setSignType
(
payOrderBean
.
getSignType
());
payBean
.
setTimestamp
(
payOrderBean
.
getTimeStamp
());
payBean
.
setAliPayOrder
(
payOrderBean
.
getAliPayOrder
());
orderPayResponse
.
setPayOrder
(
payBean
);
}
}
if
(
payPlatforms
.
size
()
>
1
)
{
orderPayResponse
.
setPayChannelType
(
PayChannelType
.
COMB
);
}
//现金线上支付
if
(
cashPay
!=
null
){
String
transId
=
cashPay
.
getTransId
();
orderPayResponse
.
setFmId
(
cashPay
.
getFmTradeNo
());
//隐射关系
redisCache
.
save
(
RedisUtil
.
getPaymentTransIdOrderKey
(
transId
),
orderBean
.
getOid
(),
1L
,
TimeUnit
.
DAYS
);
//加入轮训队列
putDelMq
(
orderBean
.
getCompanyId
(),
storeId
,
orderPayResponse
.
getFmId
(),
orderBean
.
getOid
(),
PayChannelType
.
getByEbcode
(
transId
).
getIndex
().
intValue
());
}
return
orderPayResponse
;
}
/**
* 通过payCode ->clientCode
*
* @param wxAppid
* @param channel
* @param storeId
* @return
*/
private
String
getPayCodeByChanel
(
String
wxAppid
,
String
channel
,
String
storeId
)
{
if
(
StringUtils
.
isBlank
(
channel
))
return
""
;
PayChannelType
byIndex
=
PayChannelType
.
getByIndex
(
Byte
.
parseByte
(
channel
));
if
(
byIndex
.
getEbcode
()
==
null
)
return
""
;
AssortmentOpenPlatformIappWxappStore
wxAppStore
=
assortmentOpenPlatformIappWxappStoreManager
.
selectWxappStoreByWxAppIdAndStoreId
(
wxAppid
,
storeId
,
byIndex
.
getEbcode
());
if
(
wxAppStore
!=
null
&&
StringUtils
.
isNotBlank
(
wxAppStore
.
getClientCode
()))
{
return
wxAppStore
.
getClientCode
();
}
return
""
;
}
/**
* 获取混合支付是否开启
*
* @param partnerId
* @return
*/
private
boolean
checkSvcComPay
(
String
partnerId
,
String
storeId
)
{
SvcComPayRequestDto
requestDto
=
new
SvcComPayRequestDto
();
requestDto
.
setPartnerId
(
partnerId
);
requestDto
.
setStoreId
(
storeId
);
SvcComPayResponseDto
query
=
null
;
for
(
int
i
=
0
;
i
<
3
;
i
++)
{
query
=
svcComPayClient
.
query
(
requestDto
);
if
(
query
!=
null
)
break
;
}
if
(
query
==
null
||
!
ResponseResult
.
SUCCESS
.
getCode
().
equals
(
query
.
getCode
()))
{
return
false
;
}
if
(
query
.
getResult
()
!=
null
&&
query
.
getResult
().
getValue
())
{
return
true
;
}
else
{
return
false
;
}
}
/**
* unionPay card pay
*
* @param orderBean
* @param paymentRequest
* @param transId
* @param trackingNo
* @param unionPayCard
* @return
*/
private
OrderPayResponse
uSvcPay
(
OrderBeanV1
orderBean
,
PaymentRequest
paymentRequest
,
String
transId
,
String
trackingNo
,
CreateOrderVo
.
UnionPayCard
unionPayCard
)
{
OrderPayResponse
orderPayResponse
=
new
OrderPayResponse
();
if
(
Objects
.
isNull
(
unionPayCard
)
||
StringUtils
.
isBlank
(
unionPayCard
.
getCode
())
||
StringUtils
.
isBlank
(
unionPayCard
.
getPassword
()))
{
orderPayResponse
.
setMsg
(
"电子风味卡信息缺失"
);
return
orderPayResponse
;
}
CodePayRequest
request
=
new
CodePayRequest
();
String
partnerId
=
orderBean
.
getCompanyId
();
request
.
setBody
(
orderBean
.
getShopName
());
request
.
setBusinessDate
(
DateTimeFormatter
.
ofPattern
(
DateUtil
.
FORMAT_YYYY_MM_DD_HHMMSS
).
format
(
LocalDateTime
.
now
()));
// paymentRequest 的 payCode可能为null,不保险
request
.
setPayCode
(
PayChannel
.
USVCP
.
getCode
());
// 电子风味卡信息
request
.
setCode
(
unionPayCard
.
getCode
());
request
.
setCardPassword
(
unionPayCard
.
getPassword
());
request
.
setPartnerId
(
partnerId
);
request
.
setStoreId
(
orderBean
.
getShopId
());
request
.
setAmount
(
orderBean
.
getAmount
());
request
.
setTransId
(
transId
);
request
.
setStationId
(
"2"
);
request
.
setOperatorId
(
"2"
);
request
.
setVer
(
"2"
);
request
.
setMerchantDiscount
(
orderBean
.
getOriginalAmount
().
longValue
()-
orderBean
.
getAmount
());
com
.
freemud
.
application
.
sdk
.
api
.
base
.
BaseResponse
<
CodePayResponse
>
responseBase
=
paymentNewService
.
codePay
(
request
,
trackingNo
);
if
(
responseBase
==
null
||
!
ResponseCodeConstant
.
RESPONSE_SUCCESS_STR
.
equals
(
responseBase
.
getCode
())
||
responseBase
.
getData
().
getData
()
==
null
)
{
// 需要把2种特殊情况抛给用户
if
(
Objects
.
nonNull
(
responseBase
)
&&
(
ResponseCodeConstant
.
PASSWORD_WRONG
.
equals
(
responseBase
.
getCode
())
||
ResponseCodeConstant
.
NOT_SUFFICIENT_FUND
.
equals
(
responseBase
.
getCode
())))
{
orderPayResponse
.
setPayTransId
(
responseBase
.
getCode
());
}
orderPayResponse
.
setMsg
(
Objects
.
isNull
(
responseBase
)
?
"电子风味卡支付异常"
:
responseBase
.
getMessage
());
}
else
{
CodePayResponse
.
CodePayDate
codePayResponse
=
responseBase
.
getData
().
getData
();
orderPayResponse
.
setFmId
(
codePayResponse
.
getFmId
());
orderPayResponse
.
setPayTransId
(
codePayResponse
.
getPayTransId
());
orderPayResponse
.
setWxAppid
(
paymentRequest
.
getWxAppId
());
orderPayResponse
.
setOpenId
(
paymentRequest
.
getOpenId
());
orderPayResponse
.
setPartnerId
(
orderBean
.
getCompanyId
());
orderPayResponse
.
setOrderId
(
orderBean
.
getOid
());
orderPayResponse
.
setPayChannelType
(
PayChannelType
.
USVCP
);
}
return
orderPayResponse
;
}
private
Map
<
String
,
String
>
goodsTagMap
()
{
Map
<
String
,
String
>
map
=
new
HashMap
<>();
try
{
for
(
String
pg
:
collageGoodsTagList
.
split
(
","
))
{
map
.
put
(
pg
.
split
(
":"
)[
0
],
pg
.
split
(
":"
)[
1
]);
}
}
catch
(
Exception
e
)
{
AppLogUtil
.
errorLog
(
"goodsTag解析失败:"
,
""
,
""
,
e
);
}
return
map
;
}
/**
* 获取商户支付超时时间
*
* @param partnerId 商户Id
* @return 超时时间
*/
private
String
getPartnerPayOvertime
(
String
partnerId
)
{
return
Optional
.
ofNullable
(
openPlatformPartnerConfigManager
.
selectPartnerConfigByPartnerKey
(
partnerId
,
RedisKeyConstant
.
PARTNER_PAY_OVERTIME
))
.
orElseGet
(()
->
{
AssortmentOpenPlatformPartnerConfig
config
=
new
AssortmentOpenPlatformPartnerConfig
();
config
.
setPartnerValue
(
"30"
);
openPlatformPartnerConfigManager
.
addPartnerConfig
(
partnerId
,
RedisKeyConstant
.
PARTNER_PAY_OVERTIME
,
config
);
return
config
;
}).
getPartnerValue
();
}
private
OrderPayResponse
getOrderPayResponse
(
PaymentRequest
paymentRequest
,
OrderBeanV1
orderBean
)
{
OrderPayResponse
orderPayResponse
;
String
fmId
=
"SPAY"
+
ValidationCode
.
getRandomUuid
();
orderPayResponse
=
orderAdapter
.
getOrderPayResponse
(
orderBean
.
getCompanyId
(),
paymentRequest
,
orderBean
.
getOid
(),
fmId
);
return
orderPayResponse
;
}
/**
* 编辑订单,保持预支付信息
*/
public
BaseResponse
updateOrderInfo
(
OrderPayResponse
orderPayResponse
,
OrderExtInfoDto
orderExtInfo
,
OrderBeanV1
orderBean
,
String
trackingNo
)
{
orderExtInfo
.
setOpenid
(
orderPayResponse
.
getOpenId
());
orderExtInfo
.
setFmId
(
orderPayResponse
.
getFmId
());
orderExtInfo
.
setAppid
(
orderPayResponse
.
getWxAppid
());
String
prepayId
=
""
;
OrderPayResponse
.
PayOrderBean
payOrder
=
orderPayResponse
.
getPayOrder
();
// StringUtils 依赖修改
if
(
payOrder
!=
null
&&
!
StringUtils
.
isEmpty
(
payOrder
.
getPackageX
()))
{
String
[]
prepayIds
=
payOrder
.
getPackageX
().
split
(
"="
);
prepayId
=
prepayIds
.
length
>
1
?
prepayIds
[
1
]
:
""
;
}
//支付宝保存交易流水号发送支付宝模板消息
if
(
payOrder
!=
null
&&
!
StringUtils
.
isEmpty
(
payOrder
.
getAliPayOrder
()))
{
prepayId
=
payOrder
.
getAliPayOrder
();
}
orderExtInfo
.
setPrepayId
(
prepayId
);
OrderEditRequest
orderEditRequest
=
new
OrderEditRequest
(
orderPayResponse
.
getPayTransId
(),
JSONObject
.
toJSONString
(
orderExtInfo
));
orderEditRequest
.
setOrderId
(
orderBean
.
getOid
());
orderEditRequest
.
setTrackingNo
(
trackingNo
);
if
(
orderPayResponse
.
getPayChannelType
()
!=
null
)
{
orderEditRequest
.
setPayChannel
(
orderPayResponse
.
getPayChannelType
().
getEbcode
());
orderEditRequest
.
setPayChannelName
(
orderPayResponse
.
getPayChannelType
().
getName
());
orderEditRequest
.
setPayChannelType
(
orderPayResponse
.
getPayChannelType
().
getIndex
());
}
//混合支付项
if
(
CollectionUtils
.
isNotEmpty
(
orderPayResponse
.
getPayItem
()))
{
orderEditRequest
.
setOrderPayItem
(
orderPayResponse
.
getPayItem
());
if
(
orderPayResponse
.
getPayItem
().
size
()
==
2
)
{
orderEditRequest
.
setPayChannel
(
PayChannelType
.
COMB
.
getEbcode
());
orderEditRequest
.
setPayChannelName
(
PayChannelType
.
COMB
.
getName
());
orderEditRequest
.
setPayChannelType
(
PayChannelType
.
COMB
.
getIndex
());
}
}
BaseOrderResponse
baseOrderResponse
=
orderCenterSdkService
.
orderEdit
(
orderEditRequest
);
if
(!
ObjectUtils
.
equals
(
ResponseCodeConstant
.
RESPONSE_SUCCESS
,
baseOrderResponse
.
getErrcode
()))
{
CancelOrderRequest
cancelOrderRequest
=
orderAdapter
.
convent2CancelOrderRequest
(
orderBean
.
getOid
(),
orderBean
.
getCompanyId
(),
AfterSalesType
.
SYSTEM_CANCEL
,
"编辑订单支付信息失败"
,
trackingNo
,
null
);
orderCenterSdkService
.
orderCancel
(
cancelOrderRequest
);
//如果编辑订单支付信息失败,冲正
backOrdersStatusChange
(
orderBean
.
getOid
(),
orderBean
.
getStatus
());
return
ResponseUtil
.
error
(
baseOrderResponse
.
getErrcode
().
toString
(),
baseOrderResponse
.
getErrmsg
());
}
return
null
;
}
/**
* 获取预支付成功,将信息放入死心队列,当支付成功没有回掉的时候处理
*
* @param partnerId
* @param storeId
* @param fmId
* @param orderId
*/
public
void
putDelMq
(
String
partnerId
,
String
storeId
,
String
fmId
,
String
orderId
,
Integer
payChanelType
)
{
PaymentMqMessageDto
dto
=
new
PaymentMqMessageDto
();
try
{
dto
.
setFmId
(
fmId
);
dto
.
setOrderId
(
orderId
);
dto
.
setPartnerId
(
partnerId
);
dto
.
setStoreId
(
storeId
);
dto
.
setPayChannelType
(
payChanelType
);
dto
.
setTrackingNo
(
LogThreadLocal
.
getTrackingNo
());
this
.
paymentCallback
(
dto
);
}
catch
(
Exception
e
)
{
AppLogUtil
.
errorLog
(
"paymentQueueService.paymentCallback,orderId:{}"
,
orderId
,
null
,
e
);
}
}
/**
* 获取预支付成功,将信息放入死心队列,当支付成功没有回掉的时候处理
*
* @param partnerId
* @param storeId
* @param fmId
* @param orderId
*/
public
void
putDelMq
(
String
partnerId
,
String
storeId
,
String
fmId
,
String
orderId
)
{
PaymentMqMessageDto
dto
=
new
PaymentMqMessageDto
();
try
{
dto
.
setFmId
(
fmId
);
dto
.
setOrderId
(
orderId
);
dto
.
setPartnerId
(
partnerId
);
dto
.
setStoreId
(
storeId
);
dto
.
setTrackingNo
(
LogThreadLocal
.
getTrackingNo
());
this
.
paymentCallback
(
dto
);
}
catch
(
Exception
e
)
{
AppLogUtil
.
errorLog
(
"paymentQueueService.paymentCallback"
,
""
,
orderId
,
e
);
}
}
public
void
paymentCallback
(
PaymentMqMessageDto
dto
){
MQMessage
<
PaymentMqMessageDto
>
mqMessage
=
new
MQMessage
<
PaymentMqMessageDto
>();
mqMessage
.
setBody
(
dto
);
Integer
ttl
=
20
*
1000
;
Header
header
=
new
Header
();
header
.
setKey
(
"1"
);
mqMessage
.
setHeader
(
header
);
byte
[]
notifyMsgBytes
=
JSON
.
toJSONString
(
mqMessage
).
getBytes
();
MessageProperties
messageProperties
=
new
MessageProperties
();
messageProperties
.
setExpiration
(
ttl
.
toString
());
messageProperties
.
setContentType
(
MessageProperties
.
CONTENT_TYPE_JSON
);
Message
delmessage
=
new
Message
(
notifyMsgBytes
,
messageProperties
);
mqService
.
convertAndSend
(
TopicExchangeConfig
.
EXCHANGE_NAME
,
DlPaymentMqConfig
.
OPEN_STORE_PAYMENT_QUERY_DL_KEY
,
delmessage
);
}
}
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