Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
P
payment-ci-test
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
test-ci
payment-ci-test
Commits
7372253c
提交
7372253c
authored
7月 22, 2023
作者:
xiaowang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
退款申请
上级
9c4ea9a0
隐藏空白字符变更
内嵌
并排
正在显示
13 个修改的文件
包含
405 行增加
和
64 行删除
+405
-64
UserSystemConstant.java
...ain/java/com/mmc/payment/constant/UserSystemConstant.java
+8
-0
WechatPayController.java
.../java/com/mmc/payment/controller/WechatPayController.java
+26
-3
WechatPayDao.java
src/main/java/com/mmc/payment/dao/WechatPayDao.java
+5
-0
ApplyRefundLogDO.java
...n/java/com/mmc/payment/entity/order/ApplyRefundLogDO.java
+33
-0
ApplyRefundVO.java
...in/java/com/mmc/payment/model/vo/order/ApplyRefundVO.java
+28
-0
WechatPayServiceImpl.java
...va/com/mmc/payment/service/Impl/WechatPayServiceImpl.java
+156
-31
WechatPayService.java
src/main/java/com/mmc/payment/service/WechatPayService.java
+8
-1
WxConfigUtils.java
src/main/java/com/mmc/payment/util/WxConfigUtils.java
+14
-0
apiclient_key.pem
src/main/resources/apiclient_key.pem
+0
-28
application-dev.yml
src/main/resources/application-dev.yml
+26
-0
application-local.yml
src/main/resources/application-local.yml
+25
-1
application-prod.yml
src/main/resources/application-prod.yml
+56
-0
WechatPayDao.xml
src/main/resources/mapper/WechatPayDao.xml
+20
-0
没有找到文件。
src/main/java/com/mmc/payment/constant/UserSystemConstant.java
浏览文件 @
7372253c
...
...
@@ -43,4 +43,12 @@ public class UserSystemConstant {
@Value
(
"${data.file.url}"
)
private
String
privateKeyFromPath
;
@Value
(
"${data.key.certificate}"
)
private
String
certificate
;
@Value
(
"${wx.pay.refund-notify-url}"
)
private
String
refundNotifyUrl
;
}
src/main/java/com/mmc/payment/controller/WechatPayController.java
浏览文件 @
7372253c
package
com
.
mmc
.
payment
.
controller
;
import
com.mmc.payment.common.result.ResultBody
;
import
com.mmc.payment.model.vo.order.ApplyRefundVO
;
import
com.mmc.payment.model.vo.order.OrderRequestParamsVO
;
import
com.mmc.payment.service.WechatPayService
;
import
io.swagger.annotations.Api
;
...
...
@@ -47,10 +48,32 @@ public class WechatPayController extends BaseController {
return
wechatPayService
.
closeOrder
(
orderNo
);
}
@ApiOperation
(
value
=
"查询订单"
)
@ApiOperation
(
value
=
"
根据交易号或订单编号
查询订单"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)})
@GetMapping
(
"queryOrder"
)
public
ResultBody
queryOrder
(
String
orderNo
)
{
return
wechatPayService
.
queryOrder
(
orderNo
);
public
ResultBody
queryOrder
(
@RequestParam
(
required
=
false
)
String
transactionId
,
@RequestParam
(
required
=
false
)
String
orderNo
)
{
return
wechatPayService
.
queryOrder
(
transactionId
,
orderNo
);
}
@ApiOperation
(
value
=
"申请退款"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)})
@PostMapping
(
"applyRefund"
)
public
ResultBody
applyRefund
(
@RequestBody
ApplyRefundVO
applyRefundVO
)
{
return
wechatPayService
.
applyRefund
(
applyRefundVO
);
}
@ApiOperation
(
value
=
"退款异步通知"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)})
@PostMapping
(
"refundCallback"
)
public
Map
refundCallback
(
HttpServletRequest
request
)
{
return
wechatPayService
.
refundCallback
(
request
);
}
@ApiOperation
(
value
=
"查询退款"
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
ResultBody
.
class
)})
@PostMapping
(
"queryRefund"
)
public
ResultBody
queryRefund
(
String
outRefundNo
)
{
return
wechatPayService
.
queryRefund
(
outRefundNo
);
}
}
src/main/java/com/mmc/payment/dao/WechatPayDao.java
浏览文件 @
7372253c
package
com
.
mmc
.
payment
.
dao
;
import
com.mmc.payment.entity.order.ApplyRefundLogDO
;
import
com.mmc.payment.entity.order.WxPayLogDO
;
import
org.apache.ibatis.annotations.Mapper
;
...
...
@@ -17,4 +18,8 @@ public interface WechatPayDao {
void
updateWxPayLog
(
WxPayLogDO
wxPayLogDO
);
void
deleteWxPayLogByOrderNo
(
String
orderNo
);
void
insertApplyRefundLog
(
ApplyRefundLogDO
applyRefundLogDO
);
void
updateApplyRefundLog
(
ApplyRefundLogDO
applyRefundLogDO
);
}
src/main/java/com/mmc/payment/entity/order/ApplyRefundLogDO.java
0 → 100644
浏览文件 @
7372253c
package
com
.
mmc
.
payment
.
entity
.
order
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
/**
* @Author LW
* @date 2023/7/22 16:23
* 概要:
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
ApplyRefundLogDO
{
private
Integer
id
;
private
String
orderNo
;
private
String
transactionId
;
private
String
outRefundNo
;
private
String
reason
;
private
Integer
total
;
private
Long
refund
;
private
String
currency
;
private
String
refundId
;
private
String
channel
;
private
String
userReceivedAccount
;
private
String
successTime
;
private
String
createTime
;
private
String
refundStatus
;
private
String
fundsAccount
;
private
String
notifyRefundStatus
;
}
src/main/java/com/mmc/payment/model/vo/order/ApplyRefundVO.java
0 → 100644
浏览文件 @
7372253c
package
com
.
mmc
.
payment
.
model
.
vo
.
order
;
import
com.wechat.pay.java.service.refund.model.GoodsDetail
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.util.List
;
/**
* @Author LW
* @date 2023/7/22 14:51
* 概要:
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
ApplyRefundVO
{
@ApiModelProperty
(
value
=
"商户订单号"
,
required
=
true
)
private
String
outTradeNo
;
@ApiModelProperty
(
value
=
"退款原因"
)
private
String
reason
;
@ApiModelProperty
(
value
=
"退款金额"
,
required
=
true
)
private
Long
refund
;
@ApiModelProperty
(
value
=
"商品信息(可填可不填)"
)
private
List
<
GoodsDetail
>
goodsDetail
;
}
src/main/java/com/mmc/payment/service/Impl/WechatPayServiceImpl.java
浏览文件 @
7372253c
package
com
.
mmc
.
payment
.
service
.
Impl
;
import
cn.hutool.core.collection.CollectionUtil
;
import
cn.hutool.core.util.RandomUtil
;
import
com.alibaba.fastjson2.JSONObject
;
import
com.mmc.payment.common.result.ResultBody
;
import
com.mmc.payment.common.util.CodeUtil
;
import
com.mmc.payment.common.util.TDateUtil
;
import
com.mmc.payment.constant.UserSystemConstant
;
import
com.mmc.payment.dao.WechatPayDao
;
import
com.mmc.payment.entity.order.ApplyRefundLogDO
;
import
com.mmc.payment.entity.order.WxPayLogDO
;
import
com.mmc.payment.enums.OrderPayStatus
;
import
com.mmc.payment.feign.UserAppApi
;
import
com.mmc.payment.model.dto.user.UserAccountSimpleDTO
;
import
com.mmc.payment.model.vo.order.ApplyRefundVO
;
import
com.mmc.payment.model.vo.order.OrderRequestParamsVO
;
import
com.mmc.payment.model.vo.order.WxPayLogVO
;
import
com.mmc.payment.service.WechatPayService
;
import
com.mmc.payment.util.WxConfigUtils
;
import
com.wechat.pay.java.core.Config
;
import
com.wechat.pay.java.core.RSAConfig
;
import
com.wechat.pay.java.core.cipher.SignatureResult
;
import
com.wechat.pay.java.core.exception.HttpException
;
import
com.wechat.pay.java.core.exception.MalformedMessageException
;
import
com.wechat.pay.java.core.exception.ServiceException
;
import
com.wechat.pay.java.core.notification.NotificationConfig
;
import
com.wechat.pay.java.core.notification.NotificationParser
;
...
...
@@ -21,13 +30,20 @@ import com.wechat.pay.java.core.notification.RequestParam;
import
com.wechat.pay.java.service.payments.jsapi.JsapiService
;
import
com.wechat.pay.java.service.payments.jsapi.model.*
;
import
com.wechat.pay.java.service.payments.model.Transaction
;
import
com.wechat.pay.java.service.refund.RefundService
;
import
com.wechat.pay.java.service.refund.model.AmountReq
;
import
com.wechat.pay.java.service.refund.model.CreateRequest
;
import
com.wechat.pay.java.service.refund.model.QueryByOutRefundNoRequest
;
import
com.wechat.pay.java.service.refund.model.Refund
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
javax.annotation.Resource
;
import
javax.servlet.http.HttpServletRequest
;
import
java.io.BufferedReader
;
import
java.io.IOException
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.Map
;
...
...
@@ -49,6 +65,7 @@ public class WechatPayServiceImpl implements WechatPayService {
WxConfigUtils
wxConfigUtils
;
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
ResultBody
orderPay
(
OrderRequestParamsVO
orderRequestParamsVO
,
Integer
userAccountId
,
HttpServletRequest
request
)
throws
IOException
{
UserAccountSimpleDTO
userSimpleInfo
=
userAppApi
.
feignGetUserSimpleInfo
(
userAccountId
,
request
.
getHeader
(
"token"
));
if
(
userSimpleInfo
==
null
)
{
...
...
@@ -97,8 +114,9 @@ public class WechatPayServiceImpl implements WechatPayService {
return
ResultBody
.
success
(
map
);
}
}
private
Map
<
String
,
Object
>
getSignInfoMap
(
Config
config
,
String
prepayId
)
{
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
Map
<
String
,
Object
>
getSignInfoMap
(
Config
config
,
String
prepayId
)
{
// 获取时间戳
String
timeStamp
=
System
.
currentTimeMillis
()
/
1000
+
""
;
// 获取随机字符串
...
...
@@ -125,6 +143,7 @@ public class WechatPayServiceImpl implements WechatPayService {
}
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
Map
payCallback
(
HttpServletRequest
request
)
{
Map
<
String
,
String
>
result
=
new
HashMap
(
16
);
result
.
put
(
"code"
,
"FAIL"
);
...
...
@@ -196,39 +215,145 @@ public class WechatPayServiceImpl implements WechatPayService {
}
@Override
public
ResultBody
queryOrder
(
String
orderNo
)
{
// 查询订单的交易号
WxPayLogDO
wxPayLogDO
=
wechatPayDao
.
selectWxPayInfoByOrderNo
(
orderNo
);
if
(
wxPayLogDO
==
null
)
{
return
ResultBody
.
error
(
"订单不存在!"
);
}
if
(
wxPayLogDO
.
getTradeState
().
equals
(
OrderPayStatus
.
WAIT
.
getStatus
()))
{
return
ResultBody
.
error
(
"该订单暂未发起交易!"
);
public
ResultBody
queryOrder
(
String
transactionId
,
String
orderNo
)
{
try
{
Config
config
=
wxConfigUtils
.
createConfig
();
// 构建service
JsapiService
service
=
new
JsapiService
.
Builder
().
config
(
config
).
build
();
if
(
orderNo
!=
null
)
{
QueryOrderByOutTradeNoRequest
queryRequest
=
new
QueryOrderByOutTradeNoRequest
();
queryRequest
.
setOutTradeNo
(
orderNo
);
queryRequest
.
setMchid
(
userSystemConstant
.
getMchid
());
Transaction
result
=
service
.
queryOrderByOutTradeNo
(
queryRequest
);
return
getTransactionInfo
(
result
);
}
if
(
transactionId
!=
null
)
{
QueryOrderByIdRequest
queryRequest
=
new
QueryOrderByIdRequest
();
queryRequest
.
setTransactionId
(
transactionId
);
queryRequest
.
setMchid
(
userSystemConstant
.
getMchid
());
Transaction
result
=
service
.
queryOrderById
(
queryRequest
);
return
getTransactionInfo
(
result
);
}
}
catch
(
ServiceException
e
)
{
String
responseBody
=
e
.
getResponseBody
();
JSONObject
jsonObject
=
JSONObject
.
parseObject
(
responseBody
);
return
ResultBody
.
error
(
jsonObject
.
getString
(
"message"
));
}
return
ResultBody
.
success
();
}
Config
config
=
wxConfigUtils
.
createConfig
();
// 构建service
JsapiService
service
=
new
JsapiService
.
Builder
().
config
(
config
).
build
();
QueryOrderByIdRequest
queryRequest
=
new
QueryOrderByIdRequest
();
queryRequest
.
setMchid
(
userSystemConstant
.
getMchid
());
queryRequest
.
setTransactionId
(
wxPayLogDO
.
getTransactionId
());
private
ResultBody
getTransactionInfo
(
Transaction
result
)
{
WxPayLogVO
wxPayLogVO
=
new
WxPayLogVO
();
wxPayLogVO
.
setOutTradeNo
(
result
.
getOutTradeNo
());
wxPayLogVO
.
setBankType
(
result
.
getBankType
());
wxPayLogVO
.
setAttach
(
result
.
getAttach
());
wxPayLogVO
.
setSuccessTime
(
result
.
getSuccessTime
());
wxPayLogVO
.
setWxNotifyOpenid
(
result
.
getPayer
()
==
null
?
null
:
result
.
getPayer
().
getOpenid
());
wxPayLogVO
.
setWxNotifyTotal
(
result
.
getAmount
()
==
null
?
null
:
result
.
getAmount
().
getTotal
());
wxPayLogVO
.
setWxNotifyPayerTotal
(
result
.
getAmount
()
==
null
?
null
:
result
.
getAmount
().
getPayerTotal
());
wxPayLogVO
.
setTradeType
(
result
.
getTradeType
()
==
null
?
null
:
result
.
getTradeType
().
toString
());
wxPayLogVO
.
setTradeState
(
result
.
getTradeState
()
==
null
?
null
:
result
.
getTradeState
().
toString
());
wxPayLogVO
.
setTradeStateDesc
(
result
.
getTradeStateDesc
());
return
ResultBody
.
success
(
wxPayLogVO
);
}
@Override
public
Map
refundCallback
(
HttpServletRequest
request
)
{
return
null
;
}
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
ResultBody
applyRefund
(
ApplyRefundVO
applyRefundVO
)
{
log
.
info
(
"=======申请退款信息入库======="
);
ApplyRefundLogDO
refundInfo
=
this
.
createRefundInfo
(
applyRefundVO
);
RSAConfig
config
=
wxConfigUtils
.
createRSAConfig
();
log
.
info
(
"========调用微信退款接口========="
);
// 初始化服务
RefundService
service
=
new
RefundService
.
Builder
().
config
(
config
).
build
();
try
{
com
.
wechat
.
pay
.
java
.
service
.
payments
.
model
.
Transaction
result
=
service
.
queryOrderById
(
queryRequest
);
WxPayLogVO
wxPayLogVO
=
new
WxPayLogVO
();
wxPayLogVO
.
setOutTradeNo
(
result
.
getOutTradeNo
());
wxPayLogVO
.
setBankType
(
result
.
getBankType
());
wxPayLogVO
.
setAttach
(
result
.
getAttach
());
wxPayLogVO
.
setSuccessTime
(
result
.
getSuccessTime
());
wxPayLogVO
.
setWxNotifyOpenid
(
result
.
getPayer
().
getOpenid
());
wxPayLogVO
.
setWxNotifyTotal
(
result
.
getAmount
().
getTotal
());
wxPayLogVO
.
setWxNotifyPayerTotal
(
result
.
getAmount
().
getPayerTotal
());
wxPayLogVO
.
setTradeType
(
result
.
getTradeType
().
toString
());
wxPayLogVO
.
setTradeState
(
result
.
getTradeState
().
toString
());
wxPayLogVO
.
setTradeStateDesc
(
result
.
getTradeStateDesc
());
return
ResultBody
.
success
(
wxPayLogVO
);
CreateRequest
request
=
new
CreateRequest
();
request
.
setOutTradeNo
(
applyRefundVO
.
getOutTradeNo
());
request
.
setOutRefundNo
(
refundInfo
.
getOutRefundNo
());
request
.
setReason
(
refundInfo
.
getReason
());
// 创建退款金额对象
AmountReq
amountReq
=
new
AmountReq
();
amountReq
.
setTotal
(
Long
.
valueOf
(
refundInfo
.
getTotal
()));
amountReq
.
setRefund
(
applyRefundVO
.
getRefund
());
amountReq
.
setCurrency
(
"CNY"
);
request
.
setNotifyUrl
(
userSystemConstant
.
getRefundNotifyUrl
());
request
.
setAmount
(
amountReq
);
if
(
CollectionUtil
.
isNotEmpty
(
applyRefundVO
.
getGoodsDetail
()))
{
request
.
setGoodsDetail
(
applyRefundVO
.
getGoodsDetail
());
}
Refund
refund
=
service
.
create
(
request
);
this
.
updateRefundInfo
(
refund
);
return
ResultBody
.
success
();
}
catch
(
HttpException
e
)
{
log
.
info
(
"申请退款HttpException日志打印:{}"
,
e
.
getHttpRequest
());
return
ResultBody
.
error
(
"申请退款出错,请联系技术人员上服务器查询日志!"
);
}
catch
(
ServiceException
e
)
{
return
ResultBody
.
error
(
e
.
getErrorCode
(),
e
.
getMessage
());
log
.
info
(
"申请退款ServiceException日志打印:{}"
,
e
.
getResponseBody
());
return
ResultBody
.
error
(
"申请退款出错,请联系技术人员上服务器查询日志!"
);
}
catch
(
MalformedMessageException
e
)
{
log
.
info
(
"申请退款MalformedMessageException日志打印:{}"
,
e
.
getMessage
());
return
ResultBody
.
error
(
"申请退款出错,请联系技术人员上服务器查询日志!"
);
}
}
private
void
updateRefundInfo
(
Refund
refund
)
{
ApplyRefundLogDO
applyRefundLogDO
=
new
ApplyRefundLogDO
();
applyRefundLogDO
.
setRefundId
(
refund
.
getRefundId
());
applyRefundLogDO
.
setTransactionId
(
refund
.
getTransactionId
());
applyRefundLogDO
.
setChannel
(
refund
.
getChannel
().
toString
());
applyRefundLogDO
.
setUserReceivedAccount
(
refund
.
getUserReceivedAccount
());
applyRefundLogDO
.
setSuccessTime
(
refund
.
getSuccessTime
()
==
null
?
null
:
refund
.
getSuccessTime
());
applyRefundLogDO
.
setCreateTime
(
refund
.
getCreateTime
());
applyRefundLogDO
.
setRefundStatus
(
refund
.
getStatus
()
==
null
?
null
:
refund
.
getStatus
().
toString
());
applyRefundLogDO
.
setFundsAccount
(
refund
.
getFundsAccount
()
==
null
?
null
:
refund
.
getFundsAccount
().
toString
());
wechatPayDao
.
updateApplyRefundLog
(
applyRefundLogDO
);
}
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
ApplyRefundLogDO
createRefundInfo
(
ApplyRefundVO
applyRefundVO
)
{
// 生成商户退款订单号
String
outRefundNo
=
"RF"
+
TDateUtil
.
getDateStr
(
new
Date
(),
"yyyyMMddHHmmss"
)
+
CodeUtil
.
getRandomNum
(
4
);
// 查询订单信息
WxPayLogDO
wxPayLogDO
=
wechatPayDao
.
selectWxPayInfoByOrderNo
(
applyRefundVO
.
getOutTradeNo
());
ApplyRefundLogDO
applyRefundLogDO
=
new
ApplyRefundLogDO
();
applyRefundLogDO
.
setReason
(
applyRefundVO
.
getReason
()
==
null
?
null
:
applyRefundLogDO
.
getReason
());
applyRefundLogDO
.
setOrderNo
(
applyRefundVO
.
getOutTradeNo
());
applyRefundLogDO
.
setOutRefundNo
(
outRefundNo
);
applyRefundLogDO
.
setRefund
(
applyRefundVO
.
getRefund
());
applyRefundLogDO
.
setTotal
(
wxPayLogDO
.
getAmount
());
applyRefundLogDO
.
setCurrency
(
"CNY"
);
wechatPayDao
.
insertApplyRefundLog
(
applyRefundLogDO
);
return
applyRefundLogDO
;
}
@Override
public
ResultBody
queryRefund
(
String
outRefundNo
)
{
RSAConfig
config
=
wxConfigUtils
.
createRSAConfig
();
// 初始化服务
RefundService
service
=
new
RefundService
.
Builder
().
config
(
config
).
build
();
QueryByOutRefundNoRequest
request
=
new
QueryByOutRefundNoRequest
();
request
.
setOutRefundNo
(
outRefundNo
);
Refund
refund
=
service
.
queryByOutRefundNo
(
request
);
ApplyRefundLogDO
applyRefundLogDO
=
new
ApplyRefundLogDO
();
applyRefundLogDO
.
setRefundId
(
refund
.
getRefundId
());
applyRefundLogDO
.
setOutRefundNo
(
refund
.
getOutRefundNo
());
applyRefundLogDO
.
setTransactionId
(
refund
.
getTransactionId
());
applyRefundLogDO
.
setOrderNo
(
refund
.
getOutTradeNo
());
applyRefundLogDO
.
setChannel
(
refund
.
getChannel
().
toString
());
applyRefundLogDO
.
setUserReceivedAccount
(
refund
.
getUserReceivedAccount
());
applyRefundLogDO
.
setSuccessTime
(
refund
.
getSuccessTime
()
==
null
?
null
:
refund
.
getSuccessTime
());
applyRefundLogDO
.
setCreateTime
(
refund
.
getCreateTime
());
applyRefundLogDO
.
setRefundStatus
(
refund
.
getStatus
().
toString
());
applyRefundLogDO
.
setTotal
(
Math
.
toIntExact
(
refund
.
getAmount
().
getTotal
()));
applyRefundLogDO
.
setRefund
(
refund
.
getAmount
().
getRefund
());
applyRefundLogDO
.
setCurrency
(
refund
.
getAmount
().
getCurrency
());
return
ResultBody
.
success
(
applyRefundLogDO
);
}
}
src/main/java/com/mmc/payment/service/WechatPayService.java
浏览文件 @
7372253c
package
com
.
mmc
.
payment
.
service
;
import
com.mmc.payment.common.result.ResultBody
;
import
com.mmc.payment.model.vo.order.ApplyRefundVO
;
import
com.mmc.payment.model.vo.order.OrderRequestParamsVO
;
import
javax.servlet.http.HttpServletRequest
;
...
...
@@ -19,5 +20,11 @@ public interface WechatPayService {
ResultBody
closeOrder
(
String
orderNo
);
ResultBody
queryOrder
(
String
orderNo
);
ResultBody
queryOrder
(
String
transactionId
,
String
orderNo
);
ResultBody
applyRefund
(
ApplyRefundVO
applyRefundVO
);
Map
refundCallback
(
HttpServletRequest
request
);
ResultBody
queryRefund
(
String
outRefundNo
);
}
src/main/java/com/mmc/payment/util/WxConfigUtils.java
浏览文件 @
7372253c
...
...
@@ -3,6 +3,7 @@ package com.mmc.payment.util;
import
com.mmc.payment.constant.UserSystemConstant
;
import
com.wechat.pay.java.core.Config
;
import
com.wechat.pay.java.core.RSAAutoCertificateConfig
;
import
com.wechat.pay.java.core.RSAConfig
;
import
com.wechat.pay.java.core.notification.NotificationConfig
;
import
org.springframework.stereotype.Component
;
...
...
@@ -46,4 +47,17 @@ public class WxConfigUtils {
return
config
;
}
public
RSAConfig
createRSAConfig
()
{
// 初始化商户配置
RSAConfig
config
=
new
RSAConfig
.
Builder
()
.
merchantId
(
userSystemConstant
.
getMchid
())
// 使用 com.wechat.pay.java.core.util 中的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名
.
privateKey
(
userSystemConstant
.
getPrivateKeyFromPath
())
.
merchantSerialNumber
(
userSystemConstant
.
getMchNumber
())
.
wechatPayCertificates
(
userSystemConstant
.
getCertificate
())
.
build
();
return
config
;
}
}
src/main/resources/apiclient_key.pem
deleted
100644 → 0
浏览文件 @
9c4ea9a0
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCpxxR1ZZCLlLn+
XWCX90UrJE6iT9S4Fbf28WMIdqgtsk9IHuIFEy4jfKc/GayxKasFA7r5/csTeZuS
hGPhvtj8mDru6EFg/nKVwW9z26d3a9oYoq5MTNEl5PbrS9wsupULIKDwkd4unIPA
IISBFV/o3UBwAP0TU6jLHG7tgryuIIau5HHNDwkIbuxn/vj0A0HY1ZhvWD1xs1XW
F+TzBybUzPAlEyzGYhhZR+Z/xjtUFWPXxdmC+MD1/qSvMqVpDNpSjTkJZXw7cYHf
GluLlP0Q2ZQI8uOG+uXXhcHUpi61OpmXSyIgST+FGynq28y28aiOUs/6e0i7SnZe
lsODEzqXAgMBAAECggEADvKSIIvioAdmILkD6h1BH71AlxXEOrjey4URHQulXvCV
/lmJuLypkUJGT03pYGe0wOpFKgFoQbyxL8MsMBHndMXKWoJkTy/X0suHDoJGSkNa
nlSkV99jgpyYCLtTFTUQLjyfLs8I6r2o899pCxxgp1XjeHj9zxfMgqVsNskN556c
wWsiICcpZFFEolXXswLDw3WM1n7Ktq7tpCZZksIPCI0s5V0lMcezd284lkV4AkyQ
oXy1viwf2COjT7QqsKR7SAMIRsIsk0RlkPJar3o4FmaD9GA5EUfuC0etSxypbkH7
J8eaCVwv9ns23hUvjR89Fs4HTYxWr0/svi0hMSyY8QKBgQDX71HdH8fwhCPMnjOq
gYrFp/9I3ghoFyswupPQv5cVmEzqrweI4E/tZNJrM70Z1V+0tI8rGc2hmgPTB3HS
A8zFyXj8eU3Up/hXjhVkdi9qzF89ImLA9LT0MFMx38NEHoPUkO6wxTAFuF4Wvhi/
S6dnag3uNjJ5xLlNjrQhLNR4UwKBgQDJR1eA67CfJo9oZBU4lJzruHRVmX3sARpd
lXAgOD7q4DTjL3/bq/+n19sVAh34mTdI0vAVIGlp4oZVohjsByOwPkL8rt0HyhdA
+RYyMD5H+Azp5Qvx4MJhUQxhg2WCjPqthU6bunqCWu2kSZkvkX/t/sX8fqS6NvYj
IOflwwscLQKBgH+PbeHd02Qe+3L2Bfl0u0DWZHVsTLUI8se/gHCxrZPhO5brvNy7
/ht0EuWnU89+ACKlA2pnvNT5QccZP8Db48z3ntQu6K52Z7t5QOPu+UXy41QfCw2H
wZn7LjppQFXuXNxmncqpQhwu9M4kkEP5cjQiL4aIV7sdXoYVhg2PCRjnAoGAf3Pg
ce9MsQp+xrCRS3m3gAAWEloWhYoRQu8syAo1tQ7yDmX2hYh9Y6/ot33WsqN6gW+o
vQgAGB9rxu/U7ih7Lc/PJSgpKBSM8wSHTJKF7Zahvr3d+XTEQVFMELdeYPOajKQc
KbpEdyTS1DQSfy+YHYE1p3QeJRhGdeoRTcla0KUCgYA+HSr6b3q/vU+/LGujNJls
656gtZHTlAobfjqOzA1vbNalHT26/Ikv7cPzAXO1mHsxcxUa9zeS2V+RDzy+RF15
kfWTgY4GaDbhQhFg0KrcbloH+p8oNWpqvyynoJxP1IFQWn+VJW2tN1uSAtlD2dBQ
+Z56YzbOQlvvml7ajzxzSg==
-----END PRIVATE KEY-----
src/main/resources/application-dev.yml
浏览文件 @
7372253c
...
...
@@ -43,6 +43,7 @@ wx:
mch-number
:
7BF5931E5A177A94E2F3A41C839A616ECBA86718
#商户序列号
api-v3-key
:
MMcaFDcly5Eb5o0nTNZdu3ek8DDh4K1B
#apiv3密钥
notify-url
:
https://test.iuav.shop/payment/wechat/payCallback
refund-notify-url
:
https://test.iuav.shop/payment/wechat/refundCallback
mmcflying
:
download
:
...
...
@@ -89,4 +90,29 @@ KbpEdyTS1DQSfy+YHYE1p3QeJRhGdeoRTcla0KUCgYA+HSr6b3q/vU+/LGujNJls
656gtZHTlAobfjqOzA1vbNalHT26/Ikv7cPzAXO1mHsxcxUa9zeS2V+RDzy+RF15
kfWTgY4GaDbhQhFg0KrcbloH+p8oNWpqvyynoJxP1IFQWn+VJW2tN1uSAtlD2dBQ
+Z56YzbOQlvvml7ajzxzSg=="
key
:
certificate
:
"
MIIEJDCCAwygAwIBAgIUe/WTHloXepTi86Qcg5phbsuoZxgwDQYJKoZIhvcNAQEL
BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
Q0EwHhcNMjMwNzE4MDI0NTAzWhcNMjgwNzE2MDI0NTAzWjB+MRMwEQYDVQQDDAox
NjQ4NjUzNTMzMRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xKjAoBgNVBAsM
IeadreW3nuS6keS6q+mjnuenkeaKgOaciemZkOWFrOWPuDELMAkGA1UEBgwCQ04x
ETAPBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEAqccUdWWQi5S5/l1gl/dFKyROok/UuBW39vFjCHaoLbJPSB7iBRMuI3ynPxms
sSmrBQO6+f3LE3mbkoRj4b7Y/Jg67uhBYP5ylcFvc9und2vaGKKuTEzRJeT260vc
LLqVCyCg8JHeLpyDwCCEgRVf6N1AcAD9E1Ooyxxu7YK8riCGruRxzQ8JCG7sZ/74
9ANB2NWYb1g9cbNV1hfk8wcm1MzwJRMsxmIYWUfmf8Y7VBVj18XZgvjA9f6krzKl
aQzaUo05CWV8O3GB3xpbi5T9ENmUCPLjhvrl14XB1KYutTqZl0siIEk/hRsp6tvM
tvGojlLP+ntIu0p2XpbDgxM6lwIDAQABo4G5MIG2MAkGA1UdEwQCMAAwCwYDVR0P
BAQDAgP4MIGbBgNVHR8EgZMwgZAwgY2ggYqggYeGgYRodHRwOi8vZXZjYS5pdHJ1
cy5jb20uY24vcHVibGljL2l0cnVzY3JsP0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFE
Mzk3NTQ5ODQ2QzAxQzNFOEVCRDImc2c9SEFDQzQ3MUI2NTQyMkUxMkIyN0E5RDMz
QTg3QUQxQ0RGNTkyNkUxNDAzNzEwDQYJKoZIhvcNAQELBQADggEBAJ76xFfSq9t6
SvJGhhMuwtS+LlODpiSHd7C39+cWNEk/VR9nF/j8CSzjZduaQw/BZCeIfgGFbDFW
yAgmoGMNGdkOV3qFQZZxkTDCo4EbTklEvLw+0c9r6T8sIfPujCeZgk1aEIJul8ig
gXkyyzD4xR89PMAxh5srSvmAcIsGMSca3l1mFs4uDLs1uB3knOT0lv57w1aDTXMf
ZAT1f24ANAOVMGjhYRCfnKSDBi8QEE7Nj7l5ESQvnUq5pwDbbB3U/nLAKOb4o4Zx
5je/1HN0fauKhCC6HPY5FpJ3wKUm6dUDims5ZXuAIeaEy1HQ2h/om7e72x/rdDdz
5cl2IgwSfNM="
src/main/resources/application-local.yml
浏览文件 @
7372253c
...
...
@@ -35,6 +35,7 @@ wx:
mch-number
:
7BF5931E5A177A94E2F3A41C839A616ECBA86718
#商户序列号
api-v3-key
:
MMcaFDcly5Eb5o0nTNZdu3ek8DDh4K1B
#apiv3密钥
notify-url
:
https://test.iuav.shop/payment/wechat/payCallback
refund-notify-url
:
https://test.iuav.shop/payment/wechat/refundCallback
aliyun
:
oss
:
...
...
@@ -89,5 +90,28 @@ KbpEdyTS1DQSfy+YHYE1p3QeJRhGdeoRTcla0KUCgYA+HSr6b3q/vU+/LGujNJls
656gtZHTlAobfjqOzA1vbNalHT26/Ikv7cPzAXO1mHsxcxUa9zeS2V+RDzy+RF15
kfWTgY4GaDbhQhFg0KrcbloH+p8oNWpqvyynoJxP1IFQWn+VJW2tN1uSAtlD2dBQ
+Z56YzbOQlvvml7ajzxzSg=="
key
:
certificate
:
"
MIIEJDCCAwygAwIBAgIUe/WTHloXepTi86Qcg5phbsuoZxgwDQYJKoZIhvcNAQEL
BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
Q0EwHhcNMjMwNzE4MDI0NTAzWhcNMjgwNzE2MDI0NTAzWjB+MRMwEQYDVQQDDAox
NjQ4NjUzNTMzMRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xKjAoBgNVBAsM
IeadreW3nuS6keS6q+mjnuenkeaKgOaciemZkOWFrOWPuDELMAkGA1UEBgwCQ04x
ETAPBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEAqccUdWWQi5S5/l1gl/dFKyROok/UuBW39vFjCHaoLbJPSB7iBRMuI3ynPxms
sSmrBQO6+f3LE3mbkoRj4b7Y/Jg67uhBYP5ylcFvc9und2vaGKKuTEzRJeT260vc
LLqVCyCg8JHeLpyDwCCEgRVf6N1AcAD9E1Ooyxxu7YK8riCGruRxzQ8JCG7sZ/74
9ANB2NWYb1g9cbNV1hfk8wcm1MzwJRMsxmIYWUfmf8Y7VBVj18XZgvjA9f6krzKl
aQzaUo05CWV8O3GB3xpbi5T9ENmUCPLjhvrl14XB1KYutTqZl0siIEk/hRsp6tvM
tvGojlLP+ntIu0p2XpbDgxM6lwIDAQABo4G5MIG2MAkGA1UdEwQCMAAwCwYDVR0P
BAQDAgP4MIGbBgNVHR8EgZMwgZAwgY2ggYqggYeGgYRodHRwOi8vZXZjYS5pdHJ1
cy5jb20uY24vcHVibGljL2l0cnVzY3JsP0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFE
Mzk3NTQ5ODQ2QzAxQzNFOEVCRDImc2c9SEFDQzQ3MUI2NTQyMkUxMkIyN0E5RDMz
QTg3QUQxQ0RGNTkyNkUxNDAzNzEwDQYJKoZIhvcNAQELBQADggEBAJ76xFfSq9t6
SvJGhhMuwtS+LlODpiSHd7C39+cWNEk/VR9nF/j8CSzjZduaQw/BZCeIfgGFbDFW
yAgmoGMNGdkOV3qFQZZxkTDCo4EbTklEvLw+0c9r6T8sIfPujCeZgk1aEIJul8ig
gXkyyzD4xR89PMAxh5srSvmAcIsGMSca3l1mFs4uDLs1uB3knOT0lv57w1aDTXMf
ZAT1f24ANAOVMGjhYRCfnKSDBi8QEE7Nj7l5ESQvnUq5pwDbbB3U/nLAKOb4o4Zx
5je/1HN0fauKhCC6HPY5FpJ3wKUm6dUDims5ZXuAIeaEy1HQ2h/om7e72x/rdDdz
5cl2IgwSfNM="
src/main/resources/application-prod.yml
浏览文件 @
7372253c
...
...
@@ -43,6 +43,7 @@ wx:
mch-number
:
7BF5931E5A177A94E2F3A41C839A616ECBA86718
#商户序列号
api-v3-key
:
MMcaFDcly5Eb5o0nTNZdu3ek8DDh4K1B
#apiv3密钥
notify-url
:
https://www.iuav.shop/payment/wechat/payCallback
refund-notify-url
:
https://www.iuav.shop/payment/wechat/refundCallback
mmcflying
:
download
:
...
...
@@ -61,3 +62,58 @@ iuav:
url
:
http://cms-svc:35150
pmsapp
:
url
:
http://pms-svc:8099
data
:
file
:
# url: classpath:apiclient_key.pem
url
:
"
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCpxxR1ZZCLlLn+
XWCX90UrJE6iT9S4Fbf28WMIdqgtsk9IHuIFEy4jfKc/GayxKasFA7r5/csTeZuS
hGPhvtj8mDru6EFg/nKVwW9z26d3a9oYoq5MTNEl5PbrS9wsupULIKDwkd4unIPA
IISBFV/o3UBwAP0TU6jLHG7tgryuIIau5HHNDwkIbuxn/vj0A0HY1ZhvWD1xs1XW
F+TzBybUzPAlEyzGYhhZR+Z/xjtUFWPXxdmC+MD1/qSvMqVpDNpSjTkJZXw7cYHf
GluLlP0Q2ZQI8uOG+uXXhcHUpi61OpmXSyIgST+FGynq28y28aiOUs/6e0i7SnZe
lsODEzqXAgMBAAECggEADvKSIIvioAdmILkD6h1BH71AlxXEOrjey4URHQulXvCV
/lmJuLypkUJGT03pYGe0wOpFKgFoQbyxL8MsMBHndMXKWoJkTy/X0suHDoJGSkNa
nlSkV99jgpyYCLtTFTUQLjyfLs8I6r2o899pCxxgp1XjeHj9zxfMgqVsNskN556c
wWsiICcpZFFEolXXswLDw3WM1n7Ktq7tpCZZksIPCI0s5V0lMcezd284lkV4AkyQ
oXy1viwf2COjT7QqsKR7SAMIRsIsk0RlkPJar3o4FmaD9GA5EUfuC0etSxypbkH7
J8eaCVwv9ns23hUvjR89Fs4HTYxWr0/svi0hMSyY8QKBgQDX71HdH8fwhCPMnjOq
gYrFp/9I3ghoFyswupPQv5cVmEzqrweI4E/tZNJrM70Z1V+0tI8rGc2hmgPTB3HS
A8zFyXj8eU3Up/hXjhVkdi9qzF89ImLA9LT0MFMx38NEHoPUkO6wxTAFuF4Wvhi/
S6dnag3uNjJ5xLlNjrQhLNR4UwKBgQDJR1eA67CfJo9oZBU4lJzruHRVmX3sARpd
lXAgOD7q4DTjL3/bq/+n19sVAh34mTdI0vAVIGlp4oZVohjsByOwPkL8rt0HyhdA
+RYyMD5H+Azp5Qvx4MJhUQxhg2WCjPqthU6bunqCWu2kSZkvkX/t/sX8fqS6NvYj
IOflwwscLQKBgH+PbeHd02Qe+3L2Bfl0u0DWZHVsTLUI8se/gHCxrZPhO5brvNy7
/ht0EuWnU89+ACKlA2pnvNT5QccZP8Db48z3ntQu6K52Z7t5QOPu+UXy41QfCw2H
wZn7LjppQFXuXNxmncqpQhwu9M4kkEP5cjQiL4aIV7sdXoYVhg2PCRjnAoGAf3Pg
ce9MsQp+xrCRS3m3gAAWEloWhYoRQu8syAo1tQ7yDmX2hYh9Y6/ot33WsqN6gW+o
vQgAGB9rxu/U7ih7Lc/PJSgpKBSM8wSHTJKF7Zahvr3d+XTEQVFMELdeYPOajKQc
KbpEdyTS1DQSfy+YHYE1p3QeJRhGdeoRTcla0KUCgYA+HSr6b3q/vU+/LGujNJls
656gtZHTlAobfjqOzA1vbNalHT26/Ikv7cPzAXO1mHsxcxUa9zeS2V+RDzy+RF15
kfWTgY4GaDbhQhFg0KrcbloH+p8oNWpqvyynoJxP1IFQWn+VJW2tN1uSAtlD2dBQ
+Z56YzbOQlvvml7ajzxzSg=="
key
:
certificate
:
"
MIIEJDCCAwygAwIBAgIUe/WTHloXepTi86Qcg5phbsuoZxgwDQYJKoZIhvcNAQEL
BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
Q0EwHhcNMjMwNzE4MDI0NTAzWhcNMjgwNzE2MDI0NTAzWjB+MRMwEQYDVQQDDAox
NjQ4NjUzNTMzMRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xKjAoBgNVBAsM
IeadreW3nuS6keS6q+mjnuenkeaKgOaciemZkOWFrOWPuDELMAkGA1UEBgwCQ04x
ETAPBgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
AQEAqccUdWWQi5S5/l1gl/dFKyROok/UuBW39vFjCHaoLbJPSB7iBRMuI3ynPxms
sSmrBQO6+f3LE3mbkoRj4b7Y/Jg67uhBYP5ylcFvc9und2vaGKKuTEzRJeT260vc
LLqVCyCg8JHeLpyDwCCEgRVf6N1AcAD9E1Ooyxxu7YK8riCGruRxzQ8JCG7sZ/74
9ANB2NWYb1g9cbNV1hfk8wcm1MzwJRMsxmIYWUfmf8Y7VBVj18XZgvjA9f6krzKl
aQzaUo05CWV8O3GB3xpbi5T9ENmUCPLjhvrl14XB1KYutTqZl0siIEk/hRsp6tvM
tvGojlLP+ntIu0p2XpbDgxM6lwIDAQABo4G5MIG2MAkGA1UdEwQCMAAwCwYDVR0P
BAQDAgP4MIGbBgNVHR8EgZMwgZAwgY2ggYqggYeGgYRodHRwOi8vZXZjYS5pdHJ1
cy5jb20uY24vcHVibGljL2l0cnVzY3JsP0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFE
Mzk3NTQ5ODQ2QzAxQzNFOEVCRDImc2c9SEFDQzQ3MUI2NTQyMkUxMkIyN0E5RDMz
QTg3QUQxQ0RGNTkyNkUxNDAzNzEwDQYJKoZIhvcNAQELBQADggEBAJ76xFfSq9t6
SvJGhhMuwtS+LlODpiSHd7C39+cWNEk/VR9nF/j8CSzjZduaQw/BZCeIfgGFbDFW
yAgmoGMNGdkOV3qFQZZxkTDCo4EbTklEvLw+0c9r6T8sIfPujCeZgk1aEIJul8ig
gXkyyzD4xR89PMAxh5srSvmAcIsGMSca3l1mFs4uDLs1uB3knOT0lv57w1aDTXMf
ZAT1f24ANAOVMGjhYRCfnKSDBi8QEE7Nj7l5ESQvnUq5pwDbbB3U/nLAKOb4o4Zx
5je/1HN0fauKhCC6HPY5FpJ3wKUm6dUDims5ZXuAIeaEy1HQ2h/om7e72x/rdDdz
5cl2IgwSfNM="
src/main/resources/mapper/WechatPayDao.xml
浏览文件 @
7372253c
...
...
@@ -16,6 +16,14 @@
values (#{orderPort}, #{orderNo}, #{amount}, #{description},
#{tradeState}, #{userAccountId}, #{prepayId}, #{openId})
</insert>
<insert
id=
"insertApplyRefundLog"
>
insert into apply_refund_log (order_no,
total,
refund,
currency,
out_refund_no, reason)
values (#{orderNo}, #{total}, #{refund}, #{currency}, #{outRefundNo}, #{reason})
</insert>
<update
id=
"updateWxPayLog"
>
update wx_pay_log
set out_trade_no = #{outTradeNo},
...
...
@@ -31,6 +39,18 @@
trade_state_desc = #{tradeStateDesc}
where order_no = #{outTradeNo}
</update>
<update
id=
"updateApplyRefundLog"
>
update apply_refund_log
set refund_id = #{refundId},
transaction_id = #{transactionId},
channel = #{channel},
user_received_account = #{userReceivedAccount},
success_time = #{successTime},
create_time = #{createTime},
status = #{status},
funds_account = #{fundsAccount}
</update>
<delete
id=
"deleteWxPayLogByOrderNo"
>
delete
from wx_pay_log
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论