Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
api
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
d3430f5e
authored
Oct 24, 2025
by
Jony.L
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
新支付功能测试
parent
da69e2e2
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
280 additions
and
238 deletions
+280
-238
computility-module-compute/computility-module-compute-biz/src/main/java/com/luhu/computility/module/compute/controller/app/resourceorder/AppResourceOrderController.java
+8
-0
computility-module-compute/computility-module-compute-biz/src/main/java/com/luhu/computility/module/compute/service/resourceorder/ResourceOrderService.java
+9
-0
computility-module-compute/computility-module-compute-biz/src/main/java/com/luhu/computility/module/compute/service/resourceorder/ResourceOrderServiceImpl.java
+68
-0
computility-module-pay/src/main/java/com/luhu/computility/module/pay/controller/admin/notify/AdminWpgjPayController.java
+103
-0
computility-module-pay/src/main/java/com/luhu/computility/module/pay/framework/pay/core/client/dto/order/PayOrderRespDTO.java
+5
-0
computility-module-pay/src/main/java/com/luhu/computility/module/pay/framework/pay/core/client/impl/wpgj/WpgjCryptoUtils.java
+2
-0
computility-module-pay/src/main/java/com/luhu/computility/module/pay/framework/pay/core/client/impl/wpgj/WpgjPayClient.java
+0
-200
computility-module-pay/src/main/java/com/luhu/computility/module/pay/framework/pay/core/client/impl/wpgj/WpgjPayProperties.java
+22
-35
computility-module-pay/src/main/java/com/luhu/computility/module/pay/service/order/PayOrderService.java
+13
-0
computility-module-pay/src/main/java/com/luhu/computility/module/pay/service/order/PayOrderServiceImpl.java
+0
-0
computility-server/src/main/resources/application-dev.yaml
+50
-3
No files found.
computility-module-compute/computility-module-compute-biz/src/main/java/com/luhu/computility/module/compute/controller/app/resourceorder/AppResourceOrderController.java
View file @
d3430f5e
...
...
@@ -39,6 +39,14 @@ public class AppResourceOrderController {
return
success
(
respVO
);
}
@PostMapping
(
"/create-wpgj"
)
@Operation
(
summary
=
"创建算力资源订单(旺铺聚合支付)"
)
public
CommonResult
<
AppResourceOrderCreateRespVO
>
createResourceOrderWithWpgj
(
@Valid
@RequestBody
AppResourceOrderCreateReqVO
createReqVO
)
{
Long
userId
=
getLoginUserId
();
AppResourceOrderCreateRespVO
respVO
=
resourceOrderService
.
createUserResourceOrderWithWpgj
(
userId
,
createReqVO
);
return
success
(
respVO
);
}
@PutMapping
(
"/cancel"
)
@Operation
(
summary
=
"取消算力资源订单"
)
public
CommonResult
<
Boolean
>
cancelResourceOrder
(
@RequestParam
(
"orderId"
)
Long
orderId
)
{
...
...
computility-module-compute/computility-module-compute-biz/src/main/java/com/luhu/computility/module/compute/service/resourceorder/ResourceOrderService.java
View file @
d3430f5e
...
...
@@ -74,6 +74,15 @@ public interface ResourceOrderService {
AppResourceOrderCreateRespVO
createUserResourceOrder
(
Long
userId
,
@Valid
AppResourceOrderCreateReqVO
createReqVO
);
/**
* 用户创建算力资源订单(旺铺聚合支付)
*
* @param userId 用户ID
* @param createReqVO 创建信息
* @return 创建响应
*/
AppResourceOrderCreateRespVO
createUserResourceOrderWithWpgj
(
Long
userId
,
@Valid
AppResourceOrderCreateReqVO
createReqVO
);
/**
* 更新订单为已支付(支付回调使用)
*
* @param orderId 订单ID
...
...
computility-module-compute/computility-module-compute-biz/src/main/java/com/luhu/computility/module/compute/service/resourceorder/ResourceOrderServiceImpl.java
View file @
d3430f5e
...
...
@@ -49,6 +49,10 @@ import static com.luhu.computility.module.compute.enums.ErrorCodeConstants.*;
import
static
com
.
luhu
.
computility
.
module
.
compute
.
enums
.
ResourceOrderRefundStatus
.
NOT_REFUND
;
import
static
com
.
luhu
.
computility
.
module
.
compute
.
enums
.
ResourceOrderInvoiceStatus
.
UNINVOICE
;
import
com.luhu.computility.module.compute.dal.redis.no.ResourceOrderNoRedisDAO
;
import
com.luhu.computility.module.pay.service.order.PayOrderService
;
import
com.luhu.computility.module.pay.controller.app.order.vo.AppPayOrderSubmitReqVO
;
import
com.luhu.computility.module.pay.controller.app.order.vo.AppPayOrderSubmitRespVO
;
import
com.luhu.computility.module.pay.enums.order.PayOrderStatusEnum
;
/**
* 算力资源订单 Service 实现类
...
...
@@ -76,6 +80,9 @@ public class ResourceOrderServiceImpl implements ResourceOrderService {
private
PayOrderApi
payOrderApi
;
@Resource
private
PayOrderService
payOrderService
;
@Resource
private
ResourceOrderProperties
resourceOrderProperties
;
@Resource
...
...
@@ -434,4 +441,64 @@ public class ResourceOrderServiceImpl implements ResourceOrderService {
return
true
;
}
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
AppResourceOrderCreateRespVO
createUserResourceOrderWithWpgj
(
Long
userId
,
AppResourceOrderCreateReqVO
createReqVO
)
{
// 1. 构建订单
ResourceOrderDO
order
=
buildResourceOrder
(
userId
,
createReqVO
);
// 2. 保存订单
resourceOrderMapper
.
insert
(
order
);
// 3. 创建旺铺聚合支付订单
if
(
order
.
getPaymentPrice
()
>
0
)
{
createPayOrderWithWpgj
(
order
);
}
// 4. 返回结果
AppResourceOrderCreateRespVO
respVO
=
new
AppResourceOrderCreateRespVO
();
respVO
.
setId
(
order
.
getId
());
respVO
.
setOrderNo
(
order
.
getOrderNo
());
respVO
.
setPayOrderId
(
order
.
getPayOrderId
());
return
respVO
;
}
/**
* 创建旺铺聚合支付订单
*/
private
void
createPayOrderWithWpgj
(
ResourceOrderDO
order
)
{
try
{
// 1. 创建支付订单(用于数据库记录)
PayOrderCreateReqDTO
payOrderCreateReqDTO
=
new
PayOrderCreateReqDTO
()
.
setAppKey
(
resourceOrderProperties
.
getPayAppKey
()).
setUserIp
(
order
.
getUserIp
());
payOrderCreateReqDTO
.
setMerchantOrderId
(
String
.
valueOf
(
order
.
getId
()));
String
subject
=
order
.
getSpuName
()
+
" - "
+
getDurationDaysFromSku
(
order
.
getSkuId
())
+
"天"
;
subject
=
StrUtils
.
maxLength
(
subject
,
PayOrderCreateReqDTO
.
SUBJECT_MAX_LENGTH
);
payOrderCreateReqDTO
.
setSubject
(
subject
);
payOrderCreateReqDTO
.
setBody
(
subject
);
payOrderCreateReqDTO
.
setPrice
(
order
.
getPaymentPrice
().
intValue
())
.
setExpireTime
(
addTime
(
resourceOrderProperties
.
getPayExpireTime
()));
Long
payOrderId
=
payOrderApi
.
createOrder
(
payOrderCreateReqDTO
);
// 2. 提交支付订单(使用旺铺聚合支付)
AppPayOrderSubmitReqVO
submitReqDTO
=
new
AppPayOrderSubmitReqVO
();
submitReqDTO
.
setId
(
payOrderId
);
submitReqDTO
.
setChannelCode
(
"wpgj_dynamic"
);
AppPayOrderSubmitRespVO
submitRespVO
=
payOrderService
.
submitWpgjOrder
(
submitReqDTO
,
order
.
getUserIp
());
// 3. 更新到算力资源订单上
resourceOrderMapper
.
updateById
(
new
ResourceOrderDO
().
setId
(
order
.
getId
()).
setPayOrderId
(
payOrderId
));
order
.
setPayOrderId
(
payOrderId
);
log
.
info
(
"[createPayOrderWithWpgj] 旺铺聚合支付订单创建成功,订单ID: {}, 支付订单ID: {}"
,
order
.
getId
(),
payOrderId
);
}
catch
(
Exception
e
)
{
log
.
error
(
"[createPayOrderWithWpgj] 创建旺铺聚合支付订单失败"
,
e
);
throw
new
ServiceException
(
"创建支付订单失败: "
+
e
.
getMessage
());
}
}
}
\ No newline at end of file
computility-module-pay/src/main/java/com/luhu/computility/module/pay/controller/admin/notify/AdminWpgjPayController.java
0 → 100644
View file @
d3430f5e
package
com
.
luhu
.
computility
.
module
.
pay
.
controller
.
admin
.
notify
;
import
com.luhu.computility.framework.common.pojo.CommonResult
;
import
com.luhu.computility.framework.common.util.json.JsonUtils
;
import
com.luhu.computility.module.pay.framework.pay.core.client.dto.order.PayOrderRespDTO
;
import
com.luhu.computility.module.pay.framework.pay.core.client.impl.wpgj.WpgjCryptoUtils
;
import
com.luhu.computility.module.pay.framework.pay.core.client.impl.wpgj.WpgjPayProperties
;
import
com.luhu.computility.module.pay.service.order.PayOrderService
;
import
cn.hutool.json.JSONUtil
;
import
io.swagger.v3.oas.annotations.Operation
;
import
io.swagger.v3.oas.annotations.tags.Tag
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.web.bind.annotation.*
;
import
javax.annotation.Resource
;
import
java.util.Map
;
import
static
com
.
luhu
.
computility
.
framework
.
common
.
pojo
.
CommonResult
.
success
;
/**
* WPGJ旺铺聚合支付回调Controller
*
* @author jonyl
*/
@Tag
(
name
=
"管理后台 - WPGJ旺铺聚合支付回调"
)
@RestController
@RequestMapping
(
"/pay/wpgj"
)
@Slf4j
public
class
AdminWpgjPayController
{
@Resource
private
PayOrderService
payOrderService
;
@Resource
private
WpgjPayProperties
wpgjPayProperties
;
@PostMapping
(
"/notify"
)
@Operation
(
summary
=
"WPGJ支付异步回调通知"
)
public
CommonResult
<
String
>
notifyWpgjPay
(
@RequestBody
String
encryptedData
)
{
try
{
log
.
info
(
"[notifyWpgjPay] 收到WPGJ支付回调,加密数据: {}"
,
encryptedData
);
// 1. 解密回调数据
String
decryptedJson
=
WpgjCryptoUtils
.
decryptResponse
(
encryptedData
,
wpgjPayProperties
.
getPrivateKey
());
Map
<
String
,
Object
>
decryptedData
=
JSONUtil
.
parseObj
(
decryptedJson
);
log
.
info
(
"[notifyWpgjPay] 解密后的回调数据: {}"
,
JsonUtils
.
toJsonString
(
decryptedData
));
// 2. 解析回调数据,构造PayOrderRespDTO
PayOrderRespDTO
notify
=
parseWpgjNotifyData
(
decryptedData
);
// 3. 处理支付结果通知
// 由于WPGJ是特殊渠道,直接调用内部处理方法
payOrderService
.
notifyOrder
(-
1L
,
notify
);
// 使用-1表示WPGJ特殊渠道
log
.
info
(
"[notifyWpgjPay] WPGJ支付回调处理完成"
);
return
success
(
"success"
);
}
catch
(
Exception
e
)
{
log
.
error
(
"[notifyWpgjPay] WPGJ支付回调处理失败"
,
e
);
return
success
(
"fail"
);
}
}
/**
* 解析WPGJ回调数据为PayOrderRespDTO
*/
private
PayOrderRespDTO
parseWpgjNotifyData
(
Map
<
String
,
Object
>
data
)
{
PayOrderRespDTO
notify
=
new
PayOrderRespDTO
();
// 根据WPGJ回调文档解析字段
notify
.
setOutTradeNo
((
String
)
data
.
get
(
"out_trade_no"
));
// 商户订单号
notify
.
setChannelOrderNo
((
String
)
data
.
get
(
"transaction_id"
));
// 第三方交易号
notify
.
setStatus
(
parseWpgjStatus
((
String
)
data
.
get
(
"trade_state"
)));
// 交易状态
// 设置支付成功时间
if
(
"SUCCESS"
.
equals
(
data
.
get
(
"trade_state"
)))
{
notify
.
setSuccessTime
(
java
.
time
.
LocalDateTime
.
now
());
}
// 设置其他必要的字段
notify
.
setChannelCode
(
"wpgj_dynamic"
);
notify
.
setChannelErrorCode
(
null
);
// 成功时没有错误码
notify
.
setChannelErrorMsg
(
null
);
notify
.
setRawData
(
JsonUtils
.
toJsonString
(
data
));
// 保存原始数据
return
notify
;
}
/**
* 解析WPGJ交易状态
*/
private
Integer
parseWpgjStatus
(
String
tradeState
)
{
if
(
"SUCCESS"
.
equals
(
tradeState
))
{
return
com
.
luhu
.
computility
.
module
.
pay
.
enums
.
order
.
PayOrderStatusEnum
.
SUCCESS
.
getStatus
();
}
else
if
(
"CLOSED"
.
equals
(
tradeState
)
||
"REVOKED"
.
equals
(
tradeState
))
{
return
com
.
luhu
.
computility
.
module
.
pay
.
enums
.
order
.
PayOrderStatusEnum
.
CLOSED
.
getStatus
();
}
else
{
return
com
.
luhu
.
computility
.
module
.
pay
.
enums
.
order
.
PayOrderStatusEnum
.
WAITING
.
getStatus
();
}
}
}
\ No newline at end of file
computility-module-pay/src/main/java/com/luhu/computility/module/pay/framework/pay/core/client/dto/order/PayOrderRespDTO.java
View file @
d3430f5e
...
...
@@ -30,6 +30,11 @@ public class PayOrderRespDTO {
private
String
outTradeNo
;
/**
* 支付渠道编码
*/
private
String
channelCode
;
/**
* 支付渠道编号
*/
private
String
channelOrderNo
;
...
...
computility-module-pay/src/main/java/com/luhu/computility/module/pay/framework/pay/core/client/impl/wpgj/WpgjCryptoUtils.java
View file @
d3430f5e
...
...
@@ -19,6 +19,7 @@ import java.security.spec.PKCS8EncodedKeySpec;
import
java.security.spec.X509EncodedKeySpec
;
import
java.time.LocalDateTime
;
import
java.time.format.DateTimeFormatter
;
import
java.util.Map
;
/**
* 旺铺聚合支付加解密工具类
...
...
@@ -223,6 +224,7 @@ public class WpgjCryptoUtils {
}
}
/**
* 生成序列号
*/
...
...
computility-module-pay/src/main/java/com/luhu/computility/module/pay/framework/pay/core/client/impl/wpgj/WpgjPayClient.java
deleted
100644 → 0
View file @
da69e2e2
package
com
.
luhu
.
computility
.
module
.
pay
.
framework
.
pay
.
core
.
client
.
impl
.
wpgj
;
import
cn.hutool.core.util.StrUtil
;
import
cn.hutool.http.HttpResponse
;
import
cn.hutool.http.HttpUtil
;
import
cn.hutool.json.JSONObject
;
import
cn.hutool.json.JSONUtil
;
import
com.luhu.computility.module.pay.enums.PayChannelEnum
;
import
com.luhu.computility.module.pay.framework.pay.core.client.dto.order.PayOrderRespDTO
;
import
com.luhu.computility.module.pay.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO
;
import
com.luhu.computility.module.pay.framework.pay.core.client.impl.AbstractPayClient
;
import
com.luhu.computility.module.pay.enums.order.PayOrderStatusEnum
;
import
com.luhu.computility.module.pay.framework.pay.core.enums.PayOrderDisplayModeEnum
;
import
lombok.extern.slf4j.Slf4j
;
import
java.math.BigDecimal
;
import
java.time.LocalDateTime
;
import
java.time.format.DateTimeFormatter
;
import
java.util.HashMap
;
import
java.util.Map
;
/**
* 旺铺聚合支付的 PayClient 实现类
*
* @author generated
*/
@Slf4j
public
class
WpgjPayClient
extends
AbstractPayClient
<
WpgjPayClientConfig
>
{
public
WpgjPayClient
(
Long
channelId
,
String
channelCode
,
WpgjPayClientConfig
config
)
{
super
(
channelId
,
PayChannelEnum
.
WX_NATIVE
.
getCode
(),
config
);
}
@Override
protected
void
doInit
()
{
// 旺铺支付不需要特殊初始化
}
@Override
protected
PayOrderRespDTO
doUnifiedOrder
(
PayOrderUnifiedReqDTO
reqDTO
)
throws
Throwable
{
try
{
// 构建业务数据
JSONObject
businessData
=
buildBusinessData
(
reqDTO
);
// 构建完整请求数据
String
requestData
=
WpgjCryptoUtils
.
buildRequestData
(
businessData
,
config
.
getOrganizNo
());
// 加密请求数据
String
encryptedRequest
=
WpgjCryptoUtils
.
encryptRequest
(
requestData
,
config
.
getPublicKey
());
// 发送HTTP请求
String
apiUrl
=
config
.
getApiUrl
()
+
"/industrial/payment/dynamic"
;
HttpResponse
response
=
HttpUtil
.
createPost
(
apiUrl
)
.
body
(
encryptedRequest
)
.
contentType
(
"application/json"
)
.
timeout
(
30000
)
.
execute
();
if
(!
response
.
isOk
())
{
log
.
error
(
"[doUnifiedOrder] 旺铺支付请求失败: status={}, body={}"
,
response
.
getStatus
(),
response
.
body
());
return
PayOrderRespDTO
.
closedOf
(
"HTTP_ERROR"
,
"请求失败: "
+
response
.
getStatus
(),
reqDTO
.
getOutTradeNo
(),
response
.
body
());
}
// 解析响应
String
responseBody
=
response
.
body
();
JSONObject
responseJson
=
JSONUtil
.
parseObj
(
responseBody
);
// 检查响应状态
String
code
=
responseJson
.
getStr
(
"code"
);
if
(!
"0000"
.
equals
(
code
))
{
String
msg
=
responseJson
.
getStr
(
"msg"
,
"未知错误"
);
log
.
error
(
"[doUnifiedOrder] 旺铺支付返回错误: code={}, msg={}"
,
code
,
msg
);
return
PayOrderRespDTO
.
closedOf
(
code
,
msg
,
reqDTO
.
getOutTradeNo
(),
responseBody
);
}
// 解密响应数据获取payUrl
String
decryptedData
=
WpgjCryptoUtils
.
decryptResponse
(
responseBody
,
config
.
getPrivateKey
());
JSONObject
dataJson
=
JSONUtil
.
parseObj
(
decryptedData
);
String
payUrl
=
dataJson
.
getStr
(
"payUrl"
);
if
(
StrUtil
.
isBlank
(
payUrl
))
{
log
.
error
(
"[doUnifiedOrder] 旺铺支付响应中缺少payUrl"
);
return
PayOrderRespDTO
.
closedOf
(
"MISSING_PAY_URL"
,
"响应中缺少支付链接"
,
reqDTO
.
getOutTradeNo
(),
responseBody
);
}
// 返回成功结果
Map
<
String
,
Object
>
rawData
=
new
HashMap
<>();
rawData
.
put
(
"serialNo"
,
responseJson
.
getStr
(
"serialNo"
));
rawData
.
put
(
"payUrl"
,
payUrl
);
rawData
.
put
(
"response"
,
responseBody
);
return
PayOrderRespDTO
.
waitingOf
(
PayOrderDisplayModeEnum
.
QR_CODE
.
getMode
(),
payUrl
,
reqDTO
.
getOutTradeNo
(),
rawData
);
}
catch
(
Exception
e
)
{
log
.
error
(
"[doUnifiedOrder] 旺铺支付统一下单异常"
,
e
);
return
PayOrderRespDTO
.
closedOf
(
"SYSTEM_ERROR"
,
e
.
getMessage
(),
reqDTO
.
getOutTradeNo
(),
e
.
getMessage
());
}
}
@Override
protected
PayOrderRespDTO
doParseOrderNotify
(
Map
<
String
,
String
>
params
,
String
body
,
Map
<
String
,
String
>
headers
)
throws
Throwable
{
try
{
// 解密回调数据
String
decryptedData
=
WpgjCryptoUtils
.
decryptResponse
(
body
,
config
.
getPrivateKey
());
JSONObject
dataJson
=
JSONUtil
.
parseObj
(
decryptedData
);
// 获取订单状态和相关信息
String
orderId
=
dataJson
.
getStr
(
"order_id"
);
String
orderStatus
=
dataJson
.
getStr
(
"order_status"
);
String
tradeNo
=
dataJson
.
getStr
(
"trade_no"
);
String
tradeTime
=
dataJson
.
getStr
(
"trade_time"
);
// 判断支付状态
Integer
status
;
if
(
"1"
.
equals
(
orderStatus
))
{
status
=
PayOrderStatusEnum
.
SUCCESS
.
getStatus
();
}
else
{
status
=
PayOrderStatusEnum
.
CLOSED
.
getStatus
();
}
// 解析交易时间
LocalDateTime
successTime
=
null
;
if
(
StrUtil
.
isNotBlank
(
tradeTime
))
{
try
{
successTime
=
LocalDateTime
.
parse
(
tradeTime
,
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd HH:mm:ss"
));
}
catch
(
Exception
e
)
{
log
.
warn
(
"[doParseOrderNotify] 解析交易时间失败: {}"
,
tradeTime
,
e
);
}
}
// 构建原始数据
Map
<
String
,
Object
>
rawData
=
new
HashMap
<>();
rawData
.
put
(
"decryptedData"
,
decryptedData
);
rawData
.
put
(
"rawBody"
,
body
);
rawData
.
put
(
"dataJson"
,
dataJson
);
return
PayOrderRespDTO
.
of
(
status
,
tradeNo
,
null
,
successTime
,
orderId
,
rawData
);
}
catch
(
Exception
e
)
{
log
.
error
(
"[doParseOrderNotify] 解析旺铺支付回调异常"
,
e
);
throw
e
;
}
}
@Override
protected
PayOrderRespDTO
doGetOrder
(
String
outTradeNo
)
throws
Throwable
{
// 旺铺支付暂时不支持主动查询订单状态
// 可以根据需要实现订单查询接口
log
.
warn
(
"[doGetOrder] 旺铺支付暂不支持订单查询: {}"
,
outTradeNo
);
return
null
;
}
/**
* 构建业务数据
*
* @param reqDTO 统一下单请求
* @return 业务数据
*/
private
JSONObject
buildBusinessData
(
PayOrderUnifiedReqDTO
reqDTO
)
{
JSONObject
data
=
new
JSONObject
();
// 必填字段
data
.
set
(
"organiz_no"
,
config
.
getOrganizNo
());
data
.
set
(
"mer_no"
,
config
.
getMerNo
());
data
.
set
(
"mer_code"
,
config
.
getMerCode
());
data
.
set
(
"term_code"
,
config
.
getTermCode
());
// 金额转换:分转元
BigDecimal
amountYuan
=
new
BigDecimal
(
reqDTO
.
getPrice
()).
divide
(
new
BigDecimal
(
100
),
2
,
BigDecimal
.
ROUND_HALF_UP
);
data
.
set
(
"order_amt"
,
amountYuan
.
toString
());
// 订单信息
data
.
set
(
"mer_order_id"
,
reqDTO
.
getOutTradeNo
());
data
.
set
(
"notifyurl"
,
reqDTO
.
getNotifyUrl
());
// 可选字段
if
(
StrUtil
.
isNotBlank
(
reqDTO
.
getReturnUrl
()))
{
data
.
set
(
"return_url"
,
reqDTO
.
getReturnUrl
());
}
// 设置默认关闭时间30分钟
data
.
set
(
"close_time"
,
"30"
);
// 设置订单标题
String
subject
=
reqDTO
.
getSubject
();
if
(
StrUtil
.
isBlank
(
subject
))
{
subject
=
"商品支付"
;
}
data
.
set
(
"order_title"
,
subject
);
return
data
;
}
}
\ No newline at end of file
computility-module-pay/src/main/java/com/luhu/computility/module/pay/framework/pay/core/client/impl/wpgj/WpgjPay
ClientConfig
.java
→
computility-module-pay/src/main/java/com/luhu/computility/module/pay/framework/pay/core/client/impl/wpgj/WpgjPay
Properties
.java
View file @
d3430f5e
package
com
.
luhu
.
computility
.
module
.
pay
.
framework
.
pay
.
core
.
client
.
impl
.
wpgj
;
import
com.luhu.computility.framework.common.util.validation.ValidationUtils
;
import
com.luhu.computility.module.pay.framework.pay.core.client.PayClientConfig
;
import
lombok.Data
;
import
javax.validation.ConstraintValidator
;
import
javax.validation.constraints.NotBlank
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
import
org.springframework.stereotype.Component
;
/**
* 旺铺聚合支付
的 PayClientConfig 实现类
* 旺铺聚合支付
配置属性
*
* @author
generated
* @author
jonyl
*/
@Data
public
class
WpgjPayClientConfig
implements
PayClientConfig
{
@Component
@ConfigurationProperties
(
prefix
=
"computility.pay"
)
public
class
WpgjPayProperties
{
/**
* 合作机构渠道号
* 测试环境:105549
* 组织编号
*/
@NotBlank
(
message
=
"合作机构渠道号不能为空"
)
private
String
organizNo
;
/**
* 旺铺内部商户号,进件入网后返回
* 测试环境:99911325651RE1R
* 商户编号
*/
@NotBlank
(
message
=
"旺铺内部商户号不能为空"
)
private
String
merNo
;
/**
* 商户号,进件入网后返回
* 测试环境:K20241200111267
* 商户代码
*/
@NotBlank
(
message
=
"商户号不能为空"
)
private
String
merCode
;
/**
* 终端号,进件入网后返回
* 测试环境:1011215692596
* 终端编号
*/
@NotBlank
(
message
=
"终端号不能为空"
)
private
String
termCode
;
/**
*
旺铺公钥,用于加密AES密钥
*
API地址
*/
@NotBlank
(
message
=
"旺铺公钥不能为空"
)
private
String
publicKey
;
private
String
apiUrl
;
/**
*
机构私钥,用于解密回调数据中的AES密钥
*
回调地址
*/
@NotBlank
(
message
=
"机构私钥不能为空"
)
private
String
privateKey
;
private
String
notifyUrl
;
/**
* API地址
* 测试环境:https://stg5-qr.wpgjcs.com
* 公钥
*/
@NotBlank
(
message
=
"API地址不能为空"
)
private
String
apiUrl
;
@Override
public
void
validate
(
ConstraintValidator
validator
)
{
ValidationUtils
.
validate
(
validator
,
this
);
}
private
String
publicKey
;
/**
* 私钥
*/
private
String
privateKey
;
}
\ No newline at end of file
computility-module-pay/src/main/java/com/luhu/computility/module/pay/service/order/PayOrderService.java
View file @
d3430f5e
...
...
@@ -7,6 +7,8 @@ import com.luhu.computility.module.pay.controller.admin.order.vo.PayOrderExportR
import
com.luhu.computility.module.pay.controller.admin.order.vo.PayOrderPageReqVO
;
import
com.luhu.computility.module.pay.controller.admin.order.vo.PayOrderSubmitReqVO
;
import
com.luhu.computility.module.pay.controller.admin.order.vo.PayOrderSubmitRespVO
;
import
com.luhu.computility.module.pay.controller.app.order.vo.AppPayOrderSubmitReqVO
;
import
com.luhu.computility.module.pay.controller.app.order.vo.AppPayOrderSubmitRespVO
;
import
com.luhu.computility.module.pay.dal.dataobject.order.PayOrderDO
;
import
com.luhu.computility.module.pay.dal.dataobject.order.PayOrderExtensionDO
;
...
...
@@ -92,6 +94,17 @@ public interface PayOrderService {
@NotEmpty
(
message
=
"提交 IP 不能为空"
)
String
userIp
);
/**
* 提交旺铺聚合支付订单
* 此时,会发起旺铺聚合支付渠道的调用
*
* @param reqVO 提交请求
* @param userIp 提交 IP
* @return 提交结果
*/
AppPayOrderSubmitRespVO
submitWpgjOrder
(
@Valid
AppPayOrderSubmitReqVO
reqVO
,
@NotEmpty
(
message
=
"提交 IP 不能为空"
)
String
userIp
);
/**
* 通知支付单成功
*
* @param channelId 渠道编号
...
...
computility-module-pay/src/main/java/com/luhu/computility/module/pay/service/order/PayOrderServiceImpl.java
View file @
d3430f5e
This diff is collapsed.
Click to expand it.
computility-server/src/main/resources/application-dev.yaml
View file @
d3430f5e
...
...
@@ -165,9 +165,55 @@ computility:
captcha
:
enable
:
false
# 本地环境,暂时关闭图片验证码,方便登录等接口的测试;
pay
:
order-notify-url
:
https://phslgld.hnluchuan.com/admin-api/pay/notify/order
# 支付渠道的【支付】回调地址
refund-notify-url
:
https://phslgld.hnluchuan.com/admin-api/pay/notify/refund
# 支付渠道的【退款】回调地址
transfer-notify-url
:
https://phslgld.hnluchuan.com/admin-api/pay/notify/transfer
# 支付渠道的【转账】回调地址
# order-notify-url: https://phslgld.hnluchuan.com/admin-api/pay/notify/order # 支付渠道的【支付】回调地址
# refund-notify-url: https://phslgld.hnluchuan.com/admin-api/pay/notify/refund # 支付渠道的【退款】回调地址
# transfer-notify-url: https://phslgld.hnluchuan.com/admin-api/pay/notify/transfer # 支付渠道的【转账】回调地址
# WPGJ旺铺聚合支付配置
organiz-no
:
105549
mer-no
:
99911325651RE1R
mer-code
:
K20241200111267
term-code
:
1011215692596
api-url
:
https://stg5-qr.wpgjcs.com
notify-url
:
https://phslgld.hnluchuan.com/admin-api/pay/wpgj/notify
public-key
:
|
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4985PvG6DGbmIia0VV2I
wLWj5mYe2gfeDSAqV0YrGAG0MFrw6Cak/anNDNgDeMT3V3tbvCnPw1T5Th0Z3PAW
Wixdk6HyLkSAtHwpGG5O4uHKTMOnRuOjSMFiJm2RWyYbD0bfGJ4OVWadyrLIA4JA
MBkfVS1XWfJG5ZX26DjUk0EahoKgmIwrXVGbN1wQMtB6v5D0XER6WzgAdWwsKHKq
GGIxO/t2B23Y8JkfosPPMCm5jxbvg65ACaciyxJ8qVR8I/4yHxCOKDdyRxfrWkPE
v5tYnfdJIXHUmJMisn39F+651sVw5V8nRZqshm9KbfXWzZA0uYUfu4GItlvXaOWb
gwIDAQAB
-----END PUBLIC KEY-----
private-key
:
|
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCthyDY1HX4+Ls3
I7IAUG5PuerDsvUkCjrZpx+OQ8TtDnGDlhNKtH3MtFu3In4txQnjyGc3wv0k/QGU
TYKHy8dWfaOts2v+5ycTTLs5OvtMsGHp00jYC/4444IA3atIn2qrYfAhBwv1UnCM
DxodYSeF8ZFnGDBjsx6v2VGVX9fpHwm/w1OGQtqbeyOO/CWkYHXDCgK4iMeDm81d
u31t3C6babloomkU+ZZ61FGSN8h3Ua2NLrJrzpIs4x48bc2QwvWDbTXjyage803U
momO7ZMv+w06xyZTGnT7j21ZxR1pYlcIcyd7SYpzxQTbTj7HAQsH5ncjoayxpldn
MfIwodWHAgMBAAECggEAeEv6SHcZhc0hNHuJddBMePbBOoQAj8iLvcGvDZgLl+9w
YDGVFDAGGfhasJ237ZDwZznR3IVPqum+w4nsWKm7eklFRDDjSGYE38tM68Lo3eRV
LJ1tnWDLD7Mgt+r0SDdD4qXVq3/QGXTaUy5RA1cL6D5sd5T8TtGpD21PsocsDg5z
HxzhGaxK1fyu2DUQSvnlWbIE8l36N6S+CZoiUOL8htFNG6C/IUGDwLvRPljHUs2y
tcgKq6o3nTrjnhcJre5B3oUB6Y/tjFy/4siqUDKQ2XRLAaW3dwIANEOLaxfMlxNC
SVf1uJ4sdIKimbPdzUzSMJhri4VF6qhaZKdw7Okj4QKBgQDTkT72Fe4ityBQBAQ7
rbMThYkHCzc1G5peHo+bPpIf7boSjglNUgH0x3DkvnqR4+wxSomfK/lGFPYmzesy
5eaXSgrm+RPYsiG20PHnUR7of/hVfoYpuvWXBFMWA0dLQVG/QOG5icGIcYuzbf1b
jtChTUZfARaprw9h/lO8EZACVwKBgQDR+LebAXdxIsi1gUnffn/9L0qGqk9mNcXS
UEhvU9WEzJZv4eg1ldR4o7WilLiIWqZH/YxadNKAORDh/euNHE9ECRQkRTtpzsrt
pmVsQDPkskTx7jq0Em+wS5aQt76jaXegXnl1juzVkG5j8j8aCcuckuz5EkKE7dpC
RDoH3rioUQKBgCu1wnBNL5n0g7SEX+uEg47w89KEuq86OLZhUgIc90upbdwPhFR5
MPZFjkl0IRarJE06vRwplaKpCgISYRlu7ikrnv0BUNxgUR7YJGJKHDyk08W2Ejnk
6oB84D2YB87AfAcrfHc8wsNR0i8L9mBILUpmELfoHaqJBICWbu5YIoyZAoGBALj6
bIZaHGfHRRrh87q5LvhWGUnZ8GkTJlvJ7oZlTM3Zjw6x7miGvtApKXM5ofg+JA94
B5YJJQlhPMZbdJC0SACgHuZ1N4pXa99BoEhlp1Hq22Jnhb/uHgcqEFMeDQzZdVIK
6OXwLCVZQGc8murNhltB9RLYS1HgWU/X22fjhrqBAoGAV8rbzRN9QmApZ360FckW
ATnnnTQJNlNn+kLRZoxG8rm/5U8u/LJlt6wTkWsEq4V3LqT5ITDsyg889OqngSuJ
lsHaEF/T7Ik3PXScTYabZk7Ar1nC/mFk0R3/6qRCBfiZZJVcpgSu85qPSP9NxtIS
9Kfs6NP5EdnhyJtr8P5GDjo=
-----END PRIVATE KEY-----
access-log
:
# 访问日志的配置项
enable
:
true
demo
:
false
# 开启演示模式
...
...
@@ -223,3 +269,4 @@ iot:
# 插件配置
pf4j
:
pluginsDir
:
${user.home}/plugins
# 插件目录
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