diff --git a/open-api/src/main/java/com/api/controller/v1/NotifyController.java b/open-api/src/main/java/com/api/controller/v1/NotifyController.java index a6548f6..dfb99c3 100644 --- a/open-api/src/main/java/com/api/controller/v1/NotifyController.java +++ b/open-api/src/main/java/com/api/controller/v1/NotifyController.java @@ -183,6 +183,7 @@ public class NotifyController { outSplitRspInfos.setMerchantName(subTradeOrder.getMerName()); outSplitRspInfos.setAmount(subTradeOrder.getTradeAmount()); outSplitRspInfos.setOutSubTradeNo(subTradeOrder.getOutTradeNo()); + outSplitRspInfos.setSubAttach(subTradeOrder.getAttach()); responseOutSplitRspInfos.add(outSplitRspInfos); } diff --git a/open-api/src/main/java/com/api/controller/v1/TestController.java b/open-api/src/main/java/com/api/controller/v1/TestController.java index 427e005..ba3eb20 100644 --- a/open-api/src/main/java/com/api/controller/v1/TestController.java +++ b/open-api/src/main/java/com/api/controller/v1/TestController.java @@ -1,6 +1,8 @@ package com.api.controller.v1; import com.alibaba.fastjson.JSONObject; +import com.hfkj.channel.lakala.LaKaLaTradeMergeService; +import com.hfkj.channel.lakala.LaKaLaTradeService; import com.hfkj.common.exception.ErrorCode; import com.hfkj.common.exception.ErrorHelp; import com.hfkj.common.exception.SysCode; @@ -63,6 +65,60 @@ public class TestController { @Resource private BsMerService merService; + @RequestMapping(value="/preorder",method = RequestMethod.POST) + @ResponseBody + @ApiOperation(value = "合单支付") + public Object preorder(@RequestParam(value = "transType" , required = true) String transType, + @RequestParam(value = "payMode" , required = true) String payMode) { + log.info("========= Start 分账发起接口 Start ==========="); + try { + Map reqBody = new HashMap<>(); + reqBody.put("merchantNo", "2023041916292112804"); + reqBody.put("outTradeNo", DateUtil.date2String(new Date(),DateUtil.YMDHMS)+ IDGenerator.nextId(2)); + reqBody.put("totalAmount", "1.5"); + reqBody.put("subject", "测试交易"); + reqBody.put("notifyUrl", "https://gratia-pay.dctpay.com/openApi/v1/payNotify/test"); + reqBody.put("transType", transType);//"NATIVE" "JSAP I" + reqBody.put("payMode", payMode); // WECHAT ALIPAY UQRCODEPAY + reqBody.put("profitSharing", 0); + if (payMode.equals("ALIPAY")) { + reqBody.put("userId", "2088612673845396"); + } else { + reqBody.put("subAppid", "wxa075e8509802f826"); + reqBody.put("userId", "od8qG06bHnTsDWklsB2VsssLZYcQ"); + } + reqBody.put("attach", "测试附加域"); + reqBody.put("specialField", "测试特殊字段"); + + /* List> outSplitInfoList = new ArrayList<>(); + Map outSplitInfo1 = new HashMap<>(); + outSplitInfo1.put("outSubTradeNo", MapUtils.getString(reqBody,"outTradeNo")+"_1"); + outSplitInfo1.put("merchantNo", "2023041916292112804"); + outSplitInfo1.put("amount", "1"); + outSplitInfoList.add(outSplitInfo1); + + Map outSplitInfo2 = new HashMap<>(); + outSplitInfo2.put("outSubTradeNo", MapUtils.getString(reqBody,"outTradeNo")+"_2"); + outSplitInfo2.put("merchantNo", "2024061217292423201"); + outSplitInfo2.put("amount", "0.5"); + outSplitInfoList.add(outSplitInfo2); + + reqBody.put("outSplitInfo", outSplitInfoList);*/ + reqBody.put("sign", SignatureUtil.createSign(reqBody,merKeyService.getKeyByMerNo(MapUtils.getString(reqBody,"merchantNo")))); + + JSONObject object = HttpsUtils.doPost("http://localhost:9605/openApi/v1/trade/preorder", JSONObject.parseObject(JSONObject.toJSONString(reqBody))); + log.info("返回参数:" + JSONObject.toJSONString(object)); + return object; + + } catch (Exception e) { + log.info("出现异常:", e); + return ResponseMsgUtil.exception(e); + } finally { + log.info("========= END 分账发起接口 END ==========="); + } + } + + @RequestMapping(value="/mergePreorder",method = RequestMethod.POST) @ResponseBody @ApiOperation(value = "合单支付") @@ -71,12 +127,12 @@ public class TestController { log.info("========= Start 分账发起接口 Start ==========="); try { Map reqBody = new HashMap<>(); - reqBody.put("merchantNo", "2023090616352962600"); + reqBody.put("merchantNo", "2023041916292112804"); reqBody.put("outTradeNo", DateUtil.date2String(new Date(),DateUtil.YMDHMS)+ IDGenerator.nextId(2)); - reqBody.put("totalAmount", "1"); + reqBody.put("totalAmount", "1.5"); reqBody.put("subject", "测试交易"); reqBody.put("notifyUrl", "https://gratia-pay.dctpay.com/openApi/v1/payNotify/test"); - reqBody.put("transType", transType);//"NATIVE" "JSAPI" + reqBody.put("transType", transType);//"NATIVE" "JSAP I" reqBody.put("payMode", payMode); // WECHAT ALIPAY UQRCODEPAY if (payMode.equals("ALIPAY")) { reqBody.put("userId", "2088612673845396"); @@ -90,13 +146,13 @@ public class TestController { List> outSplitInfoList = new ArrayList<>(); Map outSplitInfo1 = new HashMap<>(); outSplitInfo1.put("outSubTradeNo", MapUtils.getString(reqBody,"outTradeNo")+"_1"); - outSplitInfo1.put("merchantNo", "2023090616352962600"); - outSplitInfo1.put("amount", "0.5"); + outSplitInfo1.put("merchantNo", "2023041916292112804"); + outSplitInfo1.put("amount", "1"); outSplitInfoList.add(outSplitInfo1); Map outSplitInfo2 = new HashMap<>(); outSplitInfo2.put("outSubTradeNo", MapUtils.getString(reqBody,"outTradeNo")+"_2"); - outSplitInfo2.put("merchantNo", "2023091316462069203"); + outSplitInfo2.put("merchantNo", "2024061217292423201"); outSplitInfo2.put("amount", "0.5"); outSplitInfoList.add(outSplitInfo2); @@ -115,10 +171,10 @@ public class TestController { } } - @RequestMapping(value="/refund",method = RequestMethod.POST) + @RequestMapping(value="/mergeRefund",method = RequestMethod.POST) @ResponseBody @ApiOperation(value = "合单退款") - public Object refund(@RequestBody JSONObject body) { + public Object mergeRefund(@RequestBody JSONObject body) { log.info("========= Start 查询交易 Start ==========="); try { BsTradeOrderMerge orderMerge = tradeOrderMergeService.getOrderMerge(body.getString("outTradeNo")); @@ -158,6 +214,36 @@ public class TestController { } } + @RequestMapping(value="/refund",method = RequestMethod.POST) + @ResponseBody + @ApiOperation(value = "交易退款") + public Object refund(@RequestBody JSONObject body) { + log.info("========= Start 查询交易 Start ==========="); + try { + BsTradeOrder tradeOrder = tradeOrderService.getOrderByOutTradeNo(body.getString("outTradeNo")); + if (tradeOrder == null) { + throw ErrorHelp.genException(SysCode.OpenApi, ErrorCode.COMMON_ERROR, "错误的订单"); + } + Map reqBody = new HashMap<>(); + reqBody.put("merchantNo", tradeOrder.getMerNo()); + reqBody.put("outTradeNo", tradeOrder.getOutTradeNo()); + reqBody.put("refundTradeNo", "R"+DateUtil.date2String(new Date(),DateUtil.YMDHMS)+IDGenerator.nextId(2)); + reqBody.put("refundAmount", body.getBigDecimal("refundAmount")); + reqBody.put("refundReason", "测试退款"); + reqBody.put("sign", SignatureUtil.createSign(reqBody,merKeyService.getKeyByMerNo(MapUtils.getString(reqBody,"merchantNo")))); + System.out.println("请求接口参数:"+JSONObject.toJSONString(reqBody)); + JSONObject object = HttpsUtils.doPost("http://localhost:9605/openApi/v1/trade/refund", JSONObject.parseObject(JSONObject.toJSONString(reqBody))); + log.info("返回参数:" + JSONObject.toJSONString(object)); + return object; + + } catch (Exception e) { + log.info("出现异常:", e); + return ResponseMsgUtil.exception(e); + } finally { + log.info("========= END 查询交易 END ==========="); + } + } + @RequestMapping(value="/queryTrade",method = RequestMethod.POST) @ResponseBody @ApiOperation(value = "查询交易") @@ -184,6 +270,26 @@ public class TestController { log.info("========= END 查询交易 END ==========="); } } + @Resource + private LaKaLaTradeService laKaLaTradeService; + @RequestMapping(value="/lklQueryTrade",method = RequestMethod.POST) + @ResponseBody + @ApiOperation(value = "查询交易") + public Object lklQueryTrade(@RequestBody JSONObject body) { + log.info("========= Start 查询交易 Start ==========="); + try { + + //return laKaLaTradeService.queryTrade(body.getString("outTradeNo")); + //return laKaLaTradeService.queryTradeOrderTrans(body.getString("outTradeNo")); + return laKaLaTradeService.queryTradeOrderRefundTrans(body.getString("outTradeNo")); + + } catch (Exception e) { + log.info("出现异常:", e); + return ResponseMsgUtil.exception(e); + } finally { + log.info("========= END 查询交易 END ==========="); + } + } } diff --git a/open-api/src/main/java/com/api/controller/v1/TradeMergeController.java b/open-api/src/main/java/com/api/controller/v1/TradeMergeController.java index 2f4f6df..fa43dac 100644 --- a/open-api/src/main/java/com/api/controller/v1/TradeMergeController.java +++ b/open-api/src/main/java/com/api/controller/v1/TradeMergeController.java @@ -158,7 +158,7 @@ public class TradeMergeController { // tradeOrder.setPayNotifyUrl(body.getNotifyUrl()); tradeOrder.setSubject(body.getSubject()); tradeOrder.setRefundPrice(new BigDecimal("0")); - tradeOrder.setAttach(body.getAttach()); + tradeOrder.setAttach(outSplitInfo.getSubAttach()); tradeOrder.setSpecialField(body.getSpecialField()); tradeOrder.setRequestIp(tradeOrderMerge.getRequestIp()); tradeOrder.setRebateActivityPart(false); @@ -240,13 +240,14 @@ public class TradeMergeController { outSplitRspInfos.setMerchantName(subTradeOrder.getMerName()); outSplitRspInfos.setAmount(subTradeOrder.getTradeAmount()); outSplitRspInfos.setOutSubTradeNo(subTradeOrder.getOutTradeNo()); + outSplitRspInfos.setSubAttach(subTradeOrder.getAttach()); responseOutSplitRspInfos.add(outSplitRspInfos); } // 退款记录 List refundSplitInfoList = new ArrayList<>(); List refundList = tradeOrderRefundService.getListByMergeId(orderMerge.getId()) - .stream().filter(o->o.getStatus().equals(TradeOrderRefundStatusEnum.status2.getNumber())) + .stream().filter(o-> !o.getStatus().equals(TradeOrderRefundStatusEnum.status1.getNumber())) .collect(Collectors.toList()); for (BsTradeOrderRefund refund : refundList) { RefundSplitInfo refundSplitInfo = new RefundSplitInfo(); @@ -291,4 +292,6 @@ public class TradeMergeController { } } + + } diff --git a/schedule/src/main/resources/dev/application.yml b/schedule/src/main/resources/dev/application.yml index 44c32ef..56460f6 100644 --- a/schedule/src/main/resources/dev/application.yml +++ b/schedule/src/main/resources/dev/application.yml @@ -9,7 +9,7 @@ debug: false #datasource数据源设置 spring: datasource: - url: jdbc:mysql://139.9.154.68:3306/gratia_pay?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false + url: jdbc:mysql://139.9.154.68:3306/gratia_pay_prod?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false username: root password: HF123456. type: com.alibaba.druid.pool.DruidDataSource @@ -28,7 +28,7 @@ spring: poolPreparedStatements: true maxOpenPreparedStatements: 20 redis: - database: 6 + database: 7 host: 139.9.154.68 port: 36379 password: HF123456.Redis @@ -70,7 +70,7 @@ jetcache: host: 139.9.154.68 port: 36379 password: HF123456.Redis - database: 6 + database: 7 keyConvertor: fastjson broadcastChannel: projectA valueEncoder: java diff --git a/service/src/main/java/com/hfkj/channel/lakala/LaKaLaTradeMergeService.java b/service/src/main/java/com/hfkj/channel/lakala/LaKaLaTradeMergeService.java index 98aff3e..9ff500e 100644 --- a/service/src/main/java/com/hfkj/channel/lakala/LaKaLaTradeMergeService.java +++ b/service/src/main/java/com/hfkj/channel/lakala/LaKaLaTradeMergeService.java @@ -293,7 +293,15 @@ public class LaKaLaTradeMergeService { refund.setRefundAmount(outSplitRspInfos.getBigDecimal("refund_amount").divide(new BigDecimal("100"))); refund.setPayerAmount(outSplitRspInfos.getBigDecimal("refund_amount").divide(new BigDecimal("100"))); refund.setRefundTime(tradeOrderRefundMerge.getRefundTime()); - refund.setStatus(TradeOrderRefundStatusEnum.status2.getNumber()); + if (StringUtils.isBlank(outSplitRspInfos.getString("trade_state"))) { + refund.setStatus(TradeOrderRefundStatusEnum.status2.getNumber()); + refund.setRefundTime(tradeOrderRefundMerge.getRefundTime()); + } else if (outSplitRspInfos.getString("trade_state").equals("SUCCESS")) { + refund.setStatus(TradeOrderRefundStatusEnum.status2.getNumber()); + refund.setRefundTime(tradeOrderRefundMerge.getRefundTime()); + } else if (outSplitRspInfos.getString("trade_state").equals("FAIL")) { + refund.setStatus(TradeOrderRefundStatusEnum.status3.getNumber()); + } tradeOrderRefundService.editOrderRefund(refund); outSplitRspInfosList.add(refund); } diff --git a/service/src/main/java/com/hfkj/openapi/v1/model/request/RequestOutSplitInfoModel.java b/service/src/main/java/com/hfkj/openapi/v1/model/request/RequestOutSplitInfoModel.java index 303c2d0..121f962 100644 --- a/service/src/main/java/com/hfkj/openapi/v1/model/request/RequestOutSplitInfoModel.java +++ b/service/src/main/java/com/hfkj/openapi/v1/model/request/RequestOutSplitInfoModel.java @@ -36,4 +36,10 @@ public class RequestOutSplitInfoModel { @DecimalMin(value = "0.01", message = "交易最小金额0.01元") @NotBlank(message = "交易金额必填项") private String amount; + + /** + * 子附加域 + */ + @Length(max = 128, message = "子附加域限制在128位字符以内") + private String subAttach; } diff --git a/service/src/main/java/com/hfkj/openapi/v1/model/response/OutSplitRspInfos.java b/service/src/main/java/com/hfkj/openapi/v1/model/response/OutSplitRspInfos.java index 75f91d6..2cdd50d 100644 --- a/service/src/main/java/com/hfkj/openapi/v1/model/response/OutSplitRspInfos.java +++ b/service/src/main/java/com/hfkj/openapi/v1/model/response/OutSplitRspInfos.java @@ -27,4 +27,9 @@ public class OutSplitRspInfos { * 金额 */ private BigDecimal amount; + + /** + * 子附加域 + */ + private String subAttach; } diff --git a/service/src/main/java/com/hfkj/openapi/v1/service/impl/OpenApiTradeOrderServiceImpl.java b/service/src/main/java/com/hfkj/openapi/v1/service/impl/OpenApiTradeOrderServiceImpl.java index 178934e..ad0654d 100644 --- a/service/src/main/java/com/hfkj/openapi/v1/service/impl/OpenApiTradeOrderServiceImpl.java +++ b/service/src/main/java/com/hfkj/openapi/v1/service/impl/OpenApiTradeOrderServiceImpl.java @@ -159,7 +159,9 @@ public class OpenApiTradeOrderServiceImpl implements OpenApiTradeOrderService { // 查询子订单 List subList = bsTradeOrderService.getOrderByMergeTradeId(tradeOrder.getMergeId()); for (BsTradeOrder sub : subList) { - if (sub == null || !sub.getRefundType().equals(TradeOrderRefundTypeEnum.type1.getNumber())) { + if (sub.getRefundType() == null) { + allRefund = false; + } else if (sub.getRefundType().equals(TradeOrderRefundTypeEnum.type2.getNumber())) { allRefund = false; } } diff --git a/service/src/main/java/com/hfkj/service/impl/BsTradeOrderMergeServiceImpl.java b/service/src/main/java/com/hfkj/service/impl/BsTradeOrderMergeServiceImpl.java index 09231e5..958785d 100644 --- a/service/src/main/java/com/hfkj/service/impl/BsTradeOrderMergeServiceImpl.java +++ b/service/src/main/java/com/hfkj/service/impl/BsTradeOrderMergeServiceImpl.java @@ -104,6 +104,9 @@ public class BsTradeOrderMergeServiceImpl implements BsTradeOrderMergeService { tradeOrder.setStatus(TradeOrderStatusEnum.status3.getNumber()); tradeOrder.setPayTime(orderMerge.getPayTime()); tradeOrder.setAccTradeNo(orderMerge.getAccTradeNo()); + tradeOrder.setAccSettleAmount(tradeOrder.getTradeAmount()); + tradeOrder.setAccDiscountAmount(new BigDecimal("0")); + tradeOrder.setAccMdiscountAmount(new BigDecimal("0")); // 合单的支付流水号 if (StringUtils.isNotBlank(MapUtils.getString(other, "card_type"))) { tradeOrder.setCardType(MapUtils.getString(other, "card_type"));