提交 5ed6ba83 authored 作者: aiqingguo's avatar aiqingguo

Merge branch 'v10.7_borrowing_and_repayment_20240118' into test

# Conflicts: # performance-web/src/main/java/com/clx/performance/controller/temp/TempBankController.java # performance-web/src/main/java/com/clx/performance/controller/thirdparty/NbBankController.java
......@@ -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;
......
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);
}
}
}
......@@ -263,6 +263,12 @@
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.nbopen</groupId>
<artifactId>openBasicSDK</artifactId>
<version>1.7.0</version>
</dependency>
</dependencies>
......
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";
}
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.core.io.ClassPathResource;
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.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@RestController
@RequestMapping(value="/nbbank")
@Api(tags = "宁波银行回调")
@Api(tags = "宁波银行回调 (易付通)")
public class NbBankController {
static {
ClassPathResource classPathResource = new ClassPathResource("bank/config-nbbank.json");
InputStream inputStream = null;
try {
inputStream = classPathResource.getInputStream();
boolean initResult = NBOpenSDK.init(inputStream);
log.info("NBSDK初始化状态:{}", initResult);
log.info("sdk版本信息:{}", NBOpenSDK.getVersionInfo());
} catch (IOException e) {
e.printStackTrace();
}
@Autowired
private NbBankNotifyService nbBankNotifyService;
}
/**
* 解密后
* {
* "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"
* }
* }
*/
@ApiOperation(value = "notify", notes = "<br>By:艾庆国")
@RequestMapping(value = "/notify", method = RequestMethod.POST)
public Object notify(@RequestBody Map<String, Object> body) throws Exception {
log.info("宁波银行回调, data:{}", JSON.toJSONString(body));
try {
RequestApiData requestApiData = new RequestApiData();
requestApiData.setAppkey("77667c76_3503_4c04_95f7_fc10938c7942");
requestApiData.setData(JSON.parseObject(JSON.toJSONString(body)));
requestApiData.setServiceId("notifyMerchant");
RequestHead requestHead = new RequestHead();
requestHead.setRqsJrnlNo(NBOpenSDK.getRandom());
SDKRequest request = new SDKRequest();
request.setData(requestApiData);
request.setHead(requestHead);
System.out.println("SDK请求内容: " + JSON.toJSONString(request));
SDKResponse result = NBOpenSDK.decryptMessage(request);
System.out.println("SDK响应结果: " + JSON.toJSONString(result));
nbBankNotifyService.payNotify(JSON.toJSONString(body));
return getResultSuc();
}catch (Exception e){
e.printStackTrace();
return getResultFail();
}
return getResultSuc();
}
private Object getResultSuc() throws Exception {
......@@ -128,6 +62,7 @@ public class NbBankController {
return result.getData();
}
private Object getResultFail() throws Exception {
Map<String, String> data = new HashMap<>();
......
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 {
}
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> {
}
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
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
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);
}
}
}
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")){ //交易超时,须发起交易结果查询
}
}
}
package com.clx.performance.service.thirdparty.nbbank;
public interface NbBankNotifyService {
void payNotify(String data);
}
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);
}
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);
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论