提交 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.temp;
//
//import com.alibaba.fastjson.JSON;
//import com.clx.performance.service.TempService;
//import com.clx.performance.vo.pc.child.OrderChildLineStatisticsVO;
//import com.msl.common.result.Result;
//import com.nbcb.bouncycastle.util.encoders.Base64;
//import com.nbcb.sdk.OpenSDK;
//import com.nbcb.sdk.file.FileUploadRequest;
//import io.swagger.annotations.ApiOperation;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.repository.init.ResourceReader;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RequestMethod;
//import org.springframework.web.bind.annotation.RestController;
//
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.io.InputStream;
//import java.math.BigDecimal;
//import java.util.HashMap;
//
//
///**
// * @Author: aiqingguo
// * @Description: 临时接口
// * @Date: 2023-8-21 12:10:16
// * @Version: 1.0
// */
//@Slf4j
//@RestController
//@RequestMapping(value="/temp/bank")
//public class TempBankController {
//
// @Autowired
// private TempService tempService;
//
// @ApiOperation(value = "test", notes = "<br>By:艾庆国")
// @RequestMapping(value = "/test", method = RequestMethod.POST)
// public Result<OrderChildLineStatisticsVO> test() throws Exception {
//
// bankTest();
//
//
// return Result.ok();
// }
//
// static void bankTest() throws Exception {
// String priKey = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgTt6OadouxxxSDg/0SZdOIBqtnFGKrpwmL+quEUf+hfSgCgYIKoEcz1UBgi2hRANCAAQGHNN2NO7btp+w1248yk98E0asGC8sG0bmIzdom4M0xp3vc4IfXjmZ8omUz4oVcjzAuyMSSpJM6uPLcU1SH4HZ";
//
// InputStream inputStream = TempBankController.class.getClassLoader().getResourceAsStream("config.properties");
// if (inputStream != null) {
// log.info("存在");
//
// OpenSDK.init(inputStream, priKey);
//
//// singleTransfer();
////
//// querySingleTransferResult();
//
//
// unionPayDirectOrder();
//
// }
// else{
// log.info("文件不存在");
// }
//
// }
//
// static String singleTransfer() throws Exception {
//
// HashMap<String, Object> map = new HashMap();
// HashMap<String, Object> data = new HashMap();
// map.put("Data", data);
//
// data.put("custId", "0000112058"); //客户号 必填
// data.put("serialNo", "2023112300000002"); //交易流水号 必填
// data.put("corpCode", "1000"); //单位代码 必填
// data.put("payAcc", "40010122000156763"); //付款账号 必填
// data.put("rcvAcc", "6223160014441539"); //收款账号 必填
//// data.put("rcvBankName", ""); //收款方行名
//// data.put("rcvBankNo", ""); //收款方联行号
// data.put("rcvName", "石佛寺"); //收款户名 必填
// data.put("purpose", "001-支付货款"); //用途 必填
//// data.put("remark", ""); //备注
//// data.put("isSubscribe", "0"); //是否预约支付
//// data.put("difBank", "1"); //是否同行转账
//// data.put("areaSign", "1"); //同城异地标识
// data.put("amt", new BigDecimal("100")); //金额 必填
//// data.put("wishPayTime", ""); //预约转账时间
//// data.put("isTellRcv", "0"); //是否短信通知收款人
//// data.put("rcvMobile", ""); //收款方手机号
//// data.put("isForIndividual", "0"); //对公对私标识
//// data.put("subaAccountSerial", ""); //统计编号
//// data.put("itemCode", ""); //预算科目代码
//// data.put("budgetMoney", ""); //预算执行金额
//// data.put("subjectName", ""); //智能财报科目
//// data.put("payType", "0"); //支付方式
//// data.put("remarkAcc", ""); //代理/联动账号
//// data.put("erpRemark1", ""); //ERP 备注 1
//// data.put("erpRemark2", ""); //ERP 备注 1
//// data.put("erpRemark3", ""); //ERP 备注 1
//// data.put("erpRemark4", ""); //ERP 备注 1
//
// String res1 = OpenSDK.send("tmsSettle", "singleTransfer", JSON.toJSONString(map));
// log.info("单笔转账接口:{}" , res1);
//
// return res1;
// }
//
// static String querySingleTransferResult() throws Exception {
// HashMap<String, Object> map = new HashMap();
// HashMap<String, Object> data = new HashMap();
// map.put("Data", data);
//
// data.put("custId", "0000112058"); //客户号 必填
// data.put("serialNo", "2023112300000002"); //交易流水号 必填
//
// String res1 = OpenSDK.send("tmsSettle", "querySingleTransferResult", JSON.toJSONString(map));
// log.info("单笔查证接口:{}" , res1);
//
// return res1;
// }
//
//
// /**
// * 易付通
// */
// static String unionPayDirectOrder() throws Exception {
//
// HashMap<String, Object> map = new HashMap();
// HashMap<String, Object> data = new HashMap();
// map.put("Data", data);
//
// data.put("transId", "IP01"); //交易识别码 必填
// data.put("merId", "2023112300000002"); //商户号 必填
// data.put("merSeqNo", "2023112300000001"); //商户流水 必填
// data.put("merDtTm", "2023-11-24 11:00:00"); //商户时间 必填
// data.put("trxAmt", "1.23"); //订单金额 必填
// data.put("orderDesc", "采购"); //订单详情 必填
// data.put("productNam", "小黄鱼"); //商品名称 必填
// data.put("productId", "001"); //商品编号 必填
// data.put("productNum", "1"); //商品数量 必填
//
// data.put("payAcctNo", "6223161100110442"); //付款账号 必填
// data.put("payAcctNm", "刘晓琴"); //付款户名 必填
// data.put("bankType", "00"); //账户类型 必填
// data.put("payAcctOpenBankId", "313332082914"); //开户行号 必填
//// data.put("mobilePhone", "13000000000"); //手机号
//
// String res1 = OpenSDK.send("YFT", "unionPayDirectOrder", JSON.toJSONString(map));
// log.info("银联订单支付收款模式接口:{}" , res1);
//
// return res1;
// }
//
//
// public static void main(String[] args) throws Exception {
//
// bankTest();
//
//// try {
//// callBySepJson();
//// //demo.callByBean();
//// } catch (Exception e) {
//// e.printStackTrace();
//// }
// }
//
// /**
// * @throws Exception
// */
// public static void callBySepJson() throws Exception {
// String priKey = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgTt6OadouxxxSDg/0SZdOIBqtnFGKrpwmL+quEUf+hfSgCgYIKoEcz1UBgi2hRANCAAQGHNN2NO7btp+w1248yk98E0asGC8sG0bmIzdom4M0xp3vc4IfXjmZ8omUz4oVcjzAuyMSSpJM6uPLcU1SH4HZ";
//
// System.out.println(TempBankController.class.getClassLoader().getResource("").getPath());
//
// OpenSDK.init(TempBankController.class.getClassLoader().getResource("config.properties").getPath(), priKey);
//
//
// /*
// * dataJson 是放置具体交易请求业务报文,dataJson报文结构如下: {"Data":{"app_name":"1"}}
// */
//// String dataJson="";
//// // 发送请求并获取响应(第一个填入productId,第二个填入serviceId)
//// String res = OpenSDK.send("", "", dataJson);
//// if (log.isDebugEnabled()) {
//// log.debug("res: " + res);
//// }
//
// //上传文件
// String res1 = OpenSDK.sendFile("", "open-filegateway",TempBankController.class.getClassLoader().getResource("bank.txt").getPath());
//
// System.out.println(res1);
// //下载文件
//// String res = OpenSDK.sendFileDownload( "productId","fcd47917-bc9c-4c11-b217-f7095f5384fe","D:\\ab\\test");
// }
//
// /**
// * JavaBean方式(通过产品SDK提供的JavaBean)
// *
// * @throws Exception
// */
// public void callByBean() throws Exception {
//
// }
//
//}
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));
}
}
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.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);
}
}
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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论