瀏覽代碼

三方支付

qin 1 年之前
父節點
當前提交
36f07ecf0d

+ 23 - 26
src/main/java/com/poteviohealth/ym/ipos/controller/app/SettlementAppController.java

@@ -1,6 +1,5 @@
 package com.poteviohealth.ym.ipos.controller.app;
 
-import com.google.common.collect.Lists;
 import com.poteviohealth.cgp.common.controller.BaseWebController;
 import com.poteviohealth.cgp.common.facade.log.OperateType;
 import com.poteviohealth.cgp.common.facade.log.OperationLog;
@@ -11,12 +10,10 @@ import com.poteviohealth.cgp.common.integrated.customer.model.GroupLeaderDTO;
 import com.poteviohealth.cgp.common.integrated.customer.model.GroupLeaderParams;
 import com.poteviohealth.cgp.common.model.CommonPage;
 import com.poteviohealth.cgp.common.model.VaultsResponse;
-import com.poteviohealth.cgp.common.utils.CgpTool;
 import com.poteviohealth.ym.ipos.model.split.SplitWithdraw;
 import com.poteviohealth.ym.ipos.model.split.back.AccountBalanceBack;
 import com.poteviohealth.ym.ipos.model.split.back.SettlementQueryBack;
 import com.poteviohealth.ym.ipos.model.split.back.WithdrawBack;
-import com.poteviohealth.ym.ipos.model.split.detail.AccountBalanceList;
 import com.poteviohealth.ym.ipos.model.split.detail.SettlementQueryDetail;
 import com.poteviohealth.ym.ipos.model.split.dto.SplitWithdrawDto;
 import com.poteviohealth.ym.ipos.model.split.dto.WithdrawDto;
@@ -31,8 +28,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
-import java.util.Date;
-import java.util.List;
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
 
 /**
  * 结算管理app
@@ -66,8 +63,8 @@ public class SettlementAppController extends BaseWebController {
     @OperationLog(type = OperateType.SELECT, description ="单账户查询")
     public VaultsResponse<AccountBalanceBack> accountBalanceQuery(@RequestBody StringParams params) {
 
-        //TODO 暂时去掉三方支付
-      /*  if(StringUtils.isEmpty(params.getId())){
+        //TODO 三方支付相关
+        if(StringUtils.isEmpty(params.getId())){
             String ipos = TokenContext.cureMiniUser().getIposMerchantId();
             if(StringUtils.isEmpty(ipos)){
                 return VaultsResponse.failed("账户未激活,请联系管理员");
@@ -75,16 +72,16 @@ public class SettlementAppController extends BaseWebController {
             params.setId(TokenContext.cureMiniUser().getIposMerchantId());
         }
 
-        return splitService.accountBalanceQuery(params.getId());*/
+        return splitService.accountBalanceQuery(params.getId());
 
-        Integer money = splitWithdrawService.getGroupLeaderWithdrawSumPrice(TokenContext.cureOperatorId(), TokenContext.cureMiniUser().getGroupLeaderId());
+       /* Integer money = splitWithdrawService.getGroupLeaderWithdrawSumPrice(TokenContext.cureOperatorId(), TokenContext.cureMiniUser().getGroupLeaderId());
         AccountBalanceBack balanceBack = new AccountBalanceBack();
         List<AccountBalanceList> list = Lists.newArrayList();
         AccountBalanceList abList = new AccountBalanceList();
         abList.setAvl_amt(money);
         list.add(abList);
         balanceBack.setList(list);
-        return VaultsResponse.success(balanceBack);
+        return VaultsResponse.success(balanceBack);*/
     }
 
 
@@ -93,10 +90,10 @@ public class SettlementAppController extends BaseWebController {
     @OperationLog(type = OperateType.SELECT, description ="可提现金额查询")
     public VaultsResponse<Long> accountBalanceUse() {
 
-        //TODO 暂时去掉三方支付
-        Long money = splitWithdrawService.getGroupLeaderWithdrawPrice(TokenContext.cureOperatorId(), TokenContext.cureMiniUser().getGroupLeaderId());
-        return VaultsResponse.success(money<0L?0L:money);
-        /*if(StringUtils.isEmpty(TokenContext.cureMiniUser().getIposMerchantId())){
+        //TODO 三方支付相关
+        /*Long money = splitWithdrawService.getGroupLeaderWithdrawPrice(TokenContext.cureOperatorId(), TokenContext.cureMiniUser().getGroupLeaderId());
+        return VaultsResponse.success(money<0L?0L:money);*/
+        if(StringUtils.isEmpty(TokenContext.cureMiniUser().getIposMerchantId())){
             return VaultsResponse.success(0L);
         }
         GroupLeaderParams groupLeaderParams = new GroupLeaderParams();
@@ -115,15 +112,15 @@ public class SettlementAppController extends BaseWebController {
            }catch (Exception e){
                e.printStackTrace();
                return VaultsResponse.success(0L);
-           }*/
+           }
     }
 
     @PostMapping("/withdraw")
     @ApiOperation(value = "取现")
     @OperationLog(type = OperateType.SELECT, description ="取现")
     public VaultsResponse<WithdrawBack> withdraw(@RequestBody WithdrawDto dto) {
-        //TODO 暂时去掉三方支付
-       /* if(StringUtils.isEmpty(dto.getMerchantId())){
+        //TODO 三方支付相关
+        if(StringUtils.isEmpty(dto.getMerchantId())){
             String ipos = TokenContext.cureMiniUser().getIposMerchantId();
             if(StringUtils.isEmpty(ipos)){
                 return VaultsResponse.failed("账户未激活,请联系管理员");
@@ -136,13 +133,13 @@ public class SettlementAppController extends BaseWebController {
         VaultsResponse<GroupLeaderDTO>  vaultsResponse = customerFeignClient.getGroupLeaderById(groupLeaderParams);
         GroupLeaderDTO groupLeaderDTO = vaultsResponse.getData();
 
-       *//* if(groupLeaderDTO.getRemainedAmt()>=dto.getAmount()){
+        if(groupLeaderDTO.getRemainedAmt()>=dto.getAmount()){
             DecimalFormat df = new DecimalFormat("#0.00");
             return VaultsResponse.failed("留存保证金为:"+new BigDecimal(df.format(groupLeaderDTO.getRemainedAmt() / 100.0))+"元,可提现金额不足");
-        }*//*
+        }
         dto.setAmount(dto.getAmount());
-        return splitService.withdraw(dto);*/
-        Long money = splitWithdrawService.getGroupLeaderWithdrawPrice(TokenContext.cureOperatorId(), TokenContext.cureMiniUser().getGroupLeaderId());
+        return splitService.withdraw(dto);
+        /*Long money = splitWithdrawService.getGroupLeaderWithdrawPrice(TokenContext.cureOperatorId(), TokenContext.cureMiniUser().getGroupLeaderId());
         money = money<0L?0L:money;
         if(!dto.getAmount().equals(money)){
             return VaultsResponse.failed("可提现金额变动,请刷新");
@@ -166,7 +163,7 @@ public class SettlementAppController extends BaseWebController {
         splitWithdraw.setOpenid(TokenContext.cureMiniUser().getOpenId());
         splitWithdrawService.save(splitWithdraw);
         splitWithdrawService.updateOrderGroupLeaderWithdraw(TokenContext.cureOperatorId(), TokenContext.cureMiniUser().getGroupLeaderId(),splitWithdraw.getId());
-        return VaultsResponse.success();
+        return VaultsResponse.success();*/
     }
 
 
@@ -184,16 +181,16 @@ public class SettlementAppController extends BaseWebController {
     @PostMapping("/list")
     @ApiOperation(value = "取现记录",notes = "list")
     public VaultsResponse<CommonPage<SplitWithdraw>> list(@RequestBody SplitWithdrawDto dto){
-        //TODO 暂时去掉三方支付
-        /*if(StringUtils.isEmpty(dto.getIposMerchantId())){
+        //TODO 三方支付相关
+        if(StringUtils.isEmpty(dto.getIposMerchantId())){
             String ipos = TokenContext.cureMiniUser().getIposMerchantId();
             if(StringUtils.isEmpty(ipos)){
                 return VaultsResponse.failed("账户未激活,请联系管理员");
             }
             dto.setIposMerchantId(TokenContext.cureMiniUser().getIposMerchantId());
-        }*/
+        }
 
-        dto.setIposMerchantId("TZ"+TokenContext.cureMiniUser().getGroupLeaderId());
+        //dto.setIposMerchantId("TZ"+TokenContext.cureMiniUser().getGroupLeaderId());
         return VaultsResponse.success(splitWithdrawService.pageList(dto));
     }
 }

+ 51 - 52
src/main/java/com/poteviohealth/ym/ipos/controller/feign/IposFeignController.java

@@ -11,7 +11,6 @@ import com.poteviohealth.cgp.common.integrated.order.model.PayInfoAppOutDTO;
 import com.poteviohealth.cgp.common.integrated.order.model.RefundReceive;
 import com.poteviohealth.cgp.common.model.VaultsResponse;
 import com.poteviohealth.cgp.common.utils.CgpTool;
-import com.poteviohealth.cgp.common.utils.DateUtils;
 import com.poteviohealth.ym.ipos.model.payment.PaymentRecords;
 import com.poteviohealth.ym.ipos.model.split.SplitRecords;
 import com.poteviohealth.ym.ipos.model.split.SplitRecordsDetail;
@@ -20,7 +19,7 @@ import com.poteviohealth.ym.ipos.utils.YmUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.log4j.Log4j2;
-import org.apache.commons.lang3.time.DateFormatUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -30,7 +29,6 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.Date;
 import java.util.List;
 
 /**
@@ -65,7 +63,7 @@ public class IposFeignController extends BaseFeignController {
         pr.setOpenid(payBefor.getOpenid());
         pr.setAppId(payBefor.getAppId());
         pr.setOperatorId(payBefor.getOperatorId());
-        pr.setPlanSplitDate(DateFormatUtils.format(DateUtils.caculDays(new Date(),17),"yyyyMMdd"));
+        //pr.setPlanSplitDate(DateFormatUtils.format(DateUtils.caculDays(new Date(),17),"yyyyMMdd"));
         paymentRecordsService.save(pr);
 
         return paymentService.unifiedOrder(pr);
@@ -116,13 +114,13 @@ public class IposFeignController extends BaseFeignController {
         List<SplitPay> returnList = Lists.newArrayList();
         for (SplitInfo splitInfo : list) {
             BigDecimal proportion = BigDecimal.ONE.subtract(splitInfo.getOperatorSplitProportion());
-            //List<SplitRecords> splitRecordsList = Lists.newArrayList();
-            //TODO 暂时去掉三方支付
+            List<SplitRecords> splitRecordsList = Lists.newArrayList();
+            //TODO 三方支付相关
             //YJ:一级供应商;FS:二级供应商,服务商;QY:供应商,区域运营商;TZ:团长;ZZ:站长;PT:平台
-          /* PaymentRecords pr = paymentRecordsService.getPaymentRecords(splitInfo.getPayId());
+           PaymentRecords pr = paymentRecordsService.getPaymentRecords(splitInfo.getPayId());
            if(pr == null){
                continue;
-           }*/
+           }
             List<SplitRecordsDetail> details = Lists.newArrayList();
             SplitRecords records = new SplitRecords();
             records.setOperatorId(splitInfo.getOperatorId());
@@ -164,15 +162,15 @@ public class IposFeignController extends BaseFeignController {
                  * 2.供应价/结算价 的分账(包含区域运营商/一级供应商/二级供应商/服务站)
                  */
                 //一级供应商
-                //TODO 暂时去掉三方支付
-                if(detail.getBelong().equals(1)){
-                //if(StringUtils.isNotEmpty(detail.getSupplierOneMerchantId()) && detail.getBelong().equals(1)){
+                //TODO 三方支付相关
+                //if(detail.getBelong().equals(1)){
+                if(StringUtils.isNotEmpty(detail.getSupplierOneMerchantId()) && detail.getBelong().equals(1)){
                     SplitRecordsDetail supplierOne = new SplitRecordsDetail();
                     supplierOne.setSplitId(records.getSplitId());
                     supplierOne.setSourceId(3);
-                    //TODO 暂时去掉三方支付
-                    //supplierOne.setMerchantId(detail.getSupplierOneMerchantId());
-                    supplierOne.setMerchantId("YJ"+detail.getSupplierOneId().toString());
+                    //TODO 三方支付相关
+                    supplierOne.setMerchantId(detail.getSupplierOneMerchantId());
+                    //supplierOne.setMerchantId("YJ"+detail.getSupplierOneId().toString());
                     for (SplitRecordsDetail splitRecordsDetail : details) {
                         if(splitRecordsDetail.getMerchantId().equals(supplierOne.getMerchantId())){
                             supplierOne = splitRecordsDetail;
@@ -185,16 +183,16 @@ public class IposFeignController extends BaseFeignController {
                         supplierOne.setDivAmt(supplierOneAmount.toString());
                         details.add(supplierOne);
                     }
-                    //TODO 暂时去掉三方支付
-                }else if(detail.getBelong().equals(2)){
-               // }else if(StringUtils.isNotEmpty(detail.getServiceStationMerchantId()) && detail.getBelong().equals(2)){
+                    //TODO 三方支付相关
+                //}else if(detail.getBelong().equals(2)){
+                }else if(StringUtils.isNotEmpty(detail.getServiceStationMerchantId()) && detail.getBelong().equals(2)){
                     //二级供应商
                     SplitRecordsDetail supplierTwo = new SplitRecordsDetail();
                     supplierTwo.setSplitId(records.getSplitId());
                     supplierTwo.setSourceId(4);
-                    //TODO 暂时去掉三方支付
-                    supplierTwo.setMerchantId("FS"+detail.getServiceStationId().toString());
-                   // supplierTwo.setMerchantId(detail.getServiceStationMerchantId());
+                    //TODO 三方支付相关
+                    //supplierTwo.setMerchantId("FS"+detail.getServiceStationId().toString());
+                    supplierTwo.setMerchantId(detail.getServiceStationMerchantId());
                     boolean is_have = false;
                     for (SplitRecordsDetail splitRecordsDetail : details) {
 
@@ -216,15 +214,15 @@ public class IposFeignController extends BaseFeignController {
                     }
                 }else if(detail.getBelong().equals(0)){
                     //服务商
-                    //TODO 暂时去掉三方支付
-                    if(detail.getOrderType().equals(2) && !detail.getServiceStationId().equals(detail.getStationId())){
-                   // if(StringUtils.isNotEmpty(detail.getServiceStationMerchantId()) && detail.getOrderType().equals(2) && !detail.getServiceStationId().equals(detail.getStationId())){
+                    //TODO 三方支付相关
+                    //if(detail.getOrderType().equals(2) && !detail.getServiceStationId().equals(detail.getStationId())){
+                    if(StringUtils.isNotEmpty(detail.getServiceStationMerchantId()) && detail.getOrderType().equals(2) && !detail.getServiceStationId().equals(detail.getStationId())){
                         SplitRecordsDetail serviceStation = new SplitRecordsDetail();
                         serviceStation.setSplitId(records.getSplitId());
                         serviceStation.setSourceId(5);
-                        //TODO 暂时去掉三方支付
-                        serviceStation.setMerchantId("FS"+detail.getServiceStationId().toString());
-                        //serviceStation.setMerchantId(detail.getServiceStationMerchantId());
+                        //TODO 三方支付相关
+                        //serviceStation.setMerchantId("FS"+detail.getServiceStationId().toString());
+                        serviceStation.setMerchantId(detail.getServiceStationMerchantId());
                         boolean is_have = false;
                         for (SplitRecordsDetail splitRecordsDetail : details) {
                             if(splitRecordsDetail.getMerchantId().equals(serviceStation.getMerchantId())){
@@ -242,18 +240,18 @@ public class IposFeignController extends BaseFeignController {
                             }
 
                         }
-                        //TODO 暂时去掉三方支付
-                    }else{
-                   // }else if(StringUtils.isNotEmpty(detail.getSupplierMerchantId())){
+                        //TODO 三方支付相关
+                    //}else{
+                    }else if(StringUtils.isNotEmpty(detail.getSupplierMerchantId())){
                         //供应商
                         if(detail.getOrderType().equals(1) ||(detail.getOrderType().equals(2)&&detail.getStationId().equals(detail.getServiceStationId()))){
                             boolean is_have = false;
                             SplitRecordsDetail supplier = new SplitRecordsDetail();
                             supplier.setSplitId(records.getSplitId());
                             supplier.setSourceId(2);
-                            //TODO 暂时去掉三方支付
-                            supplier.setMerchantId("QY"+detail.getSupplierId().toString());
-                            //supplier.setMerchantId(detail.getSupplierMerchantId());
+                            //TODO 三方支付相关
+                            //supplier.setMerchantId("QY"+detail.getSupplierId().toString());
+                            supplier.setMerchantId(detail.getSupplierMerchantId());
                             for (SplitRecordsDetail splitRecordsDetail : details) {
                                 if(splitRecordsDetail.getMerchantId().equals(supplier.getMerchantId())){
                                     supplier = splitRecordsDetail;
@@ -281,9 +279,9 @@ public class IposFeignController extends BaseFeignController {
                         SplitRecordsDetail supplier = new SplitRecordsDetail();
                         supplier.setSplitId(records.getSplitId());
                         supplier.setSourceId(2);
-                        //TODO 暂时去掉三方支付
-                        supplier.setMerchantId("QY"+detail.getSupplierId().toString());
-                        //supplier.setMerchantId(detail.getSupplierMerchantId());
+                        //TODO 三方支付相关
+                        //supplier.setMerchantId("QY"+detail.getSupplierId().toString());
+                        supplier.setMerchantId(detail.getSupplierMerchantId());
                         boolean is_have = false;
                         for (SplitRecordsDetail splitRecordsDetail : details) {
                             if(splitRecordsDetail.getMerchantId().equals(supplier.getMerchantId())){
@@ -303,15 +301,15 @@ public class IposFeignController extends BaseFeignController {
                     }
 
                     //团长
-                //TODO 暂时去掉三方支付
-                if(detail.getGroupCommissionMoney() != null && detail.getGroupCommissionMoney()>0L){
-                   // if(detail.getGroupCommissionMoney() != null && detail.getGroupCommissionMoney()>0L &&StringUtils.isNotBlank(detail.getGroupLeaderMerchantId())){
+                //TODO 三方支付相关
+                //if(detail.getGroupCommissionMoney() != null && detail.getGroupCommissionMoney()>0L){
+                    if(detail.getGroupCommissionMoney() != null && detail.getGroupCommissionMoney()>0L &&StringUtils.isNotBlank(detail.getGroupLeaderMerchantId())){
                         SplitRecordsDetail tz = new SplitRecordsDetail();
                         tz.setSplitId(records.getSplitId());
                         tz.setSourceId(6);
-                        //TODO 暂时去掉三方支付
-                        tz.setMerchantId("TZ"+detail.getGroupLeaderId().toString());
-                       // tz.setMerchantId(detail.getGroupLeaderMerchantId());
+                        //TODO 三方支付相关
+                        //tz.setMerchantId("TZ"+detail.getGroupLeaderId().toString());
+                        tz.setMerchantId(detail.getGroupLeaderMerchantId());
                         boolean is_have = false;
                         for (SplitRecordsDetail splitRecordsDetail : details) {
                             if(splitRecordsDetail.getMerchantId().equals(tz.getMerchantId())){
@@ -330,15 +328,15 @@ public class IposFeignController extends BaseFeignController {
                         }
                     }
                     //站长
-                //TODO 暂时去掉三方支付
-                if(detail.getStationmasterCommissionMoney() != null && detail.getStationmasterCommissionMoney()>0L){
-                   // if(detail.getStationmasterCommissionMoney() != null && detail.getStationmasterCommissionMoney()>0L&&StringUtils.isNotBlank(detail.getStationmasterMerchantId())){
+                //TODO 三方支付相关
+                //if(detail.getStationmasterCommissionMoney() != null && detail.getStationmasterCommissionMoney()>0L){
+                    if(detail.getStationmasterCommissionMoney() != null && detail.getStationmasterCommissionMoney()>0L&&StringUtils.isNotBlank(detail.getStationmasterMerchantId())){
                         SplitRecordsDetail station = new SplitRecordsDetail();
                         station.setSplitId(records.getSplitId());
                         station.setSourceId(5);
-                        //TODO 暂时去掉三方支付
-                        station.setMerchantId("ZZ"+detail.getStationId().toString());
-                        //station.setMerchantId(detail.getStationmasterMerchantId());
+                        //TODO 三方支付相关
+                        //station.setMerchantId("ZZ"+detail.getStationId().toString());
+                        station.setMerchantId(detail.getStationmasterMerchantId());
                         Boolean is_have = false;
                         for (SplitRecordsDetail splitRecordsDetail : details) {
                             if(splitRecordsDetail.getMerchantId().equals(station.getMerchantId())){
@@ -368,15 +366,16 @@ public class IposFeignController extends BaseFeignController {
             SplitRecordsDetail ptyys = new SplitRecordsDetail();
             ptyys.setSplitId(records.getSplitId());
             ptyys.setSourceId(1);
-            //TODO 暂时去掉三方支付
-            ptyys.setMerchantId("PT"+splitInfo.getOperatorId().toString());
+            //TODO 三方支付相关
+            //ptyys.setMerchantId("PT"+splitInfo.getOperatorId().toString());
+            ptyys.setMerchantId(splitInfo.getOperatorMerchantId());
             ptyys.setDivAmt(ptyysAmount.toString());
             details.add(ptyys);
-            //TODO 暂时去掉三方支付
-           /* VaultsResponse vaultsResponse = splitService.delayConfirm(records,details);
+            //TODO 三方支付相关
+            VaultsResponse vaultsResponse = splitService.delayConfirm(records,details);
             if(!vaultsResponse.validate()){
                 records.setComment(vaultsResponse.getMessage());
-            }*/
+            }
             records.setStatus(2);
             splitRecordsService.save(records);
             splitRecordsDetailService.saveBatch(details);

+ 19 - 1
src/main/java/com/poteviohealth/ym/ipos/model/detail/SplitInfo.java

@@ -12,9 +12,27 @@ import java.util.List;
 @Data
 public class SplitInfo {
 
-    @ApiModelProperty(value = "分账方自留金额,单位为分,可传0表示不自留\t",required = true)
+    /**
+     * N:不使用净值分账
+     * Y:使用净值分账
+     * 不传默认为N,即不使用净值分账
+     * 净值分账目前仅对部分通道开放,使用此能力前请先与技术支持确认
+     * 净值分账仅在交易手续费内扣时才起作用
+     * 当使用净值分账时,分账信息和分账明细必须要传分账比例,且分账方自留比例(keep_percentage)与所有分账比例(div_percentage)之和必须要为100%
+     */
+    @ApiModelProperty(value = "N:不使用净值分账 Y:使用净值分账")
+    private String is_clean_split;
+
+    @ApiModelProperty(value = "分账方自留金额,单位为分,可传0表示不自留")
     private String keep_amt;
 
+    /**
+     * 分账方自留比例,单位为%,最多支持小数点后两位,可传0表示不自留
+     * 使用净值分账(is_clean_split=Y)时,该节点必填,分账方自留金额(keep_amt)节点无效
+     */
+    @ApiModelProperty(value = "分账方自留比例")
+    private String keep_percentage;
+
     @ApiModelProperty(value = "分账明细",required = true)
     private List<SplitList> split_list;
 }

+ 8 - 1
src/main/java/com/poteviohealth/ym/ipos/model/detail/SplitList.java

@@ -13,6 +13,13 @@ public class SplitList {
     @ApiModelProperty(value = "分账接收方的分账商户号",required = true)
     private String merchant_id;
 
-    @ApiModelProperty(value = "分账金额,单位为分,必须大于0",required = true)
+    @ApiModelProperty(value = "分账金额,单位为分,必须大于0")
     private String div_amt;
+
+    /**
+     * 分账比例,单位为%,最多支持小数点后两位,必须大于0
+     * 使用净值分账(is_clean_split=Y)时,该节点必填,分账金额(div_amt)节点无效
+     */
+    @ApiModelProperty(value = "分账比例")
+    private String div_percentage;
 }

+ 31 - 0
src/main/java/com/poteviohealth/ym/ipos/model/payment/PayNotification.java

@@ -13,6 +13,9 @@ public class PayNotification{
     @ApiModelProperty(value = "签名",required = true)
     private String sign;
 
+    @ApiModelProperty(value = "1:交易结果通知;3:资金解冻通知")
+    private String notify_type;
+
     @ApiModelProperty(value = "商户号,交易的翼码商户号",required = true)
     private String isspid;
 
@@ -59,6 +62,9 @@ public class PayNotification{
     @ApiModelProperty(value = "交易完成时间,格式:YYYYMMDDHH24MISS")
     private String end_time;
 
+    @ApiModelProperty(value = "子商户应用ID,微信的APPID")
+    private String sub_appid;
+
     /**
      * 支付宝:用户登录帐号(带星号脱敏)
      * 微信/微信小程序:用户open_id
@@ -89,6 +95,9 @@ public class PayNotification{
     @ApiModelProperty(value = "支付平台订单号,支付平台的订单号,仅成功时有值")
     private String trade_no;
 
+    @ApiModelProperty(value = "外卡标识 0:不是外卡 1:是外卡")
+    private String is_foreign_card;
+
     @ApiModelProperty(value = "商家优惠金额,单位为分,仅成功时有值")
     private Integer buss_discount_amt;
 
@@ -100,4 +109,26 @@ public class PayNotification{
 
     @ApiModelProperty(value = "用户号,仅快捷支付(pay_type=518),成功时有值")
     private String user_yima_id;
+
+    @ApiModelProperty(value = "ATU订单号 支付宝/微信/银联订单号 客户手机支付凭证上的订单号")
+    private String atu_trade_no;
+
+    @ApiModelProperty(value = "ATU商户订单号 支付宝/微信/银联商户订单号 客户手机支付凭证上的商户订单号")
+    private String atu_out_trade_no;
+
+    @ApiModelProperty(value = "发卡行编码 该字段是否有值取决于支付通道是否返回")
+    private String bank_code;
+
+    @ApiModelProperty(value = "资金冻结状态 01:冻结 02:解冻")
+    private String fund_freeze_stat;
+
+    @ApiModelProperty(value = "冻结时间 格式:yyyyMMddHHmmss")
+    private String freeze_time;
+
+    @ApiModelProperty(value = "解冻金额 单位:分")
+    private String unfreeze_amt;
+
+    @ApiModelProperty(value = "解冻时间 格式:yyyyMMddHHmmss")
+    private String unfreeze_time;
+
 }

+ 15 - 0
src/main/java/com/poteviohealth/ym/ipos/model/payment/PaymentRecords.java

@@ -74,4 +74,19 @@ public class PaymentRecords extends BaseEntity {
 
     @ApiModelProperty(value = "手续费,单位为分,仅成功时有值")
     private Integer chargeAmount;
+
+    @ApiModelProperty(value = "1:交易结果通知;3:资金解冻通知")
+    private String notify_type;
+
+    @ApiModelProperty(value = "资金冻结状态 01:冻结 02:解冻")
+    private String fund_freeze_stat;
+
+    @ApiModelProperty(value = "冻结时间 格式:yyyyMMddHHmmss")
+    private String freeze_time;
+
+    @ApiModelProperty(value = "解冻金额 单位:分")
+    private String unfreeze_amt;
+
+    @ApiModelProperty(value = "解冻时间 格式:yyyyMMddHHmmss")
+    private String unfreeze_time;
 }

+ 17 - 0
src/main/java/com/poteviohealth/ym/ipos/model/payment/back/PayQueryBack.java

@@ -60,6 +60,23 @@ public class PayQueryBack extends BaseBack {
     @ApiModelProperty(value = "订单备注,返回支付请求时内容")
     private String memo;
 
+    /**
+     * 01:冻结
+     * 02:解冻
+     * 空表示无此类业务
+     */
+    @ApiModelProperty(value = "资金冻结状态")
+    private String fund_freeze_stat;
+
+    @ApiModelProperty(value = "冻结时间,格式:yyyyMMddHHmmss")
+    private String freeze_time;
+
+    @ApiModelProperty(value = "解冻金额,单位:分")
+    private String unfreeze_amt;
+
+    @ApiModelProperty(value = "解冻时间,格式:yyyyMMddHHmmss")
+    private String unfreeze_time;
+
     @ApiModelProperty(value = "支付宝支付的时候")
     private AlipayResInfo alipay_res_info;
 

+ 8 - 0
src/main/java/com/poteviohealth/ym/ipos/model/payment/back/PayReverseBack.java

@@ -39,6 +39,14 @@ public class PayReverseBack extends BaseBack {
     @ApiModelProperty(value = "平台优惠金额,单位为分")
     private String platform_discount_amt;
 
+    /**
+     * 退款发生时,对应原支付交易的资金冻结状态
+     * 01:冻结
+     * 02:解冻
+     */
+    @ApiModelProperty(value = "资金冻结状态")
+    private String fund_freeze_stat;
+
     @ApiModelProperty(value = "支付宝退款的时候")
     private AlipayReverseInfo alipay_res_info;
 

+ 9 - 0
src/main/java/com/poteviohealth/ym/ipos/model/payment/detail/PayDetail.java

@@ -12,12 +12,21 @@ import java.util.List;
 @Data
 public class PayDetail {
 
+    /**
+     * 502:支付宝
+     * 503:微信支付
+     * 512:银联二维码
+     * 521:聚分期
+     */
     @ApiModelProperty(value = "515:微信小程序",required = true)
     private String pay_type="515";
 
     @ApiModelProperty(value = "交易类型,微信小程序取值如下:JSAPI",required = true)
     private String trade_type="JSAPI";
 
+    @ApiModelProperty(value = "子商户应用ID:发起交易商户号所绑定的小程序appid 如果有传appid就使用传的appid进行交易 如果没传就使用系统中配置的appid进行交易")
+    private String sub_appid;
+
     @ApiModelProperty(value = "用户标识:微信小程序:用户在商户appid下的唯一标识(openid)")
     private String buyer_id;
 

+ 1 - 0
src/main/java/com/poteviohealth/ym/ipos/model/payment/detail/PayQueryDetail.java

@@ -17,6 +17,7 @@ public class PayQueryDetail {
      * 515:小程序支付
      * 516:数字人民币
      * 519:会员余额支付
+     * 521:聚分期
      */
     @ApiModelProperty(value = "支付类型")
     private String pay_type="515";

+ 4 - 0
src/main/java/com/poteviohealth/ym/ipos/model/payment/detail/PayReverseDetail.java

@@ -19,6 +19,7 @@ public class PayReverseDetail {
      * 515:小程序支付
      * 516:数字人民币
      * 519:会员余额支付
+     * 521:聚分期
      */
     @ApiModelProperty(value = "支付类型")
     private String pay_type ="515";
@@ -34,4 +35,7 @@ public class PayReverseDetail {
 
     @ApiModelProperty(value = "扩展参数")
     private ExtendParamsReverse extend_params;
+
+    @ApiModelProperty(value = "异步通知地址")
+    private String notify_url;
 }

+ 19 - 0
src/main/java/com/poteviohealth/ym/ipos/model/split/back/PayConfirmQueryBack.java

@@ -1,9 +1,12 @@
 package com.poteviohealth.ym.ipos.model.split.back;
 
 import com.poteviohealth.ym.ipos.model.back.BaseBack;
+import com.poteviohealth.ym.ipos.model.split.detail.SplitListConfirm;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * 延时交易确认查询返回值
  * @author Qin
@@ -26,4 +29,20 @@ public class PayConfirmQueryBack extends BaseBack {
     @ApiModelProperty(value = "退回状态")
     private String refund_status;
 
+    /**
+     * s:成功
+     * c:待确认
+     * p:处理中
+     * f:失败
+     * p:申请成功
+     * r:已全额退回
+     * b:部分退回
+     * z:部分成功
+     * 交易成功时必填
+     */
+    @ApiModelProperty(value = "交易状态")
+    private String trade_status;
+
+    private List<SplitListConfirm> split_detail_list;
+
 }

+ 3 - 0
src/main/java/com/poteviohealth/ym/ipos/model/split/detail/AccountBalanceList.java

@@ -22,6 +22,9 @@ public class AccountBalanceList {
     @ApiModelProperty(value = "冻结余额(分)")
     private Integer frz_amt;
 
+    @ApiModelProperty(value = "管控金额(分),该金额包含在冻结金额中")
+    private Integer control_amt;
+
     @ApiModelProperty(value = "昨日日终余额(分)")
     private Integer last_avl_amt;
 

+ 20 - 0
src/main/java/com/poteviohealth/ym/ipos/model/split/detail/SplitListConfirm.java

@@ -13,6 +13,26 @@ public class SplitListConfirm {
     @ApiModelProperty(value = "分账接收方的分账商户号,当支付单类型不是账户支付时必填")
     private String merchant_id;
 
+    @ApiModelProperty(value = "商户类型,a:商户 b:收款账户")
+    private String mch_type;
+
+    @ApiModelProperty(value = "类型,a:参与分账 b:收款账户自留")
+    private String type;
+
+    /**
+     * s:成功
+     * c:待确认
+     * p:处理中
+     * f:失败
+     * p:申请成功
+     * r:已全额退回
+     * b:部分退回
+     * z:部分成功
+     * 交易成功时必填
+     */
+    @ApiModelProperty(value = "交易状态")
+    private String trade_state;
+
     @ApiModelProperty(value = "分账接收方的收款账户编号,当支付单类型是账户支付时可选,分账商户号与收款账户编号二选一必填")
     private String seller_account;
 

+ 39 - 22
src/main/java/com/poteviohealth/ym/ipos/service/impl/PaymentServiceImpl.java

@@ -230,32 +230,49 @@ public class PaymentServiceImpl implements IPaymentService {
         queryMapper.eq("pay_id",payNotification.getPos_seq());
         try {
             PaymentRecords pr = paymentRecordsService.getOne(queryMapper);
-            if(pr.getStatus() == -1){
-                pr.setStatus(Integer.parseInt(payNotification.getStatus()));
-                pr.setEndTime(payNotification.getEnd_time());
-                pr.setSource(payNotification.getSource());
-                pr.setPosId(payNotification.getPos_id());
-                pr.setStoreId(payNotification.getStore_id());
-                pr.setPayType(payNotification.getPay_type());
-                pr.setTransType(payNotification.getTrans_type());
-                pr.setTradeNo(payNotification.getTrade_no());
-                pr.setChargeAmount(payNotification.getCharge_amount());
-                PayReceive payReceive = new PayReceive();
-                payReceive.setPayId(pr.getPayId());
-                payReceive.setPaySn(pr.getPaySn());
-                payReceive.setOperatorId(pr.getOperatorId());
-                payReceive.setTradeNo(payNotification.getPos_seq());
-                VaultsResponse vaultsResponse = orderFeignClient.changeOrderPay(payReceive);
-                if(vaultsResponse.validate()){
-                    paymentRecordsService.updateById(pr);
-                }else {
-                    return "fail";
+            if(payNotification.getNotify_type().equals("1")){
+                //支付通知
+                if(pr.getStatus() == -1){
+                    pr.setStatus(Integer.parseInt(payNotification.getStatus()));
+                    pr.setEndTime(payNotification.getEnd_time());
+                    pr.setSource(payNotification.getSource());
+                    pr.setPosId(payNotification.getPos_id());
+                    pr.setStoreId(payNotification.getStore_id());
+                    pr.setPayType(payNotification.getPay_type());
+                    pr.setTransType(payNotification.getTrans_type());
+                    pr.setTradeNo(payNotification.getTrade_no());
+                    pr.setChargeAmount(payNotification.getCharge_amount());
+                    pr.setFund_freeze_stat(payNotification.getFund_freeze_stat());
+                    PayReceive payReceive = new PayReceive();
+                    payReceive.setPayId(pr.getPayId());
+                    payReceive.setPaySn(pr.getPaySn());
+                    payReceive.setOperatorId(pr.getOperatorId());
+                    payReceive.setTradeNo(payNotification.getPos_seq());
+                    VaultsResponse vaultsResponse = orderFeignClient.changeOrderPay(payReceive);
+                    if(vaultsResponse.validate()){
+                        paymentRecordsService.updateById(pr);
+                    }else {
+                        return "fail";
+                    }
+
+                }else{
+                    log.info("重复推送支付成功消息---"+pr.getPaySn());
                 }
-
             }else{
-                log.info("重复推送支付成功消息---"+pr.getPaySn());
+                //解冻通知
+                if(pr.getFund_freeze_stat().equals("01")){
+                    pr.setFund_freeze_stat(payNotification.getFund_freeze_stat());
+                    pr.setFreeze_time(payNotification.getFreeze_time());
+                    pr.setUnfreeze_amt(payNotification.getUnfreeze_amt());
+                    pr.setUnfreeze_time(payNotification.getUnfreeze_time());
+                    //调用分账通知
+                    paymentRecordsService.updateById(pr);
+                }else{
+                    log.info("重复推送解冻消息---"+pr.getPaySn());
+                }
             }
 
+
         }catch (Exception e){
             e.printStackTrace();
             return "fail";