Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
clx-performance
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
姜武杰
clx-performance
Commits
8a5357de
提交
8a5357de
authored
1月 20, 2024
作者:
aiqingguo
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
承运借款流程-宁波银行
上级
d6e97e04
隐藏空白字符变更
内嵌
并排
正在显示
17 个修改的文件
包含
1042 行增加
和
0 行删除
+1042
-0
PerformanceResultEnum.java
...java/com/clx/performance/enums/PerformanceResultEnum.java
+4
-0
NbBankRecordEnum.java
...va/com/clx/performance/enums/nbbank/NbBankRecordEnum.java
+33
-0
pom.xml
performance-web/pom.xml
+6
-0
NbBankConfig.java
.../java/com/clx/performance/config/nbbank/NbBankConfig.java
+16
-0
TempBankController.java
...m/clx/performance/controller/temp/TempBankController.java
+48
-0
NbBankController.java
...x/performance/controller/thirdparty/NbBankController.java
+91
-0
NbBankRecordRecordDaoImpl.java
...erformance/dao/impl/nbbank/NbBankRecordRecordDaoImpl.java
+21
-0
NbBankRecordDao.java
.../java/com/clx/performance/dao/nbbank/NbBankRecordDao.java
+17
-0
NbBankRecordMapper.java
...com/clx/performance/mapper/nbbank/NbBankRecordMapper.java
+18
-0
NbBankRecord.java
...n/java/com/clx/performance/model/nbbank/NbBankRecord.java
+49
-0
NbBankNotifyServiceImpl.java
...rvice/impl/thirdparty/nbbank/NbBankNotifyServiceImpl.java
+110
-0
NbBankServiceImpl.java
...nce/service/impl/thirdparty/nbbank/NbBankServiceImpl.java
+100
-0
NbBankThirdpartyServiceImpl.java
...e/impl/thirdparty/nbbank/NbBankThirdpartyServiceImpl.java
+460
-0
NbBankNotifyService.java
...rmance/service/thirdparty/nbbank/NbBankNotifyService.java
+7
-0
NbBankService.java
.../performance/service/thirdparty/nbbank/NbBankService.java
+13
-0
NbBankThirdpartyService.java
...ce/service/thirdparty/nbbank/NbBankThirdpartyService.java
+17
-0
config-nbbank.json
performance-web/src/main/resources/bank/config-nbbank.json
+32
-0
没有找到文件。
performance-api/src/main/java/com/clx/performance/enums/PerformanceResultEnum.java
浏览文件 @
8a5357de
...
...
@@ -116,6 +116,10 @@ public enum PerformanceResultEnum implements ResultEnum {
BORROWER_NAME_EXIST
(
1701
,
"数据重复,请核实后重新提交"
),
BORROWER_CONFIG_BORROWER_ID_EXIST
(
1701
,
"数据重复,请核实后重新提交"
),
NB_BANK_API_ERROR
(
1800
,
"宁波银行api调用失败"
),
NB_BANK_NOTIFY_ERROR
(
1801
,
"宁波银行回调失败"
),
NB_BANK_PAY_TYPE_ERROR
(
1802
,
"支付方式不支持"
),
;
private
final
int
code
;
private
final
String
msg
;
...
...
performance-api/src/main/java/com/clx/performance/enums/nbbank/NbBankRecordEnum.java
0 → 100644
浏览文件 @
8a5357de
package
com
.
clx
.
performance
.
enums
.
nbbank
;
import
lombok.AllArgsConstructor
;
import
lombok.Getter
;
import
java.util.Arrays
;
import
java.util.Optional
;
public
enum
NbBankRecordEnum
{
;
@Getter
@AllArgsConstructor
public
enum
Type
{
DIRECT_BANK_TRANSFER_ORDER
(
1
,
"转账直连下单"
),
UNION_PAY_DIRECT_ORDER
(
2
,
"银联订单支付收款模式"
),
QUERY_ORDER
(
3
,
"交易结果查询"
),
NOTIFY_MERCHANT
(
4
,
"异步通知交易结果"
),
;
private
final
Integer
code
;
private
final
String
msg
;
public
static
Optional
<
Type
>
getByCode
(
int
code
)
{
return
Arrays
.
stream
(
values
()).
filter
(
e
->
e
.
code
==
code
).
findFirst
();
}
public
static
String
getMsgByCode
(
int
code
)
{
return
getByCode
(
code
).
map
(
Type:
:
getMsg
).
orElse
(
null
);
}
}
}
performance-web/pom.xml
浏览文件 @
8a5357de
...
...
@@ -255,6 +255,12 @@
<version>
1.0.0
</version>
</dependency>
<dependency>
<groupId>
com.nbopen
</groupId>
<artifactId>
openBasicSDK
</artifactId>
<version>
1.7.0
</version>
</dependency>
</dependencies>
...
...
performance-web/src/main/java/com/clx/performance/config/nbbank/NbBankConfig.java
0 → 100644
浏览文件 @
8a5357de
package
com
.
clx
.
performance
.
config
.
nbbank
;
import
lombok.Getter
;
import
lombok.Setter
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
import
org.springframework.context.annotation.Configuration
;
@Configuration
@Getter
@Setter
@ConfigurationProperties
(
prefix
=
"nbbank"
)
public
class
NbBankConfig
{
private
String
appKey
=
"77667c76_3503_4c04_95f7_fc10938c7942"
;
}
performance-web/src/main/java/com/clx/performance/controller/temp/TempBankController.java
0 → 100644
浏览文件 @
8a5357de
package
com
.
clx
.
performance
.
controller
.
temp
;
import
com.clx.performance.service.thirdparty.nbbank.NbBankService
;
import
com.msl.common.result.Result
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMethod
;
import
org.springframework.web.bind.annotation.RestController
;
/**
* @Author: aiqingguo
* @Description: 临时接口
* @Date: 2023-8-21 12:10:16
* @Version: 1.0
*/
@Slf4j
@RestController
@RequestMapping
(
value
=
"/temp/bank"
)
public
class
TempBankController
{
@Autowired
private
NbBankService
bankService
;
@ApiOperation
(
value
=
"directBankTransferOrder"
,
notes
=
"<br>By:艾庆国"
)
@RequestMapping
(
value
=
"/directBankTransferOrder"
,
method
=
RequestMethod
.
POST
)
public
Result
<
String
>
directBankTransferOrder
()
throws
Exception
{
return
Result
.
ok
(
bankService
.
orderPay
(
1
));
}
@ApiOperation
(
value
=
"unionPayDirectOrder"
,
notes
=
"<br>By:艾庆国"
)
@RequestMapping
(
value
=
"/unionPayDirectOrder"
,
method
=
RequestMethod
.
POST
)
public
Result
<
String
>
unionPayDirectOrder
()
throws
Exception
{
return
Result
.
ok
(
bankService
.
orderPay
(
2
));
}
@ApiOperation
(
value
=
"queryOrder"
,
notes
=
"<br>By:艾庆国"
)
@RequestMapping
(
value
=
"/queryOrderTest"
,
method
=
RequestMethod
.
POST
)
public
Result
<
Integer
>
queryOrderTest
(
String
merSeqNo
)
throws
Exception
{
return
Result
.
ok
(
bankService
.
getOrderStatus
(
merSeqNo
));
}
}
performance-web/src/main/java/com/clx/performance/controller/thirdparty/NbBankController.java
0 → 100644
浏览文件 @
8a5357de
package
com
.
clx
.
performance
.
controller
.
thirdparty
;
import
com.alibaba.fastjson.JSON
;
import
com.clx.performance.service.thirdparty.nbbank.NbBankNotifyService
;
import
com.nbopen.api.*
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMethod
;
import
org.springframework.web.bind.annotation.RestController
;
import
java.util.HashMap
;
import
java.util.Map
;
@Slf4j
@RestController
@RequestMapping
(
value
=
"/nbbank"
)
@Api
(
tags
=
"宁波银行回调 (易付通)"
)
public
class
NbBankController
{
@Autowired
private
NbBankNotifyService
nbBankNotifyService
;
@ApiOperation
(
value
=
"notify"
,
notes
=
"<br>By:艾庆国"
)
@RequestMapping
(
value
=
"/notify"
,
method
=
RequestMethod
.
POST
)
public
Object
notify
(
@RequestBody
Map
<
String
,
Object
>
body
)
throws
Exception
{
try
{
nbBankNotifyService
.
payNotify
(
JSON
.
toJSONString
(
body
));
return
getResultSuc
();
}
catch
(
Exception
e
){
e
.
printStackTrace
();
return
getResultFail
();
}
}
private
Object
getResultSuc
()
throws
Exception
{
Map
<
String
,
String
>
data
=
new
HashMap
<>();
data
.
put
(
"errorCode"
,
"000000"
);
data
.
put
(
"errorMsg"
,
"成功"
);
RequestApiData
requestApiData
=
new
RequestApiData
();
requestApiData
.
setAppkey
(
"77667c76_3503_4c04_95f7_fc10938c7942"
);
requestApiData
.
setData
(
data
);
requestApiData
.
setServiceId
(
"notifyMerchant"
);
RequestHead
requestHead
=
new
RequestHead
();
requestHead
.
setRqsJrnlNo
(
NBOpenSDK
.
getRandom
());
SDKRequest
request
=
new
SDKRequest
();
request
.
setData
(
requestApiData
);
request
.
setHead
(
requestHead
);
log
.
info
(
"加密前: "
+
JSON
.
toJSONString
(
request
));
SDKResponse
result
=
NBOpenSDK
.
encryptMessage
(
request
);
log
.
info
(
"加密后: "
+
JSON
.
toJSONString
(
result
));
return
result
.
getData
();
}
private
Object
getResultFail
()
throws
Exception
{
Map
<
String
,
String
>
data
=
new
HashMap
<>();
data
.
put
(
"errorCode"
,
"ER001"
);
data
.
put
(
"errorMsg"
,
"失败"
);
RequestApiData
requestApiData
=
new
RequestApiData
();
requestApiData
.
setAppkey
(
"77667c76_3503_4c04_95f7_fc10938c7942"
);
requestApiData
.
setData
(
data
);
requestApiData
.
setServiceId
(
"notifyMerchant"
);
RequestHead
requestHead
=
new
RequestHead
();
requestHead
.
setRqsJrnlNo
(
NBOpenSDK
.
getRandom
());
SDKRequest
request
=
new
SDKRequest
();
request
.
setData
(
requestApiData
);
request
.
setHead
(
requestHead
);
log
.
info
(
"加密前: "
+
JSON
.
toJSONString
(
request
));
SDKResponse
result
=
NBOpenSDK
.
encryptMessage
(
request
);
log
.
info
(
"加密后: "
+
JSON
.
toJSONString
(
result
));
return
result
.
getData
();
}
}
performance-web/src/main/java/com/clx/performance/dao/impl/nbbank/NbBankRecordRecordDaoImpl.java
0 → 100644
浏览文件 @
8a5357de
package
com
.
clx
.
performance
.
dao
.
impl
.
nbbank
;
import
com.clx.performance.dao.nbbank.NbBankRecordDao
;
import
com.clx.performance.mapper.nbbank.NbBankRecordMapper
;
import
com.clx.performance.model.nbbank.NbBankRecord
;
import
com.msl.common.dao.impl.BaseDaoImpl
;
import
org.springframework.stereotype.Repository
;
/**
* @Author: aiqinguo
* @Description: 借出方
* @Date: 2024/01/17 13:42:57
* @Version: 1.0
*/
@Repository
public
class
NbBankRecordRecordDaoImpl
extends
BaseDaoImpl
<
NbBankRecordMapper
,
NbBankRecord
,
Integer
>
implements
NbBankRecordDao
{
}
performance-web/src/main/java/com/clx/performance/dao/nbbank/NbBankRecordDao.java
0 → 100644
浏览文件 @
8a5357de
package
com
.
clx
.
performance
.
dao
.
nbbank
;
import
com.clx.performance.mapper.nbbank.NbBankRecordMapper
;
import
com.clx.performance.model.nbbank.NbBankRecord
;
import
com.msl.common.dao.BaseDao
;
/**
* @Author: aiqinguo
* @Description: 借出方
* @Date: 2024/01/17 13:42:57
* @Version: 1.0
*/
public
interface
NbBankRecordDao
extends
BaseDao
<
NbBankRecordMapper
,
NbBankRecord
,
Integer
>
{
}
performance-web/src/main/java/com/clx/performance/mapper/nbbank/NbBankRecordMapper.java
0 → 100644
浏览文件 @
8a5357de
package
com
.
clx
.
performance
.
mapper
.
nbbank
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.clx.performance.model.nbbank.NbBankRecord
;
import
org.apache.ibatis.annotations.Mapper
;
/**
* @Author: aiqinguo
* @Description: 宁波银行请求记录
* @Date: 2024/01/17 13:42:57
* @Version: 1.0
*/
@Mapper
public
interface
NbBankRecordMapper
extends
BaseMapper
<
NbBankRecord
>
{
}
\ No newline at end of file
performance-web/src/main/java/com/clx/performance/model/nbbank/NbBankRecord.java
0 → 100644
浏览文件 @
8a5357de
package
com
.
clx
.
performance
.
model
.
nbbank
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.msl.common.config.KeyColumn
;
import
com.msl.common.model.HasKey
;
import
lombok.Getter
;
import
lombok.NoArgsConstructor
;
import
lombok.Setter
;
import
java.time.LocalDateTime
;
/**
* @Author: aiqinguo
* @Description: 宁波银行请求记录
* @Date: 2024/01/20 13:28:28
* @Version: 1.0
*/
@Getter
@Setter
@NoArgsConstructor
@TableName
(
autoResultMap
=
true
)
public
class
NbBankRecord
implements
HasKey
<
Integer
>
{
@TableId
(
value
=
"id"
,
type
=
IdType
.
AUTO
)
private
Integer
id
;
//id
private
Integer
type
;
//类型:1转账直连下单 2银联订单支付收款模式 3交易结果查询 4异步通知交易结果
private
String
merId
;
//商户号
private
String
merSeqNo
;
//流水号
private
String
transSeqNo
;
//第三方流水号
private
Integer
amount
;
//金额 (分)
private
String
param
;
//参数
private
String
result
;
//方法
private
String
errorCode
;
//错误码
private
String
errorMsg
;
//错误信息
private
String
transStatus
;
//交易状态
private
LocalDateTime
createTime
;
//创建时间
private
LocalDateTime
modifiedTime
;
//修改时间
@KeyColumn
(
"id"
)
@Override
public
Integer
gainKey
()
{
return
id
;
}
}
\ No newline at end of file
performance-web/src/main/java/com/clx/performance/service/impl/thirdparty/nbbank/NbBankNotifyServiceImpl.java
0 → 100644
浏览文件 @
8a5357de
package
com
.
clx
.
performance
.
service
.
impl
.
thirdparty
.
nbbank
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
com.clx.performance.enums.PerformanceResultEnum
;
import
com.clx.performance.enums.nbbank.NbBankRecordEnum
;
import
com.clx.performance.service.thirdparty.nbbank.NbBankNotifyService
;
import
com.clx.performance.service.thirdparty.nbbank.NbBankService
;
import
com.clx.performance.service.thirdparty.nbbank.NbBankThirdpartyService
;
import
com.msl.common.exception.ServiceSystemException
;
import
com.nbopen.api.*
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.math.BigDecimal
;
@Slf4j
@Service
public
class
NbBankNotifyServiceImpl
implements
NbBankNotifyService
{
@Autowired
private
NbBankService
bankService
;
@Autowired
private
NbBankThirdpartyService
nbBankThirdpartyService
;
/**
* 支付回调
* 6.2异步通知交易结果
* 解密后
* {
* "data": {
* "clearDate": "20231205",
* "merId": "EFT33021200556315",
* "merSeqNo": "20231205165038",
* "payMethod": "L",
* "pyerInfList": [
* {
* "coreSeqNo": "",
* "customerId": "",
* "pyerAcctBankName": "",
* "pyerAcctBankNo": "",
* "pyerAcctName": "黑玫瑰",
* "pyerAcctNo": "86041110000076809",
* "signNo": "00",
* "transAmt": "0.01",
* "transDtTm": "2023-12-05 16:54:22"
* }
* ],
* "realTrxAmt": "0.01",
* "transDate": "20231205",
* "transSeqNo": "2023120516503906838128gg6DOzjP",
* "transStatus": "00",
* "trxAmt": "0.01"
* },
* "head": {
* "rqsJrnlNo": "16071726224843844",
* "rspCode": "000000",
* "rspDate": "2023-12-05",
* "rspMsg": "处理成功",
* "rspTime": "17:13:43:943"
* }
* }
*/
@Override
public
void
payNotify
(
String
body
)
{
log
.
info
(
"宁波银行回调, data:{}"
,
JSON
.
toJSONString
(
body
));
try
{
RequestApiData
requestApiData
=
new
RequestApiData
();
requestApiData
.
setAppkey
(
"77667c76_3503_4c04_95f7_fc10938c7942"
);
requestApiData
.
setData
(
JSON
.
parseObject
(
body
));
requestApiData
.
setServiceId
(
"notifyMerchant"
);
RequestHead
requestHead
=
new
RequestHead
();
requestHead
.
setRqsJrnlNo
(
NBOpenSDK
.
getRandom
());
SDKRequest
request
=
new
SDKRequest
();
request
.
setData
(
requestApiData
);
request
.
setHead
(
requestHead
);
log
.
info
(
"宁波银行, 回调:{}"
,
JSON
.
toJSONString
(
request
));
SDKResponse
response
=
NBOpenSDK
.
decryptMessage
(
request
);
log
.
info
(
"宁波银行, 回调解密:{}"
,
JSON
.
toJSONString
(
response
));
JSONObject
responseJson
=
JSON
.
parseObject
(
JSON
.
toJSONString
(
response
));
JSONObject
data
=
responseJson
.
getJSONObject
(
"data"
);
nbBankThirdpartyService
.
recordSave
(
NbBankRecordEnum
.
Type
.
NOTIFY_MERCHANT
.
getCode
(),
request
,
response
);
if
(!
StringUtils
.
equals
(
data
.
getString
(
"errorCode"
),
"000000"
)){
log
.
info
(
"宁波银行, 下单失败(notifyMerchant), code:{}, msg:{}"
,
data
.
getString
(
"errorCode"
),
data
.
getString
(
"errorMsg"
));
throw
new
ServiceSystemException
(
PerformanceResultEnum
.
NB_BANK_API_ERROR
);
}
String
merSeqNo
=
data
.
getString
(
"merSeqNo"
);
String
transSeqNo
=
data
.
getString
(
"transSeqNo"
);
BigDecimal
trxAmt
=
data
.
getBigDecimal
(
"trxAmt"
);
BigDecimal
realTrxAmt
=
data
.
getBigDecimal
(
"realTrxAmt"
);
String
transStatus
=
data
.
getString
(
"transStatus"
);
bankService
.
orderPayCallback
(
merSeqNo
,
transSeqNo
,
trxAmt
,
transStatus
);
}
catch
(
Exception
e
){
throw
new
ServiceSystemException
(
PerformanceResultEnum
.
NB_BANK_NOTIFY_ERROR
);
}
}
}
performance-web/src/main/java/com/clx/performance/service/impl/thirdparty/nbbank/NbBankServiceImpl.java
0 → 100644
浏览文件 @
8a5357de
package
com
.
clx
.
performance
.
service
.
impl
.
thirdparty
.
nbbank
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
com.clx.performance.enums.PerformanceResultEnum
;
import
com.clx.performance.service.thirdparty.nbbank.NbBankService
;
import
com.clx.performance.service.thirdparty.nbbank.NbBankThirdpartyService
;
import
com.msl.common.exception.ServiceSystemException
;
import
com.nbopen.api.SDKResponse
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.math.BigDecimal
;
import
java.time.LocalDateTime
;
import
java.time.format.DateTimeFormatter
;
/**
* 易付通
*/
@Slf4j
@Service
public
class
NbBankServiceImpl
implements
NbBankService
{
@Autowired
private
NbBankThirdpartyService
bankThirdpartyService
;
/**
* 订单支付
* @return
* 第三方流水号
*/
@Override
public
String
orderPay
(
Integer
payType
)
{
if
(
payType
==
1
){
String
merSeqNo
=
LocalDateTime
.
now
().
format
(
DateTimeFormatter
.
ofPattern
(
"yyyyMMddHHmmss"
));
JSONObject
data
=
bankThirdpartyService
.
directBankTransferOrder
(
merSeqNo
);
String
transSeqNo
=
data
.
getString
(
"transSeqNo"
);
return
transSeqNo
;
}
else
if
(
payType
==
2
){
String
merSeqNo
=
LocalDateTime
.
now
().
format
(
DateTimeFormatter
.
ofPattern
(
"yyyyMMddHHmmss"
));
JSONObject
data
=
bankThirdpartyService
.
unionPayDirectOrder
(
merSeqNo
);
String
transSeqNo
=
data
.
getString
(
"transSeqNo"
);
return
transSeqNo
;
}
throw
new
ServiceSystemException
(
PerformanceResultEnum
.
NB_BANK_PAY_TYPE_ERROR
);
}
/**
* 获取交易状态
* @return
*/
@Override
public
Integer
getOrderStatus
(
String
merSeqNo
)
{
SDKResponse
sdkResponse
=
bankThirdpartyService
.
queryOrder
(
merSeqNo
);
JSONObject
response
=
JSON
.
parseObject
(
JSON
.
toJSONString
(
sdkResponse
));
String
transStatus
=
response
.
getString
(
"transStatus"
);
if
(
StringUtils
.
equals
(
transStatus
,
"00"
)){
return
1
;}
//交易成功
if
(
StringUtils
.
equals
(
transStatus
,
"01"
)){
return
2
;}
//交易失败
if
(
StringUtils
.
equals
(
transStatus
,
"02"
)){
return
3
;}
//交易已受理
if
(
StringUtils
.
equals
(
transStatus
,
"80"
)){
return
4
;}
//订单初始状态
if
(
StringUtils
.
equals
(
transStatus
,
"90"
)){
return
5
;}
//交易不存在
if
(
StringUtils
.
equals
(
transStatus
,
"99"
)){
return
6
;}
//交易超时,须发起交易结果查询
return
1
;
}
@Override
public
void
orderPayCallback
(
String
merSeqNo
,
String
transSeqNo
,
BigDecimal
trxAmt
,
String
transStatus
)
{
log
.
info
(
"宁波银行支付回调, merSeqNo:{}, transSeqNo:{}, transSeqNo:{}, transSeqNo:{}"
,
merSeqNo
,
transSeqNo
,
trxAmt
,
transStatus
);
if
(
StringUtils
.
equals
(
transStatus
,
"00"
)){
//交易成功
}
if
(
StringUtils
.
equals
(
transStatus
,
"01"
)){
//交易失败
}
if
(
StringUtils
.
equals
(
transStatus
,
"02"
)){
//交易已受理
}
if
(
StringUtils
.
equals
(
transStatus
,
"80"
)){
//订单初始状态
}
if
(
StringUtils
.
equals
(
transStatus
,
"90"
)){
//交易不存在
}
if
(
StringUtils
.
equals
(
transStatus
,
"99"
)){
//交易超时,须发起交易结果查询
}
}
}
performance-web/src/main/java/com/clx/performance/service/impl/thirdparty/nbbank/NbBankThirdpartyServiceImpl.java
0 → 100644
浏览文件 @
8a5357de
package
com
.
clx
.
performance
.
service
.
impl
.
thirdparty
.
nbbank
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
com.clx.performance.config.nbbank.NbBankConfig
;
import
com.clx.performance.dao.nbbank.NbBankRecordDao
;
import
com.clx.performance.enums.PerformanceResultEnum
;
import
com.clx.performance.enums.nbbank.NbBankRecordEnum
;
import
com.clx.performance.model.nbbank.NbBankRecord
;
import
com.clx.performance.service.thirdparty.nbbank.NbBankThirdpartyService
;
import
com.clx.performance.utils.LocalDateTimeUtils
;
import
com.msl.common.exception.ServiceSystemException
;
import
com.nbopen.api.*
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.core.io.ClassPathResource
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Propagation
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.util.HashMap
;
import
java.util.Objects
;
/**
* 易付通
*/
@Slf4j
@Service
public
class
NbBankThirdpartyServiceImpl
implements
NbBankThirdpartyService
{
@Autowired
private
NbBankConfig
nbBankConfig
;
@Autowired
private
NbBankRecordDao
nbBankRecordDao
;
static
{
ClassPathResource
classPathResource
=
new
ClassPathResource
(
"bank/config-nbbank.json"
);
InputStream
inputStream
;
try
{
inputStream
=
classPathResource
.
getInputStream
();
boolean
initResult
=
NBOpenSDK
.
init
(
inputStream
);
log
.
info
(
"NBSDK初始化状态:{}"
,
initResult
);
log
.
info
(
"sdk版本信息:{}"
,
NBOpenSDK
.
getVersionInfo
());
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
}
/**
* 下单
* 5.5转账直连下单
* 商户号:EFT33021200556315
* 银行转账:86041110000075918(户名:客户客户)
* 订单支付:结算账号(86041110000075926(户名:客户客户))
* 响应结果:
*{
* "data": {
* "acctNm": "客户客户",
* "acctOpenBankNm": "宁波银行股份有限公司",
* "bankId": "313332082914",
* "cardNo": "86041110000075918",
* "errorCode": "000000",
* "errorMsg": "成功",
* "signNo": "2976409",
* "transSeqNo": "20231129142846065496766yDTQtg2",
* "virtualDays": "2024-05-26"
* },
* "head": {
* "rqsJrnlNo": "15543427719351510",
* "rspCode": "000000",
* "rspDate": "2023-11-29",
* "rspMsg": "交易成功",
* "rspTime": "14:28:49:600"
* }
* }
*/
@Override
public
JSONObject
directBankTransferOrder
(
String
merSeqNo
)
{
try
{
JSONObject
jsonObject
=
new
JSONObject
();
jsonObject
.
put
(
"transId"
,
"IP01"
);
//交易识别码 必填
jsonObject
.
put
(
"merId"
,
"EFT33021200556315"
);
//商户号 必填
jsonObject
.
put
(
"merSeqNo"
,
merSeqNo
);
//商户流水 必填
jsonObject
.
put
(
"merDtTm"
,
LocalDateTimeUtils
.
formatTime
());
//商户时间 必填
jsonObject
.
put
(
"trxAmt"
,
"1.23"
);
//订单金额 必填
jsonObject
.
put
(
"orderDesc"
,
"采购"
);
//订单详情 必填
jsonObject
.
put
(
"productName"
,
"小黄鱼"
);
//商品名称 必填
jsonObject
.
put
(
"productId"
,
"001"
);
//商品编号 必填
jsonObject
.
put
(
"productNum"
,
"1"
);
//商品数量 必填
// jsonObject.put("closeDtTm", "2023-11-29 13:39:16"); //关单时间
// jsonObject.put("mobilePhone", "13000000000"); //手机号
HashMap
<
String
,
String
>
httpHeader
=
new
HashMap
<>();
RequestApiData
requestApiData
=
new
RequestApiData
();
requestApiData
.
setAppkey
(
nbBankConfig
.
getAppKey
());
requestApiData
.
setData
(
jsonObject
);
requestApiData
.
setProductId
(
"YFT"
);
requestApiData
.
setServiceId
(
"directBankTransferOrder"
);
requestApiData
.
setHttpHeader
(
httpHeader
);
RequestHead
requestHead
=
new
RequestHead
();
requestHead
.
setRqsJrnlNo
(
NBOpenSDK
.
getRandom
());
SDKRequest
request
=
new
SDKRequest
();
request
.
setData
(
requestApiData
);
request
.
setHead
(
requestHead
);
log
.
info
(
"宁波银行, 下单(directBankTransferOrder), 参数: {}"
,
JSON
.
toJSONString
(
request
));
SDKResponse
response
=
NBOpenSDK
.
send
(
request
);
log
.
info
(
"宁波银行, 下单(directBankTransferOrder), 结果: {}"
,
JSON
.
toJSONString
(
response
));
recordSave
(
NbBankRecordEnum
.
Type
.
DIRECT_BANK_TRANSFER_ORDER
.
getCode
(),
request
,
response
);
JSONObject
responseJson
=
JSON
.
parseObject
(
JSON
.
toJSONString
(
response
));
JSONObject
data
=
responseJson
.
getJSONObject
(
"data"
);
if
(!
StringUtils
.
equals
(
data
.
getString
(
"errorCode"
),
"000000"
)){
log
.
info
(
"宁波银行, 下单失败(directBankTransferOrder), code:{}, msg:{}"
,
data
.
getString
(
"errorCode"
),
data
.
getString
(
"errorMsg"
));
throw
new
ServiceSystemException
(
PerformanceResultEnum
.
NB_BANK_API_ERROR
);
}
return
data
;
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
throw
new
ServiceSystemException
(
PerformanceResultEnum
.
NB_BANK_API_ERROR
);
}
/**
* 订单支付收款模式
* 易付通接口编程-含订单支付
* 5.13银联订单支付收款模式
* 商户号:EFT33021200556315
* 银行转账:86041110000075918(户名:客户客户)
* 订单支付:结算账号(86041110000075926(户名:客户客户))
* 86041110000076809:黑玫瑰
* 响应结果:
* {
* "data": {
* "errorCode": "000000",
* "errorMsg": "成功",
* "frontUrl": "",
* "merId": "EFT33021200556315",
* "merSeqNo": "20231129133913",
* "signData": "",
* "transSeqNo": "2023112913391406547689VYvNioNz"
* },
* "head": {
* "rqsJrnlNo": "14414965925389704",
* "rspCode": "000000",
* "rspDate": "2023-11-29",
* "rspMsg": "交易成功",
* "rspTime": "13:39:16:035"
* }
* }
*/
@Override
public
JSONObject
unionPayDirectOrder
(
String
merSeqNo
)
{
try
{
JSONObject
jsonObject
=
new
JSONObject
();
jsonObject
.
put
(
"transId"
,
"IP01"
);
//交易识别码 必填
jsonObject
.
put
(
"merId"
,
"EFT33021200556315"
);
//商户号 必填
jsonObject
.
put
(
"merSeqNo"
,
merSeqNo
);
//商户流水 必填
jsonObject
.
put
(
"merDtTm"
,
LocalDateTimeUtils
.
formatTime
());
//商户时间 必填
jsonObject
.
put
(
"trxAmt"
,
"0.01"
);
//订单金额 必填
jsonObject
.
put
(
"orderDesc"
,
"采购"
);
//订单详情 必填
jsonObject
.
put
(
"productName"
,
"小黄鱼"
);
//商品名称 必填
jsonObject
.
put
(
"productId"
,
"001"
);
//商品编号 必填
jsonObject
.
put
(
"productNum"
,
"1"
);
//商品数量 必填
jsonObject
.
put
(
"payAcctNo"
,
"86041110000076809"
);
//付款账号 必填
jsonObject
.
put
(
"payAcctNm"
,
"黑玫瑰"
);
//付款户名 必填
jsonObject
.
put
(
"bankType"
,
"00"
);
//账户类型 必填
jsonObject
.
put
(
"payAcctOpenBankId"
,
"313332082914"
);
//开户行号 必填
// jsonObject.put("mobilePhone", "13000000000"); //手机号
HashMap
<
String
,
String
>
httpHeader
=
new
HashMap
<>();
RequestApiData
requestApiData
=
new
RequestApiData
();
requestApiData
.
setAppkey
(
nbBankConfig
.
getAppKey
());
requestApiData
.
setData
(
jsonObject
);
requestApiData
.
setProductId
(
"YFT"
);
requestApiData
.
setServiceId
(
"unionPayDirectOrder"
);
requestApiData
.
setHttpHeader
(
httpHeader
);
RequestHead
requestHead
=
new
RequestHead
();
requestHead
.
setRqsJrnlNo
(
NBOpenSDK
.
getRandom
());
SDKRequest
request
=
new
SDKRequest
();
request
.
setData
(
requestApiData
);
request
.
setHead
(
requestHead
);
log
.
info
(
"宁波银行, 下单(unionPayDirectOrder), 参数: {}"
,
JSON
.
toJSONString
(
request
));
SDKResponse
response
=
NBOpenSDK
.
send
(
request
);
log
.
info
(
"宁波银行, 下单(unionPayDirectOrder), 结果: {}"
,
JSON
.
toJSONString
(
response
));
recordSave
(
NbBankRecordEnum
.
Type
.
UNION_PAY_DIRECT_ORDER
.
getCode
(),
request
,
response
);
JSONObject
responseJson
=
JSON
.
parseObject
(
JSON
.
toJSONString
(
response
));
JSONObject
data
=
responseJson
.
getJSONObject
(
"data"
);
if
(!
StringUtils
.
equals
(
data
.
getString
(
"errorCode"
),
"000000"
)){
log
.
info
(
"宁波银行, 下单失败(unionPayDirectOrder), code:{}, msg:{}"
,
data
.
getString
(
"errorCode"
),
data
.
getString
(
"errorMsg"
));
throw
new
ServiceSystemException
(
PerformanceResultEnum
.
NB_BANK_API_ERROR
);
}
return
data
;
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
throw
new
ServiceSystemException
(
PerformanceResultEnum
.
NB_BANK_API_ERROR
);
}
/**
* 结果查询
* 6.1交易结果查询
* 商户号:EFT33021200556315
* 返回结果: 90:交易不存在
* {
* "data": {
* "chargesAmt": "",
* "chargesType": "",
* "clearDate": "",
* "errorCode": "000000",
* "errorMsg": "成功",
* "merId": "EFT33021200556315",
* "merSeqNo": "20231129135754",
* "payeeAcctBankName": "",
* "payeeAcctBankNo": "",
* "payeeAcctName": "",
* "payeeAcctNo": "",
* "payMethod": "",
* "pyerInfList": [
* {
* "customerId": "",
* "pyerAcctBankName": "",
* "pyerAcctName": "",
* "pyerAcctNo": "",
* "signNo": "",
* "transAmt": "",
* "transDtTm": ""
* }
* ],
* "realTrxAmt": "",
* "transSeqNo": "",
* "transStatus": "90",
* "trxAmt": ""
* },
* "head": {
* "rqsJrnlNo": "15541586367762936",
* "rspCode": "000000",
* "rspDate": "2023-11-29",
* "rspMsg": "交易成功",
* "rspTime": "13:57:54:343"
* }
* }
* 返回结果: 02:交易已受理
* {
* "data": {
* "chargesAmt": "",
* "chargesType": "",
* "clearDate": "20231129",
* "errorCode": "000000",
* "errorMsg": "成功",
* "merId": "EFT33021200556315",
* "merSeqNo": "20231129142845",
* "payeeAcctBankName": "宁波银行股份有限公司",
* "payeeAcctBankNo": "313332082914",
* "payeeAcctName": "客户客户",
* "payeeAcctNo": "860411100000759182976409",
* "payMethod": "4",
* "pyerInfList": [
* {
* "customerId": "",
* "pyerAcctBankName": "",
* "pyerAcctName": "",
* "pyerAcctNo": "",
* "signNo": "",
* "transAmt": "",
* "transDtTm": ""
* }
* ],
* "realTrxAmt": "0",
* "transSeqNo": "20231129142846065496766yDTQtg2",
* "transStatus": "02",
* "trxAmt": "1.23"
* },
* "head": {
* "rqsJrnlNo": "15543431902274569",
* "rspCode": "000000",
* "rspDate": "2023-11-29",
* "rspMsg": "交易成功",
* "rspTime": "14:28:51:431"
* }
* }
*
* transStatus:
* 00:交易成功
* 01:交易失败
* 02:交易已受理
* 80:订单初始状态
* 90:交易不存在
* 99:交易超时,须发起交易结果查询
*/
@Override
public
SDKResponse
queryOrder
(
String
merSeqNo
)
{
try
{
JSONObject
jsonObject
=
new
JSONObject
();
jsonObject
.
put
(
"transId"
,
"IP01"
);
//交易识别码 必填
jsonObject
.
put
(
"merId"
,
"EFT33021200556315"
);
//商户号 必填
jsonObject
.
put
(
"merSeqNo"
,
merSeqNo
);
//商户流水 必填
HashMap
<
String
,
String
>
httpHeader
=
new
HashMap
<>();
RequestApiData
requestApiData
=
new
RequestApiData
();
requestApiData
.
setAppkey
(
nbBankConfig
.
getAppKey
());
requestApiData
.
setData
(
jsonObject
);
requestApiData
.
setProductId
(
"YFT"
);
requestApiData
.
setServiceId
(
"queryOrder"
);
requestApiData
.
setHttpHeader
(
httpHeader
);
RequestHead
requestHead
=
new
RequestHead
();
requestHead
.
setRqsJrnlNo
(
NBOpenSDK
.
getRandom
());
SDKRequest
request
=
new
SDKRequest
();
request
.
setData
(
requestApiData
);
request
.
setHead
(
requestHead
);
log
.
info
(
"SDK请求内容queryOrder: "
+
JSON
.
toJSONString
(
request
));
SDKResponse
response
=
NBOpenSDK
.
send
(
request
);
log
.
info
(
"SDK响应结果queryOrder: "
+
JSON
.
toJSONString
(
response
));
recordSave
(
NbBankRecordEnum
.
Type
.
QUERY_ORDER
.
getCode
(),
request
,
response
);
return
response
;
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
throw
new
ServiceSystemException
(
PerformanceResultEnum
.
NB_BANK_API_ERROR
);
}
@Override
public
void
recordSave
(
Integer
type
,
SDKRequest
request
,
SDKResponse
response
)
{
if
(
Objects
.
equals
(
type
,
NbBankRecordEnum
.
Type
.
DIRECT_BANK_TRANSFER_ORDER
.
getCode
()))
{
RequestApiData
requestData
=
(
RequestApiData
)
(
request
.
getData
());
JSONObject
requestDataJson
=
(
JSONObject
)
(
requestData
.
getData
());
JSONObject
responseJson
=
JSON
.
parseObject
(
JSON
.
toJSONString
(
response
));
JSONObject
responseDataJson
=
responseJson
.
getJSONObject
(
"data"
);
recordSave
(
type
,
requestDataJson
.
getString
(
"merId"
)
,
requestDataJson
.
getString
(
"merSeqNo"
)
,
responseDataJson
.
getString
(
"transSeqNo"
)
,
requestDataJson
.
getBigDecimal
(
"amount"
).
movePointRight
(
2
).
intValue
()
,
JSON
.
toJSONString
(
request
)
,
JSON
.
toJSONString
(
response
)
,
responseDataJson
.
getString
(
"errorCode"
)
,
responseDataJson
.
getString
(
"errorMsg"
)
,
null
);
}
else
if
(
Objects
.
equals
(
type
,
NbBankRecordEnum
.
Type
.
UNION_PAY_DIRECT_ORDER
.
getCode
()))
{
RequestApiData
requestData
=
(
RequestApiData
)
(
request
.
getData
());
JSONObject
requestDataJson
=
(
JSONObject
)
(
requestData
.
getData
());
JSONObject
responseJson
=
JSON
.
parseObject
(
JSON
.
toJSONString
(
response
));
JSONObject
responseDataJson
=
responseJson
.
getJSONObject
(
"data"
);
recordSave
(
type
,
requestDataJson
.
getString
(
"merId"
)
,
requestDataJson
.
getString
(
"merSeqNo"
)
,
responseDataJson
.
getString
(
"transSeqNo"
)
,
requestDataJson
.
getBigDecimal
(
"trxAmt"
).
movePointRight
(
2
).
intValue
()
,
JSON
.
toJSONString
(
request
)
,
JSON
.
toJSONString
(
response
)
,
responseDataJson
.
getString
(
"errorCode"
)
,
responseDataJson
.
getString
(
"errorMsg"
)
,
null
);
}
else
if
(
Objects
.
equals
(
type
,
NbBankRecordEnum
.
Type
.
QUERY_ORDER
.
getCode
()))
{
JSONObject
responseJson
=
JSON
.
parseObject
(
JSON
.
toJSONString
(
response
));
JSONObject
responseDataJson
=
responseJson
.
getJSONObject
(
"data"
);
recordSave
(
type
,
responseDataJson
.
getString
(
"merId"
)
,
responseDataJson
.
getString
(
"merSeqNo"
)
,
responseDataJson
.
getString
(
"transSeqNo"
)
,
responseDataJson
.
getBigDecimal
(
"trxAmt"
).
movePointRight
(
2
).
intValue
()
,
JSON
.
toJSONString
(
request
)
,
JSON
.
toJSONString
(
response
)
,
null
,
null
,
responseDataJson
.
getString
(
"transStatus"
)
);
}
else
if
(
Objects
.
equals
(
type
,
NbBankRecordEnum
.
Type
.
NOTIFY_MERCHANT
.
getCode
()))
{
JSONObject
responseJson
=
JSON
.
parseObject
(
JSON
.
toJSONString
(
response
));
JSONObject
responseDataJson
=
responseJson
.
getJSONObject
(
"data"
);
recordSave
(
type
,
responseDataJson
.
getString
(
"merId"
)
,
responseDataJson
.
getString
(
"merSeqNo"
)
,
responseDataJson
.
getString
(
"transSeqNo"
)
,
responseDataJson
.
getBigDecimal
(
"trxAmt"
).
movePointRight
(
2
).
intValue
()
,
JSON
.
toJSONString
(
request
)
,
JSON
.
toJSONString
(
response
)
,
null
,
null
,
responseDataJson
.
getString
(
"transStatus"
)
);
}
}
@Transactional
(
propagation
=
Propagation
.
REQUIRES_NEW
)
public
void
recordSave
(
Integer
type
,
String
merId
,
String
merSeqNo
,
String
transSeqNo
,
Integer
amount
,
String
param
,
String
result
,
String
errorCode
,
String
errorMsg
,
String
transStatus
){
NbBankRecord
record
=
new
NbBankRecord
();
record
.
setType
(
type
);
record
.
setMerId
(
merId
);
record
.
setMerSeqNo
(
merSeqNo
);
record
.
setTransSeqNo
(
transSeqNo
);
record
.
setAmount
(
amount
);
record
.
setParam
(
param
);
record
.
setResult
(
result
);
record
.
setTransStatus
(
errorCode
);
record
.
setTransStatus
(
errorMsg
);
record
.
setTransStatus
(
transStatus
);
nbBankRecordDao
.
saveEntity
(
record
);
}
}
performance-web/src/main/java/com/clx/performance/service/thirdparty/nbbank/NbBankNotifyService.java
0 → 100644
浏览文件 @
8a5357de
package
com
.
clx
.
performance
.
service
.
thirdparty
.
nbbank
;
public
interface
NbBankNotifyService
{
void
payNotify
(
String
data
);
}
performance-web/src/main/java/com/clx/performance/service/thirdparty/nbbank/NbBankService.java
0 → 100644
浏览文件 @
8a5357de
package
com
.
clx
.
performance
.
service
.
thirdparty
.
nbbank
;
import
java.math.BigDecimal
;
public
interface
NbBankService
{
String
orderPay
(
Integer
payType
);
Integer
getOrderStatus
(
String
merSeqNo
);
void
orderPayCallback
(
String
merSeqNo
,
String
transSeqNo
,
BigDecimal
trxAmt
,
String
transStatus
);
}
performance-web/src/main/java/com/clx/performance/service/thirdparty/nbbank/NbBankThirdpartyService.java
0 → 100644
浏览文件 @
8a5357de
package
com
.
clx
.
performance
.
service
.
thirdparty
.
nbbank
;
import
com.alibaba.fastjson.JSONObject
;
import
com.nbopen.api.SDKRequest
;
import
com.nbopen.api.SDKResponse
;
public
interface
NbBankThirdpartyService
{
JSONObject
directBankTransferOrder
(
String
merSeqNo
);
JSONObject
unionPayDirectOrder
(
String
merSeqNo
);
SDKResponse
queryOrder
(
String
merSeqNo
);
void
recordSave
(
Integer
type
,
SDKRequest
request
,
SDKResponse
response
);
}
performance-web/src/main/resources/bank/config-nbbank.json
0 → 100644
浏览文件 @
8a5357de
{
"api"
:
[
{
"appKey"
:
"77667c76_3503_4c04_95f7_fc10938c7942"
,
"publicUrl"
:
"https://open-test.nbcb.com.cn/sit/nbcb/api"
,
"platfromPublicKeyPath"
:
"/app/clx-performance/nbbank/bankPubKey-test.cer"
,
"merchantPrivateKeyPath"
:
"/app/clx-performance/nbbank/77667c76_3503_4c04_95f7_fc10938c7942.sm2"
,
"merchantPrivateKeyPwd"
:
"cfca"
,
"connectTimeout"
:
10000
,
"readTimeout"
:
30000
,
"merchantName"
:
""
,
"subMerchantName"
:
""
,
"subMerchantId"
:
""
,
"isProxy"
:
false
,
"proxyIp"
:
""
,
"proxyPort"
:
80
}
],
"file"
:
[
{
"uid"
:
"TEST"
,
"publicFileUrl"
:
"https://file-test.nbcb.com.cn/sit"
,
"clientIp"
:
"127.0.0.1"
,
"passwd"
:
"nbcb123456"
,
"apiVersion"
:
"201809101526"
,
"isProxy"
:
false
,
"proxyIp"
:
""
,
"proxyPort"
:
80
}
]
}
\ No newline at end of file
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论