TRX hace 1 año
padre
commit
48d37ab373
Se han modificado 13 ficheros con 216 adiciones y 102 borrados
  1. 1 1
      PaymentClient/src/main/java/com/zhongshu/payment/client/model/param/RechargeParam.java
  2. 18 0
      PaymentClient/src/main/java/com/zhongshu/payment/client/payModel/commn/PayNotityParam.java
  3. 2 2
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/controller/RechargeController.java
  4. 3 2
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/controller/wxPaymentV3/WechatNotifyController.java
  5. 0 6
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/controller/wxPaymentV3/WechatPayV3Controller.java
  6. 14 14
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/domain/wallet/RechargeRecord.java
  7. 50 69
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/RechargeService.java
  8. 7 4
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/common/ScanExecuteService.java
  9. 19 1
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/pay/SuperPayService.java
  10. 15 1
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/pay/impl/unionFrictionlessPay/UnionFrictionlessPayMainService.java
  11. 1 1
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/pay/impl/unionFrictionlessPay/UnionRequestService.java
  12. 85 0
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/pay/impl/wxPaymentV3/WxPaymentMainService.java
  13. 1 1
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/utils/CommonUtil.java

+ 1 - 1
PaymentClient/src/main/java/com/zhongshu/payment/client/model/param/RechargeParam.java

@@ -24,7 +24,7 @@ public class RechargeParam {
     private String walletId;
 
     @Schema(name = "paymentType", description = "支付方式", example = "WeChat")
-    private PaymentType paymentType;
+    private PaymentType paymentType = PaymentType.WeChat;
 
     // 商品描述(必填)
     @Schema(name = "description", description = "商品描述(必填)", example = "充值服务")

+ 18 - 0
PaymentClient/src/main/java/com/zhongshu/payment/client/payModel/commn/PayNotityParam.java

@@ -0,0 +1,18 @@
+package com.zhongshu.payment.client.payModel.commn;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 支付结果处理参数
+ *
+ * @author TRX
+ * @date 2024/8/22
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PayNotityParam {
+    private String outTradeNo;
+}

+ 2 - 2
PaymentServer/src/main/java/com/zhongshu/payment/server/core/controller/RechargeController.java

@@ -32,7 +32,7 @@ public class RechargeController {
     @Operation(summary = "创建充值订单", description = "创建充值订单")
     @PostMapping(value = "create", consumes = MediaType.APPLICATION_JSON_VALUE)
     public Object create(@RequestBody RechargeParam param) {
-        return rechargeService.create(param);
+        return rechargeService.createLocalOrder(param);
     }
 
     /**
@@ -41,7 +41,7 @@ public class RechargeController {
     @Operation(summary = "下单(获取调用微信支付参数)", description = "下单(获取调用微信支付参数)")
     @PostMapping(value = "order", consumes = MediaType.APPLICATION_JSON_VALUE)
     public ResultContent order(@RequestBody OrderParam param) {
-        return rechargeService.order(param);
+        return rechargeService.createChannelOrder(param);
     }
 
     /**

+ 3 - 2
PaymentServer/src/main/java/com/zhongshu/payment/server/core/controller/wxPaymentV3/WechatNotifyController.java

@@ -1,5 +1,6 @@
 package com.zhongshu.payment.server.core.controller.wxPaymentV3;
 
+import com.zhongshu.payment.server.core.service.RechargeService;
 import com.zhongshu.payment.server.core.service.pay.impl.wxPaymentV3.WxPayNotifyService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -23,12 +24,12 @@ import org.springframework.web.bind.annotation.RestController;
 public class WechatNotifyController {
 
     @Autowired
-    WxPayNotifyService wxPayNotifyService;
+    RechargeService rechargeService;
 
     @Operation(summary = "支付通知回调")
     @PostMapping(value = "payNotify/{outTradeNo}", consumes = MediaType.APPLICATION_JSON_VALUE)
     public void payNotify(HttpServletRequest request, @PathVariable(name = "outTradeNo") String outTradeNo) {
         log.info("收到微信支付通知 appid:{}", outTradeNo);
-        wxPayNotifyService.payNotify(request, outTradeNo);
+        rechargeService.payNotify(request, outTradeNo);
     }
 }

+ 0 - 6
PaymentServer/src/main/java/com/zhongshu/payment/server/core/controller/wxPaymentV3/WechatPayV3Controller.java

@@ -44,12 +44,6 @@ public class WechatPayV3Controller {
         return ResultContent.buildSuccess();
     }
 
-//    @Operation(summary = "充值下单(测试)")
-//    @PostMapping(value = "transactions", consumes = MediaType.APPLICATION_JSON_VALUE)
-//    public Object testPrepay(@RequestBody WxPrepayParam param){
-//        return wxPaymentService.testPrepay(param);
-//    }
-
     @Operation(summary = "获取openid")
     @GetMapping(value = "getOpenid")
     public Object transactions(@Parameter(name = "jscode") @RequestParam(name = "jscode") String jscode) {

+ 14 - 14
PaymentServer/src/main/java/com/zhongshu/payment/server/core/domain/wallet/RechargeRecord.java

@@ -38,27 +38,25 @@ public class RechargeRecord extends SuperEntity {
     @Indexed
     private String schoolId;
 
-    @Schema(name = "appid", description = "appid")
+    @Schema(name = "appid", description = "小程序appid")
     @Indexed
     private String appid;
 
+    @Schema(name = "openid", description = "当前创建订单的微信用户openid")
+    @Indexed
+    private String openid;
+
     @Schema(name = "钱包信息", description = "钱包信息")
     @DBRef(lazy = true)
     private Wallet wallet;
 
-    @Schema(name = "paymentType", description = "支付方式")
+    @Schema(name = "paymentType", description = "支付方式,如:微信、个人钱包、无感支付")
     @Indexed
     private PaymentType paymentType;
 
-    @Schema(name = "openid", description = "微信用户openid")
+    @Schema(name = "tradeType", description = "交易类型,如:充值、扣款、提现")
     @Indexed
-    private String openid;
-
-    @Schema(name = "description", description = "商品描述(必填)")
-    private String description;
-
-    @Schema(name = "amount", description = "订单金额")
-    private BigDecimal total = BigDecimal.ZERO;
+    private TradeType tradeType;
 
     @Schema(name = "outTradeNo", description = "商户订单号(必填)")
     @Indexed(unique = true)
@@ -68,6 +66,12 @@ public class RechargeRecord extends SuperEntity {
     @Indexed
     private RechargeState rechargeState;
 
+    @Schema(name = "amount", description = "订单金额,单位分")
+    private BigDecimal total = BigDecimal.ZERO;
+
+    @Schema(name = "description", description = "商品描述(必填)")
+    private String description;
+
     @Schema(name = "expireTime", description = "失效时间")
     private Long expireTime;
 
@@ -84,10 +88,6 @@ public class RechargeRecord extends SuperEntity {
     @Schema(name = "prePayModel", description = "调用微信支付参数")
     private PrePayModel prePayModel;
 
-    @Schema(name = "tradeType", description = "交易类型")
-    @Indexed
-    private TradeType tradeType;
-
     @Schema(name = "failReason", description = "失败原因")
     private String failReason;
 

+ 50 - 69
PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/RechargeService.java

@@ -2,6 +2,7 @@ package com.zhongshu.payment.server.core.service;
 
 import ch.qos.logback.core.util.StringUtil;
 import com.github.microservice.auth.security.helper.AuthHelper;
+import com.github.microservice.core.helper.ApplicationContextHolder;
 import com.github.microservice.net.ResultContent;
 import com.wechat.pay.java.service.payments.jsapi.model.Amount;
 import com.wechat.pay.java.service.payments.jsapi.model.Payer;
@@ -18,41 +19,49 @@ import com.zhongshu.payment.client.model.PrePayModel;
 import com.zhongshu.payment.client.model.RechargeRecordModel;
 import com.zhongshu.payment.client.model.param.OrderParam;
 import com.zhongshu.payment.client.model.param.RechargeParam;
+import com.zhongshu.payment.client.payModel.commn.PayNotityParam;
 import com.zhongshu.payment.client.types.RechargeState;
 import com.zhongshu.payment.client.types.TradeType;
 import com.zhongshu.payment.client.types.WalletState;
 import com.zhongshu.payment.client.types.WalletType;
+import com.zhongshu.payment.server.core.dao.ExecuteMethodInfoDao;
 import com.zhongshu.payment.server.core.dao.RechargeRecordDao;
 import com.zhongshu.payment.server.core.dao.WalletDao;
 import com.zhongshu.payment.server.core.dao.WxPayConfigDao;
 import com.zhongshu.payment.server.core.dataConfig.TimeConfig;
+import com.zhongshu.payment.server.core.domain.unionFrictionlessPay.ExecuteMethodInfo;
 import com.zhongshu.payment.server.core.domain.wallet.RechargeRecord;
 import com.zhongshu.payment.server.core.domain.wallet.Wallet;
+import com.zhongshu.payment.server.core.service.base.SuperService;
 import com.zhongshu.payment.server.core.service.impl.WalletFeignServiceImpl;
+import com.zhongshu.payment.server.core.service.pay.SuperPayService;
 import com.zhongshu.payment.server.core.service.pay.impl.wxPaymentV3.WxPaymentMainService;
 import com.zhongshu.payment.server.core.utils.CommonUtil;
 import com.zhongshu.payment.server.core.utils.DateUtils;
 import com.zhongshu.payment.server.core.utils.wx.WechatCUtil;
+import jakarta.servlet.http.HttpServletRequest;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.PathVariable;
 
 import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
 /**
- * 充值服务
+ * 交易服务
  *
  * @author wjf
  * @date 2024/7/25
  */
 @Slf4j
 @Service
-public class RechargeService {
+public class RechargeService extends SuperService {
 
     @Autowired
     AuthHelper authHelper;
@@ -81,38 +90,31 @@ public class RechargeService {
     @Autowired
     OrganizationFeignService organizationFeignService;
 
-//    private String buildOutTradeNo(){
-//
-//        if (rechargeRecordDao.existsByOutTradeNo(outTradeNo)){
-//            buildOutTradeNo();
-//        }
-//        return outTradeNo;
-//    }
+    @Autowired
+    ExecuteMethodInfoDao executeMethodInfoDao;
 
     /**
-     * 创建充值订单
+     * 创建充值本地订单
      */
-    public Object create(RechargeParam param) {
+    public Object createLocalOrder(RechargeParam param) {
         String userId = authHelper.getCurrentUser().getUserId();
         Wallet userWallet = walletDao.findTop1ById(param.getWalletId());
         //判断钱包是否初始化
         if (userWallet == null) {
             return ResultContent.buildFail("用户钱包未开通");
         }
-
         if (userWallet.getDataState().equals(WalletState.Disable)) {
             return ResultContent.buildFail("钱包已停用");
         }
-
         if (userWallet.getWalletType().equals(WalletType.Shop)) {
             return ResultContent.buildFail("商户提现暂未开通线上充值功能");
         }
-
         // 创建充值订单
         RechargeRecord rechargeRecord = new RechargeRecord();
         org.springframework.beans.BeanUtils.copyProperties(param, rechargeRecord, "total");
         String outTradeNo = CommonUtil.UUID();
         rechargeRecord.setOutTradeNo(outTradeNo);
+        // 金额
         rechargeRecord.setTotal(BigDecimal.valueOf(param.getTotal()));
         rechargeRecord.setOid(userWallet.getOid());
         rechargeRecord.setTradeType(TradeType.Charge);
@@ -133,7 +135,6 @@ public class RechargeService {
         long createTIme = System.currentTimeMillis();
         rechargeRecord.setCreateTime(createTIme);
         rechargeRecord.setTimes();
-
         // 订单过期时间
         rechargeRecord.setExpireTime(createTIme + TimeConfig.rechargeExpireTime);
         RechargeRecord record = rechargeRecordDao.save(rechargeRecord);
@@ -141,22 +142,11 @@ public class RechargeService {
         return ResultContent.buildSuccess(model);
     }
 
-    private RechargeRecordModel toModel(RechargeRecord record) {
-        RechargeRecordModel model = new RechargeRecordModel();
-        if (record != null) {
-            BeanUtils.copyProperties(record, model, "total");
-            model.setTotal(record.getTotal().intValue());
-            model.setPrePayModel(record.getPrePayModel());
-            model.setUserInfo(record.getUserInfo());
-        }
-        return model;
-    }
-
     /**
-     * 下单 (微信下单)
+     * 创建渠道订单
      */
     @Transactional
-    public ResultContent order(OrderParam param) {
+    public ResultContent createChannelOrder(OrderParam param) {
         RechargeRecord record = rechargeRecordDao.findByOutTradeNo(param.getOutTradeNo());
         if (record == null) {
             return ResultContent.buildFail("充值订单:" + param.getOutTradeNo() + "不存在");
@@ -171,42 +161,36 @@ public class RechargeService {
             rechargeRecordDao.save(record);
             return ResultContent.buildFail("订单支付过期,已关闭");
         }
-
         if (StringUtil.isNullOrEmpty(param.getOpenid())) {
             return ResultContent.buildFail("缺少用户授权参数openId");
         }
-
-        // 根据appId 得到微信支付配置
-        ProjectWxPayParam wxPayParam = new ProjectWxPayParam();
-        wxPayParam.setAppId(record.getAppid());
-        ResultContent<WxPayConfigModel> paySetResult = paySettingFeignService.getProjectWxPayConfig(wxPayParam);
-        if (paySetResult.isFailed()) {
-            return ResultContent.buildFail("获取微信支付配置失败");
+        ExecuteMethodInfo executeMethodInfo = executeMethodInfoDao.findTopByPaymentType(record.getPaymentType());
+        if (ObjectUtils.isEmpty(executeMethodInfo)) {
+            return ResultContent.buildFail(String.format("", record.getPaymentType().getRemark()));
         }
+        SuperPayService service = (SuperPayService) ApplicationContextHolder.getContext().getBean(executeMethodInfo.getBeanName());
+        return service.createChannelOrder(param);
+    }
 
-        //调用微信支付--下单接口
-        PrepayRequest request = new PrepayRequest();
-        Amount amount = new Amount();
-        amount.setTotal(record.getTotal().intValue());
-        request.setAmount(amount);
-        request.setDescription(record.getDescription());
-        request.setOutTradeNo(param.getOutTradeNo());
-        //设置交易失效时间,15分钟
-        request.setTimeExpire(DateUtils.paresTime(record.getExpireTime(), DateUtils.patternWx));
-        Payer payer = new Payer();
-        payer.setOpenid(param.getOpenid());
-        request.setPayer(payer);
-        // 微信下单
-        ResultContent<PrePayModel> prepayResult = wxPaymentService.prepay(request, paySetResult.getContent());
-        if (prepayResult.isFailed()) {
-            return prepayResult;
+    /**
+     * 渠道支付回调
+     *
+     * @param request
+     * @param outTradeNo
+     */
+    public ResultContent payNotify(HttpServletRequest request, String outTradeNo) {
+        RechargeRecord record = rechargeRecordDao.findByOutTradeNo(outTradeNo);
+        if (record == null) {
+            return ResultContent.buildFail("充值订单:" + outTradeNo + "不存在");
         }
-        record.setOpenid(param.getOpenid());
-        record.setPrePayModel(prepayResult.getContent());
-        record.setRechargeState(RechargeState.NOTPAY);
-        record.setCommit(true);
-        rechargeRecordDao.save(record);
-        return prepayResult;
+        PayNotityParam param = new PayNotityParam();
+        param.setOutTradeNo(outTradeNo);
+        ExecuteMethodInfo executeMethodInfo = executeMethodInfoDao.findTopByPaymentType(record.getPaymentType());
+        if (ObjectUtils.isEmpty(executeMethodInfo)) {
+            return ResultContent.buildFail(String.format("", record.getPaymentType().getRemark()));
+        }
+        SuperPayService service = (SuperPayService) ApplicationContextHolder.getContext().getBean(executeMethodInfo.getBeanName());
+        return service.payNotify(request, param);
     }
 
     /**
@@ -304,17 +288,14 @@ public class RechargeService {
         return ResultContent.buildSuccess(toModel(record));
     }
 
-    /**
-     * 获取用户openid
-     */
-    @SneakyThrows
-    public String getOpenId(String jscode) {
-        MiniAppUserInfoVo miniAppUserInfo = wechatCUtil.getMiniAppUserInfo(jscode);
-        if (miniAppUserInfo == null || io.netty.util.internal.StringUtil.isNullOrEmpty(miniAppUserInfo.getOpenid())) {
-            log.info("无法获取用户信息");
-            return null;
+    private RechargeRecordModel toModel(RechargeRecord record) {
+        RechargeRecordModel model = new RechargeRecordModel();
+        if (record != null) {
+            BeanUtils.copyProperties(record, model, "total");
+            model.setTotal(record.getTotal().intValue());
+            model.setPrePayModel(record.getPrePayModel());
+            model.setUserInfo(record.getUserInfo());
         }
-        log.info("用户openid:{}", miniAppUserInfo.getOpenid());
-        return miniAppUserInfo.getOpenid();
+        return model;
     }
 }

+ 7 - 4
PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/common/ScanExecuteService.java

@@ -7,6 +7,7 @@ import com.zhongshu.payment.server.core.service.other.ScanSupport;
 import com.zhongshu.payment.server.core.utils.CommonUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.lang.reflect.Method;
@@ -23,6 +24,7 @@ import java.util.stream.Collectors;
 @Service
 public class ScanExecuteService {
 
+    @Autowired
     ExecuteMethodInfoDao executeMethodInfoDao;
 
     /**
@@ -38,10 +40,11 @@ public class ScanExecuteService {
             for (Class cls : standardClasses) {
                 String className = CommonUtil.toFirstCharLowerCase(cls.getSimpleName());
                 PayAnnotationService annotation = (PayAnnotationService) cls.getAnnotation(PayAnnotationService.class);
-                list.add(ExecuteMethodInfo.builder()
-                        .beanName(className)
-                        .paymentType(annotation.paymentType())
-                        .build());
+                ExecuteMethodInfo executeMethodInfo = new ExecuteMethodInfo();
+                executeMethodInfo.setBeanName(className);
+                executeMethodInfo.setPaymentType(annotation.paymentType());
+                executeMethodInfo.setRemark(annotation.remark());
+                list.add(executeMethodInfo);
             }
         }
         executeMethodInfoDao.saveAll(list);

+ 19 - 1
PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/pay/SuperPayService.java

@@ -4,12 +4,30 @@ import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest;
 import com.zhongshu.card.client.model.payment.paySetting.WxPayConfigModel;
 import com.zhongshu.payment.client.model.PrePayModel;
 import com.github.microservice.net.ResultContent;
+import com.zhongshu.payment.client.model.param.OrderParam;
+import com.zhongshu.payment.client.payModel.commn.PayNotityParam;
+import jakarta.servlet.http.HttpServletRequest;
 
 /**
  * @author TRX
  * @date 2024/8/15
  */
 public abstract class SuperPayService {
-    
 
+    /**
+     * 更加本地 创建渠道支付订单
+     *
+     * @param param
+     * @return
+     */
+    public abstract ResultContent createChannelOrder(OrderParam param);
+
+    /**
+     * 支付回调
+     *
+     * @param request
+     * @param param
+     * @return
+     */
+    public abstract ResultContent payNotify(HttpServletRequest request, PayNotityParam param);
 }

+ 15 - 1
PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/pay/impl/unionFrictionlessPay/UnionFrictionlessPayMainService.java

@@ -1,5 +1,10 @@
 package com.zhongshu.payment.server.core.service.pay.impl.unionFrictionlessPay;
 
+import com.github.microservice.net.ResultContent;
+import com.zhongshu.payment.client.model.param.OrderParam;
+import com.zhongshu.payment.client.payModel.commn.PayNotityParam;
+import com.zhongshu.payment.server.core.service.pay.SuperPayService;
+import jakarta.servlet.http.HttpServletRequest;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
@@ -11,7 +16,16 @@ import org.springframework.stereotype.Service;
  */
 @Slf4j
 @Service
-public class UnionFrictionlessPayMainService {
+public class UnionFrictionlessPayMainService extends SuperPayService {
 
+    public ResultContent createChannelOrder(OrderParam param) {
+
+        return ResultContent.buildSuccess();
+    }
+
+    @Override
+    public ResultContent payNotify(HttpServletRequest request, PayNotityParam param) {
+        return null;
+    }
 
 }

+ 1 - 1
PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/pay/impl/unionFrictionlessPay/UnionRequestService.java

@@ -8,7 +8,7 @@ import com.github.microservice.core.util.net.apache.ResponseModel;
 import com.github.microservice.models.requestModel.SuperResponseModel;
 import com.zhongshu.card.client.model.payment.RequestInfoSaveParam;
 import com.zhongshu.card.client.service.feign.RequestInfoFeignService;
-import com.zhongshu.card.client.utils.type.payment.RequestType;
+import com.zhongshu.card.client.type.payment.RequestType;
 import com.zhongshu.payment.client.payModel.unionFrictionlessPay.model.ApiConfParam;
 import com.zhongshu.payment.server.core.service.base.SuperService;
 import lombok.extern.slf4j.Slf4j;

+ 85 - 0
PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/pay/impl/wxPaymentV3/WxPaymentMainService.java

@@ -1,5 +1,6 @@
 package com.zhongshu.payment.server.core.service.pay.impl.wxPaymentV3;
 
+import com.github.microservice.models.type.PaymentType;
 import com.github.microservice.net.ResultContent;
 import com.wechat.pay.java.core.Config;
 import com.wechat.pay.java.core.RSAAutoCertificateConfig;
@@ -10,12 +11,22 @@ import com.wechat.pay.java.core.util.NonceUtil;
 import com.wechat.pay.java.core.util.PemUtil;
 import com.wechat.pay.java.service.payments.jsapi.model.*;
 import com.wechat.pay.java.service.payments.model.Transaction;
+import com.zhongshu.card.client.model.feign.ProjectWxPayParam;
 import com.zhongshu.card.client.model.payment.paySetting.WxPayConfigModel;
 import com.zhongshu.card.client.model.wechat.MiniAppUserInfoVo;
+import com.zhongshu.card.client.service.feign.ProjectPaySettingFeignService;
+import com.zhongshu.payment.client.annotation.PayAnnotationService;
 import com.zhongshu.payment.client.model.PrePayModel;
+import com.zhongshu.payment.client.model.param.OrderParam;
+import com.zhongshu.payment.client.payModel.commn.PayNotityParam;
+import com.zhongshu.payment.client.types.RechargeState;
+import com.zhongshu.payment.server.core.dao.RechargeRecordDao;
+import com.zhongshu.payment.server.core.domain.wallet.RechargeRecord;
 import com.zhongshu.payment.server.core.service.pay.SuperPayService;
+import com.zhongshu.payment.server.core.utils.DateUtils;
 import com.zhongshu.payment.server.core.utils.wx.WechatCUtil;
 import io.netty.util.internal.StringUtil;
+import jakarta.servlet.http.HttpServletRequest;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -35,13 +46,86 @@ import java.util.Base64;
  */
 @Slf4j
 @Service
+@PayAnnotationService(paymentType = PaymentType.WeChat, remark = "微信支付渠道")
 public class WxPaymentMainService extends SuperPayService {
 
     @Autowired
     WechatCUtil wechatCUtil;
 
+    @Autowired
+    RechargeRecordDao rechargeRecordDao;
+
+    @Autowired
+    ProjectPaySettingFeignService paySettingFeignService;
+
+    @Autowired
+    WxPayNotifyService wxPayNotifyService;
+
     public static com.wechat.pay.java.service.payments.jsapi.JsapiService service;
 
+
+    //--------------------------通用方法 start -------------------------
+
+    /**
+     * 创建渠道订单
+     *
+     * @param param
+     * @return
+     */
+    public ResultContent createChannelOrder(OrderParam param) {
+        String orderNo = param.getOutTradeNo();
+        RechargeRecord record = rechargeRecordDao.findByOutTradeNo(orderNo);
+        if (record == null) {
+            return ResultContent.buildFail("充值订单:" + orderNo + "不存在");
+        }
+
+        // 根据appId 得到微信支付配置
+        ProjectWxPayParam wxPayParam = new ProjectWxPayParam();
+        wxPayParam.setAppId(record.getAppid());
+        ResultContent<WxPayConfigModel> paySetResult = paySettingFeignService.getProjectWxPayConfig(wxPayParam);
+        if (paySetResult.isFailed()) {
+            return ResultContent.buildFail("获取微信支付配置失败");
+        }
+
+        //调用微信支付--下单接口
+        PrepayRequest request = new PrepayRequest();
+        Amount amount = new Amount();
+        amount.setTotal(record.getTotal().intValue());
+        request.setAmount(amount);
+        request.setDescription(record.getDescription());
+        request.setOutTradeNo(record.getOutTradeNo());
+
+        //设置交易失效时间,15分钟
+        request.setTimeExpire(DateUtils.paresTime(record.getExpireTime(), DateUtils.patternWx));
+        Payer payer = new Payer();
+        payer.setOpenid(param.getOpenid());
+        request.setPayer(payer);
+        // 微信下单
+        ResultContent<PrePayModel> prepayResult = prepay(request, paySetResult.getContent());
+        if (prepayResult.isFailed()) {
+            return prepayResult;
+        }
+        record.setOpenid(param.getOpenid());
+        record.setPrePayModel(prepayResult.getContent());
+        record.setRechargeState(RechargeState.NOTPAY);
+        record.setCommit(true);
+        rechargeRecordDao.save(record);
+        return prepayResult;
+    }
+
+    /**
+     * 支付成功
+     * @param request
+     * @param param
+     * @return
+     */
+    public ResultContent payNotify(HttpServletRequest request, PayNotityParam param) {
+        wxPayNotifyService.payNotify(request, param.getOutTradeNo());
+        return ResultContent.buildSuccess();
+    }
+
+    //----------------------------------------- 渠道方法 start------------------------
+
     // 初始化商户配置
     public static Config RSAAutoCertificateConfig(String mchId, String privateKeyPath, String mchSerialNo, String apiV3Key) {
         return new RSAAutoCertificateConfig.Builder()
@@ -176,6 +260,7 @@ public class WxPaymentMainService extends SuperPayService {
         }
     }
 
+
     /**
      * @return
      * @Author wjf

+ 1 - 1
PaymentServer/src/main/java/com/zhongshu/payment/server/core/utils/CommonUtil.java

@@ -6,7 +6,7 @@ import com.google.zxing.client.j2se.MatrixToImageWriter;
 import com.google.zxing.common.BitMatrix;
 import com.google.zxing.qrcode.QRCodeWriter;
 import com.zhongshu.card.client.utils.ITree;
-import com.zhongshu.card.client.utils.type.Sex;
+import com.zhongshu.card.client.type.Sex;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import net.sourceforge.pinyin4j.PinyinHelper;