liujc 1 anno fa
parent
commit
a5fd82d1e8

+ 58 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantMemberController.java

@@ -4,11 +4,16 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.microsvc.toolkit.common.response.paging.PageInfo;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import com.microsvc.toolkit.common.response.template.R;
+import com.microsvc.toolkit.middleware.payment.common.api.BasePaymentService;
+import com.microsvc.toolkit.middleware.payment.common.api.PaymentServiceContext;
+import com.microsvc.toolkit.middleware.payment.common.api.entity.PaymentMerchant;
 import com.yonge.cooleshow.biz.dal.entity.TenantMember;
 import com.yonge.cooleshow.biz.dal.service.TenantMemberService;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantMemberWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.EPayerType;
+import com.yonge.toolset.base.exception.BizException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -23,6 +28,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;
 import java.io.File;
@@ -46,6 +52,8 @@ public class TenantMemberController extends BaseController {
     @Autowired
     private TenantMemberService tenantMemberService;
 
+    @Autowired
+    private PaymentServiceContext paymentServiceContext;
     @ApiOperation(value = "详情", notes = "机构子账户表-根据详情ID查询单条, 传入id")
     @PreAuthorize("@pcs.hasPermissions('tenantMember/detail', {'BACKEND'})")
     @PostMapping("/detail/{id}")
@@ -143,4 +151,54 @@ public class TenantMemberController extends BaseController {
 
         return R.from(tenantMemberService.removeById(id));
     }
+
+
+    @ApiOperation(value = "查询三方企业账户", notes = "机构子账户表-根据详情ID查询单条, 传入id")
+    @PreAuthorize("@pcs.hasPermissions('tenantMember/detail', {'BACKEND'})")
+    @PostMapping("/remoteDetail/{id}")
+    public R<PaymentMerchant.MerchantMember> remoteDetail(@PathVariable("id") Long id) {
+
+        PaymentMerchant.MerchantMember merchantMember = tenantMemberService.remoteDetail(id);
+
+        return R.from(merchantMember);
+    }
+
+
+    @ApiOperation("修改企业用户(状态是failed才能修改)")
+    @PostMapping(value = "upload")
+    @PreAuthorize("@pcs.hasPermissions('tenantMember/upload')")
+    public HttpResponseResult<String> upload(MultipartFile multipartFile) throws Exception {
+
+
+        File file = new File("/var/tmp/" + multipartFile.getOriginalFilename());
+        if (!file.getParentFile().exists()) {
+            file.getParentFile().mkdirs();
+        }
+        FileOutputStream fos = new FileOutputStream(file);
+        InputStream inputStream = multipartFile.getInputStream();
+
+        try {
+            IOUtils.copy(inputStream, fos);
+            inputStream.close();
+            fos.close();
+
+
+            PaymentMerchant.MerchantConfig merchantConfig = tenantMemberService.getMerchantConfig(EPayerType.YEEPAY.getDesc());
+
+            // 创建账户
+            BasePaymentService paymentService = paymentServiceContext.getPaymentService(EPayerType.YEEPAY.getDesc());
+            if (paymentService == null) {
+                throw new BizException("支付渠道不存在");
+            }
+
+            return succeed(paymentService.upload(merchantConfig, file));
+        } catch (Exception e) {
+            return failed(e.getMessage());
+        } finally {
+            IOUtils.closeQuietly(fos);
+            IOUtils.closeQuietly(inputStream);
+            FileUtils.deleteQuietly(file);
+        }
+
+    }
 }

+ 2 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/open/UserPaymentClient.java

@@ -168,6 +168,7 @@ public class UserPaymentClient {
 
     @PostMapping("/callback/adapay")
     public String callback(HttpServletRequest request) {
+        log.info("adapay 子账户回调");
         try {
             // 验签请参data
             String data = request.getParameter("data");
@@ -235,6 +236,7 @@ public class UserPaymentClient {
     @PostMapping("/callback/yeepay/{requestNo}")
     public String callback(@PathVariable("requestNo") String requestNo, HttpServletRequest request) {
 
+        log.info("yeepay 子账户回调");
         TenantMember tenantMember = tenantMemberService.getByRequestNo(requestNo);
         if(tenantMember == null){
             return "请求编号["+ requestNo +"]在系统中不存在";

+ 58 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TenantMemberController.java

@@ -4,8 +4,13 @@ import com.microsvc.toolkit.common.response.paging.PageInfo;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import com.microsvc.toolkit.common.response.template.R;
 
+import com.microsvc.toolkit.middleware.payment.common.api.BasePaymentService;
+import com.microsvc.toolkit.middleware.payment.common.api.PaymentServiceContext;
+import com.microsvc.toolkit.middleware.payment.common.api.entity.PaymentMerchant;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.EPayerType;
+import com.yonge.toolset.base.exception.BizException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -25,6 +30,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.service.TenantMemberService;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantMemberWrapper;
 import com.yonge.cooleshow.biz.dal.entity.TenantMember;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;
 import java.io.File;
@@ -48,6 +54,8 @@ public class TenantMemberController extends BaseController {
     @Autowired
     private TenantMemberService tenantMemberService;
 
+    @Autowired
+    private PaymentServiceContext paymentServiceContext;
     @ApiOperation(value = "详情", notes = "机构子账户表-根据详情ID查询单条, 传入id")
     @PreAuthorize("@pcs.hasPermissions('tenantMember/detail', {'BACKEND'})")
     @PostMapping("/detail/{id}")
@@ -145,4 +153,54 @@ public class TenantMemberController extends BaseController {
 
         return R.from(tenantMemberService.removeById(id));
     }
+
+
+    @ApiOperation(value = "查询三方企业账户", notes = "机构子账户表-根据详情ID查询单条, 传入id")
+    @PreAuthorize("@pcs.hasPermissions('tenantMember/remoteDetail', {'BACKEND'})")
+    @PostMapping("/remoteDetail/{id}")
+    public R<PaymentMerchant.MerchantMember> remoteDetail(@PathVariable("id") Long id) {
+
+        PaymentMerchant.MerchantMember merchantMember = tenantMemberService.remoteDetail(id);
+
+        return R.from(merchantMember);
+    }
+
+
+    @ApiOperation("修改企业用户(状态是failed才能修改)")
+    @PostMapping(value = "upload")
+    @PreAuthorize("@pcs.hasPermissions('tenantMember/upload')")
+    public HttpResponseResult<String> upload(MultipartFile multipartFile) throws Exception {
+
+
+        File file = new File("/var/tmp/" + multipartFile.getOriginalFilename());
+        if (!file.getParentFile().exists()) {
+            file.getParentFile().mkdirs();
+        }
+        FileOutputStream fos = new FileOutputStream(file);
+        InputStream inputStream = multipartFile.getInputStream();
+
+        try {
+            IOUtils.copy(inputStream, fos);
+            inputStream.close();
+            fos.close();
+
+
+            PaymentMerchant.MerchantConfig merchantConfig = tenantMemberService.getMerchantConfig(EPayerType.YEEPAY.getDesc());
+
+            // 创建账户
+            BasePaymentService paymentService = paymentServiceContext.getPaymentService(EPayerType.YEEPAY.getDesc());
+            if (paymentService == null) {
+                throw new BizException("支付渠道不存在");
+            }
+
+            return succeed(paymentService.upload(merchantConfig, file));
+        } catch (Exception e) {
+            return failed(e.getMessage());
+        } finally {
+            IOUtils.closeQuietly(fos);
+            IOUtils.closeQuietly(inputStream);
+            FileUtils.deleteQuietly(file);
+        }
+
+    }
 }

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantMemberService.java

@@ -4,6 +4,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.microsvc.toolkit.middleware.payment.common.api.entity.PaymentMerchant;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantMemberWrapper;
 import com.yonge.cooleshow.biz.dal.entity.TenantMember;
 import com.yonge.cooleshow.common.enums.EPayerType;
@@ -42,6 +43,8 @@ public interface TenantMemberService extends IService<TenantMember>  {
      */
     Boolean add(TenantMemberWrapper.InsertOrUpdateTenantMember tenantMember);
 
+    PaymentMerchant.MerchantConfig getMerchantConfig(String paymentVerdor);
+
     /**
      * 更新
      * @param tenantMember TenantMemberWrapper.TenantMember
@@ -61,4 +64,6 @@ public interface TenantMemberService extends IService<TenantMember>  {
     TenantMember getByRequestNo(String requestNo);
 
     TenantMember getByAppIdAndTenantId(String appId, Long tenantId, EPayerType payerType);
+
+    PaymentMerchant.MerchantMember remoteDetail(Long id);
 }

+ 95 - 19
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantMemberServiceImpl.java

@@ -3,16 +3,13 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 
 import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
-import com.baomidou.mybatisplus.extension.service.additional.update.impl.LambdaUpdateChainWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.microsvc.toolkit.middleware.payment.common.api.BasePaymentService;
 import com.microsvc.toolkit.middleware.payment.common.api.PaymentServiceContext;
 import com.microsvc.toolkit.middleware.payment.common.api.entity.PaymentMerchant;
 import com.yonge.cooleshow.biz.dal.entity.PaymentMerchantConfig;
-import com.yonge.cooleshow.biz.dal.entity.SysArea;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysAreaMapper;
 import com.yonge.cooleshow.biz.dal.service.PaymentMerchantConfigService;
@@ -20,8 +17,7 @@ import com.yonge.cooleshow.biz.dal.service.SysConfigService;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.enums.EPayerType;
 import com.yonge.toolset.base.exception.BizException;
-import com.yonge.toolset.base.util.StringUtil;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import lombok.extern.slf4j.Slf4j;
@@ -32,7 +28,6 @@ import com.yonge.cooleshow.biz.dal.service.TenantMemberService;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
-import java.util.stream.Collectors;
 
 
 /**
@@ -119,16 +114,31 @@ public class TenantMemberServiceImpl extends ServiceImpl<TenantMemberMapper, Ten
     @Transactional(rollbackFor = Exception.class)
     public Boolean add(TenantMemberWrapper.InsertOrUpdateTenantMember tenantMember) {
 
+        Integer count = this.lambdaQuery()
+            .eq(TenantMember::getTenantId, tenantMember.getTenantId())
+            .eq(TenantMember::getPayerName, tenantMember.getPayerName())
+            .count();
+        if (count > 0) {
+            throw new BizException("该机构已创建成功,请核查");
+        }
+
         PaymentMerchant.MerchantConfig merchantConfig = getMerchantConfig(tenantMember.getPayerName());
         tenantMember.setRequestNo(IdWorker.getIdStr());
 
         // 创建账户
         BasePaymentService paymentService = paymentServiceContext.getPaymentService(tenantMember.getPayerName());
+        if (paymentService == null) {
+            throw new BizException("支付渠道不存在");
+        }
 
         PaymentMerchant.MerchantMember merchantMember = getMerchantMember(tenantMember);
         try {
             log.info("创建子账户参数:{}", JSON.toJSONString(merchantConfig));
             Map<String, Object> paymentCorpMember = paymentService.createPaymentCorpMember(merchantConfig, merchantMember);
+            if (tenantMember.getPayerType().equals(EPayerType.YEEPAY)) {
+                tenantMember.setMemberId(paymentCorpMember.get("merchantNo").toString());
+//                tenantMember.setRequestNo(paymentCorpMember.get("requestNo").toString());
+            }
         }catch (Exception e) {
             log.error("创建子账户失败", e);
             throw new BizException("创建子账户失败:" + e.getMessage());
@@ -161,7 +171,7 @@ public class TenantMemberServiceImpl extends ServiceImpl<TenantMemberMapper, Ten
                 .attachFile(tenantMember.getFile())
                 .bankCode(tenantMember.getBankCode())
                 .bankAccountType(tenantMember.getBankAcctType())
-                .bankCardNo(tenantMember.getBankCode())
+                .bankCardNo(tenantMember.getCardNo())
                 .cardName(tenantMember.getCardName())
                 .zipCode(tenantMember.getZipCode())
                 .requestNo(tenantMember.getRequestNo())
@@ -178,16 +188,17 @@ public class TenantMemberServiceImpl extends ServiceImpl<TenantMemberMapper, Ten
                 .build();
         if (tenantMember.getPayerType().equals(EPayerType.ADAPAY)) {
             merchantMember.setNotifyUrl(sysConfigService.findConfigValue(SysConfigConstant.SUB_ACCOUNT_CREATE_CALLBACK_URL) +
-                    "/" + EPayerType.ADAPAY.getCode());
+                    "/" + EPayerType.ADAPAY.getDesc());
         } else if (tenantMember.getPayerType().equals(EPayerType.YEEPAY)) {
             merchantMember.setNotifyUrl(sysConfigService.findConfigValue(SysConfigConstant.SUB_ACCOUNT_CREATE_CALLBACK_URL )+
-                    "/" + EPayerType.YEEPAY.getCode()+"/"+tenantMember.getRequestNo());
+                    "/" + EPayerType.YEEPAY.getDesc());
         }
         return merchantMember;
 
     }
 
-    private PaymentMerchant.MerchantConfig getMerchantConfig(String paymentVerdor) {
+    @Override
+    public PaymentMerchant.MerchantConfig getMerchantConfig(String paymentVerdor) {
         // 注册对应的子账户
         PaymentMerchantConfig merchantConfig = paymentMerchantConfigService.getByPaymentVendor(paymentVerdor);
 
@@ -218,6 +229,13 @@ public class TenantMemberServiceImpl extends ServiceImpl<TenantMemberMapper, Ten
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean update(TenantMemberWrapper.InsertOrUpdateTenantMember tenantMember){
+        Integer count = this.lambdaQuery()
+            .eq(TenantMember::getId, tenantMember.getId())
+            .count();
+        if (count == 0) {
+            throw new BizException("商户不存在请核对");
+        }
+
 
         TenantMember member = this.getById(tenantMember.getId());
 
@@ -225,7 +243,9 @@ public class TenantMemberServiceImpl extends ServiceImpl<TenantMemberMapper, Ten
 
         // 创建账户
         BasePaymentService paymentService = paymentServiceContext.getPaymentService(tenantMember.getPayerName());
-
+        if (paymentService == null) {
+            throw new BizException("支付渠道不存在");
+        }
         PaymentMerchant.MerchantMember merchantMember = getMerchantMember(tenantMember);
 
         try {
@@ -254,18 +274,54 @@ public class TenantMemberServiceImpl extends ServiceImpl<TenantMemberMapper, Ten
      * @return
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean updateCount(TenantMemberWrapper.UpdateCount tenantMember) {
 
-        if (!StringUtil.isEmpty(tenantMember)){
-            LambdaUpdateChainWrapper<TenantMember> wrapper = this.lambdaUpdate()
-                    .set(TenantMember::getCardNo, tenantMember.getCardNo())
-                    .set(TenantMember::getBankCode, tenantMember.getBankCode())
-                    .eq(TenantMember::getId, tenantMember.getId());
+        TenantMember member = getById(tenantMember.getId());
+        if (member == null) {
+            throw new BizException("商户不存在请核对");
+        }
+        if (!member.getStatus().equals(AuthStatusEnum.PASS)) {
+            throw new BizException("商户审核通过,才能绑定结算卡");
+        }
+
+        member.setBankCode(tenantMember.getBankCode());
+        member.setCardNo(tenantMember.getCardNo());
+
+        PaymentMerchant.MerchantConfig merchantConfig = getMerchantConfig(member.getPayerName());
 
-            wrapper.update();
-            return true;
+        // 创建账户
+        BasePaymentService paymentService = paymentServiceContext.getPaymentService(member.getPayerName());
+        if (paymentService == null) {
+            throw new BizException("支付渠道不存在");
         }
-         return false;
+
+        try {
+            //删除结算账户
+            if (StringUtils.isNotBlank(member.getSettleAccountId())) {
+                paymentService.deleteSettleAccount(merchantConfig.getMerchantKey(), merchantConfig.getAppId(), member.getMemberId(), member.getSettleAccountId());
+            }
+
+            PaymentMerchant.AccountInfo accountInfo = PaymentMerchant.AccountInfo.builder()
+                .memberId(member.getMemberId())
+                .cardId(member.getCardNo())
+                .cardName(member.getCardName())
+                .areaCode(member.getAreaCode())
+                .bankAcctType(member.getBankAcctType())
+                .bankCode(member.getBankCode())
+                .bankName(member.getBankCode())
+                .provCode(member.getProvCode())
+                .telNo(member.getLegalMp())
+                .build();
+            //创建结算账户
+            String settleAccountId = paymentService.createSettleAccount(merchantConfig, accountInfo);
+
+            member.setSettleAccountId(settleAccountId);
+        }catch (Exception e) {
+            log.error("更新结算账户失败", e);
+            throw new BizException("更新结算账户失败:" + e.getMessage());
+        }
+        return this.updateById(member);
     }
 
     @Override
@@ -298,4 +354,24 @@ public class TenantMemberServiceImpl extends ServiceImpl<TenantMemberMapper, Ten
 
     }
 
+    @Override
+    public PaymentMerchant.MerchantMember remoteDetail(Long id) {
+
+        TenantMember tenantMember = getById(id);
+
+        TenantMember member = this.getById(tenantMember.getId());
+
+        PaymentMerchant.MerchantConfig merchantConfig = getMerchantConfig(tenantMember.getPayerName());
+
+        // 创建账户
+        BasePaymentService paymentService = paymentServiceContext.getPaymentService(tenantMember.getPayerName());
+        if (paymentService == null) {
+            throw new BizException("支付渠道不存在");
+        }
+        PaymentMerchant.MerchantMember merchantMember = getMerchantMember(TenantMemberWrapper.InsertOrUpdateTenantMember.from(JSON.toJSONString(tenantMember)));
+
+        return paymentService.getPaymentCorpMember(merchantConfig, merchantMember);
+
+    }
+
 }

+ 2 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantMemberWrapper.java

@@ -345,8 +345,8 @@ public class TenantMemberWrapper {
             return JSON.toJSONString(this);
         }
 
-        public static TenantMember from(String json) {
-            return JSON.parseObject(json, TenantMember.class);
+        public static InsertOrUpdateTenantMember from(String json) {
+            return JSON.parseObject(json, InsertOrUpdateTenantMember.class);
         }
     }