فهرست منبع

add 主账号商户管理

zoujiajian 3 سال پیش
والد
کامیت
e9e658a025

+ 5 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -63,6 +63,11 @@ public interface Constant {
 	 */
 	List<Long> FIXED_CUSTOMER_COUPON_IDS = List.of(38l, 63l);
 
+	/**
+	 * 系统主账号商户配置key
+	 */
+	String SYS_DEFAULT_SHOP_KEY = "sys_default_shop_key";
+
 	String INITIAL_PASSWORD ="qwer1234";
 
 	List<String> serviceKeys = List.of("service_img_set", "service_name_set");

+ 31 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/DefaultShopConfig.java

@@ -0,0 +1,31 @@
+package com.cyksj.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/*
+ *项目名: netflix
+ *文件名: DefaultShopConfig
+ *创建者: JavaZou
+ *创建时间:2023/3/21 15:06
+ */
+@Getter
+@Setter
+public class DefaultShopConfig {
+	/**
+	 * 支付宝默认商户
+	 */
+	private String zfbDefaultAppId;
+
+	/**
+	 * 微信默认商户
+	 */
+	private String wxDefaultAppId;
+
+	/**
+	 * 支付方式
+	 */
+	private List<String> payMethod;
+}

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/RegisterOrderDon.java

@@ -98,6 +98,9 @@ public class RegisterOrderDon{
     @DbField("rd.pay_time")
     private Date payTime;
 
+    @DbField("rd.shop_id")
+    private String shopId;
+
     @DbField("rd.is_free")
     private Boolean isFree;
 

+ 13 - 5
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -63,6 +63,7 @@ import com.cyksj.service.market.task.TaskService;
 import com.cyksj.service.order.OrderDonService;
 import com.cyksj.service.order.UserRealOrderBenefitsService;
 import com.cyksj.service.relation.GroupRelationFrontService;
+import com.cyksj.service.sys.SysConfigService;
 import com.cyksj.service.template.TemplateCommonService;
 import com.cyksj.service.wechat.WeChatService;
 import com.cyksj.task.JobManager;
@@ -184,6 +185,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final TransferAccountsRecordMapper transferAccountsRecordMapper;
 
+	private final SysConfigService sysConfigService;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -368,7 +371,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 		String toWechatAttach = Codec.DoBase64.custom()
 				.setData(Jsons.toJson(attach)).encodeAsText();
-		String shopId = ShopConfig.WX_DEFAULT_APP_ID;
+		//获取微信默认商户
+		String shopId = sysConfigService.getDefaultShopConfigByType("wx");
 
 		ShopConfig shopConfig = shopConfigMapper.getByChannelPopularizeId(orderDon.getPopularizeId(),"wx");
 		if (shopConfig != null) {
@@ -405,7 +409,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		String toWechatAttach = Codec.DoBase64.custom()
 				.setData(Jsons.toJson(attach)).encodeAsText();
 
-		String shopId = ShopConfig.WX_DEFAULT_APP_ID;
+		//获取微信默认商户
+		String shopId = sysConfigService.getDefaultShopConfigByType("wx");
 
 		ShopConfig shopConfig = shopConfigMapper.getByChannelPopularizeId(orderDon.getPopularizeId(),"wx");
 		if (shopConfig != null) {
@@ -706,7 +711,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 	@Override
 	public AliPayParams aliPay(Long orderId, String returnUrl, String productCode, String qrPayMode) throws Exception {
 		OrderDon orderDon = getById(orderId);
-		String appId = ShopConfig.ZFB_DEFAULT_APP_ID;
+		//获取支付宝默认商户
+		String appId = sysConfigService.getDefaultShopConfigByType("zfb");
 
 		if (orderDon.getPopularizeId() != null) {
 			ShopConfig shopConfig = shopConfigMapper.getByChannelPopularizeId(orderDon.getPopularizeId(),"zfb");
@@ -905,9 +911,11 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			//退款请求号
 			model.setOutRequestNo(outRefundNo);
 			request.setBizModel(model);
-			if (orderDon.getShopId() != null && orderDon.getShopId().equals(ShopConfig.DISTRIBUTE_ZFB_DEFAULT_APP_ID)) {
+			String shopId = orderDon.getShopId();
+			ShopConfig shopConfig = shopConfigMapper.selectOne(Wrappers.lambdaQuery(ShopConfig.class).eq(ShopConfig::getAppId, orderDon.getShopId()));
+			if (shopId != null && shopConfig != null && shopConfig.getIsCert()) {
 				response = alipayClient.certificateExecute(request);
-			}else {
+			} else {
 				response = alipayClient.execute(request);
 			}
 		}

+ 9 - 4
netflix-service/src/main/java/com/cyksj/service/register/impl/RegisterOrderDonServiceImpl.java

@@ -46,6 +46,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.Map;
+import java.util.Optional;
 
 /**
  * @author chan
@@ -254,12 +255,15 @@ public class RegisterOrderDonServiceImpl extends ServiceImpl<RegisterOrderDonMap
         OrderAttach attach = new OrderAttach();
         attach.setO(orderDon.getId());
 
+        //获取支付默认商户
+        String shopId = sysConfigService.getDefaultShopConfigByType("wx");
+
         String toWechatAttach = Codec.DoBase64.custom()
                 .setData(Jsons.toJson(attach)).encodeAsText();
 
         H5JsPayParams params = weChatService.getJsPayParams(
                 weChatConfig.getAppid(),
-                ShopConfig.WX_DEFAULT_APP_ID,
+                shopId,
                 orderDon.getOpenId(),
                 orderDon.getMoney().intValue(),
                 orderDon.getOrderNo(),
@@ -293,9 +297,10 @@ public class RegisterOrderDonServiceImpl extends ServiceImpl<RegisterOrderDonMap
         if (null == order) {
             throw BusinessRuntimeException.getInstance("订单不存在.");
         }
+        String appId = map.get("mch_id");
 
         // 校验签名
-        boolean f = weChatService.checkSignWithMd5(map, shopConfigMapper.getByAppId(weChatConfig.getShopid()).getSecret());
+        boolean f = weChatService.checkSignWithMd5(map, shopConfigMapper.getByAppId(appId).getSecret());
         if (!f) {
             log.error("回调数据:{}", map);
             throw BusinessRuntimeException.getInstance("支付成功回调, 校验签名失败.");
@@ -352,7 +357,7 @@ public class RegisterOrderDonServiceImpl extends ServiceImpl<RegisterOrderDonMap
                 .toHexString();
         wxOrderRefundReq.setRefundMoney(registerOrderDon.getMoney());
         weChatService.refundWxOrder(weChatConfig.getAppid(),
-                ShopConfig.WX_DEFAULT_APP_ID,
+                Optional.ofNullable(registerOrderDon.getShopId()).orElse(ShopConfig.WX_DEFAULT_APP_ID),
                 registerOrderDon.getTransactionId(),
                 outRefundNo,
                 registerOrderDon.getMoney(),
@@ -367,7 +372,7 @@ public class RegisterOrderDonServiceImpl extends ServiceImpl<RegisterOrderDonMap
     @Override
     public void wxRefundNotify(Map<String, String> map) throws Exception {
         // 对退款数据 解密
-        String md5Key = Codec.DoDigest.custom().setAlgorithm(Codec.DoDigest.Algorithm.MD5).setStringData(shopConfigMapper.getByAppId(weChatConfig.getShopid()).getSecret()).toHexString();
+        String md5Key = Codec.DoDigest.custom().setAlgorithm(Codec.DoDigest.Algorithm.MD5).setStringData(shopConfigMapper.getByAppId(map.get("mch_id")).getSecret()).toHexString();
         String reqInfoXml = Codec.DoCipher.custom().setAlgorithm(Codec.DoCipher.Trans.AES_ECB_PKCS7Padding).setBase64Data(map.get("req_info")).setStringKey(md5Key).ofDecrypt().toText();
         log.info("=== 退款数据解密: \n {}", reqInfoXml);
         Map<String, String> reqInfoMap = Xmls.toMap(reqInfoXml);

+ 6 - 0
netflix-service/src/main/java/com/cyksj/service/sys/SysConfigService.java

@@ -8,4 +8,10 @@ import com.cyksj.model.entity.SysConfig;
  * @date 2022/10/20 10:07 AM
  */
 public interface SysConfigService extends IService<SysConfig> {
+
+	/**
+	 * 获取默认系统默认商户主配置
+	 * @param type wx\zfb
+	 */
+	String getDefaultShopConfigByType(String type);
 }

+ 37 - 0
netflix-service/src/main/java/com/cyksj/service/sys/impl/SysConfigServiceImpl.java

@@ -1,12 +1,19 @@
 package com.cyksj.service.sys.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.common.constant.Constant;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.mapper.SysConfigMapper;
+import com.cyksj.model.dto.DefaultShopConfig;
+import com.cyksj.model.entity.ShopConfig;
 import com.cyksj.model.entity.SysConfig;
 import com.cyksj.service.sys.SysConfigService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.util.Optional;
+
 /**
  * @author chan
  * @date 2022/10/20 10:07 AM
@@ -14,4 +21,34 @@ import org.springframework.stereotype.Service;
 @Slf4j
 @Service
 public class SysConfigServiceImpl extends ServiceImpl<SysConfigMapper,SysConfig> implements SysConfigService {
+
+	@Override
+	public String getDefaultShopConfigByType(String type) {
+		SysConfig shopConfig = this.getOne(Wrappers.lambdaQuery(SysConfig.class)
+				.eq(SysConfig::getSysKey, Constant.SYS_DEFAULT_SHOP_KEY).last("limit 1"));
+		if (shopConfig == null) {
+			return getShopIdByType(type);
+		}
+		String sysValue = shopConfig.getSysValue();
+		try {
+			DefaultShopConfig defaultShopConfig = Jsons.parseObject(sysValue, DefaultShopConfig.class);
+			String wxDefaultAppId = defaultShopConfig.getWxDefaultAppId();
+			String zfbDefaultAppId = defaultShopConfig.getZfbDefaultAppId();
+			if ("wx".equals(type)) {
+				return Optional.ofNullable(wxDefaultAppId).orElse(ShopConfig.WX_DEFAULT_APP_ID);
+			}
+			return Optional.ofNullable(zfbDefaultAppId).orElse(ShopConfig.ZFB_DEFAULT_APP_ID);
+		} catch (Exception e) {
+
+		}
+		return getShopIdByType(type);
+	}
+
+
+	public String getShopIdByType(String type) {
+		if ("wx".equals(type)) {
+			return ShopConfig.WX_DEFAULT_APP_ID;
+		}
+		return ShopConfig.ZFB_DEFAULT_APP_ID;
+	}
 }

+ 4 - 0
netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java

@@ -33,6 +33,7 @@ import com.cyksj.model.response.AliPayTradeStatus;
 import com.cyksj.model.views.GoodsDonSkuView;
 import com.cyksj.model.views.OrderCommentView;
 import com.cyksj.service.order.OrderDonService;
+import com.cyksj.service.sys.SysConfigService;
 import com.cyksj.web.util.StpUserUtil;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
@@ -87,6 +88,9 @@ public class OrderController {
     @Autowired
     private OrderDonWaybillMapper waybillMapper;
 
+    @Autowired
+    private SysConfigService sysConfigService;
+
     /**
      * 支付
      * @author chan