Kaynağa Gözat

充值流程

wujiefeng 1 yıl önce
ebeveyn
işleme
88975c5220
24 değiştirilmiş dosya ile 720 ekleme ve 51 silme
  1. 2 0
      PaymentClient/src/main/java/com/zhongshu/payment/client/model/PrePayModel.java
  2. 30 0
      PaymentClient/src/main/java/com/zhongshu/payment/client/model/WalletFlowModel.java
  3. 5 2
      PaymentClient/src/main/java/com/zhongshu/payment/client/model/param/RechargeParam.java
  4. 50 0
      PaymentClient/src/main/java/com/zhongshu/payment/client/service/WalletFeignService.java
  5. 27 0
      PaymentClient/src/main/java/com/zhongshu/payment/client/types/TradeType.java
  6. 2 2
      PaymentClient/src/main/java/com/zhongshu/payment/client/types/WalletType.java
  7. 65 0
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/controller/RechargeController.java
  8. 34 0
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/controller/WalletController.java
  9. 22 0
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/controller/feign/WalletFeignController.java
  10. 14 8
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/controller/test/TestController.java
  11. 24 4
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/controller/wxPaymentV3/WechatPayV3Controller.java
  12. 4 1
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/dao/RechargeRecordDao.java
  13. 4 0
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/dao/WalletDao.java
  14. 11 0
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/dao/WalletFlowDao.java
  15. 15 0
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/dao/extend/RechargeRecordDaoExtend.java
  16. 18 0
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/dao/impl/RechargeRecordDaoImpl.java
  17. 8 0
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/domain/wallet/RechargeRecord.java
  18. 3 0
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/domain/wallet/Wallet.java
  19. 5 1
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/domain/wallet/WalletFlow.java
  20. 39 0
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/model/WechatPayV3Config.java
  21. 68 6
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/RechargeService.java
  22. 182 0
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/impl/WalletFeignServiceImpl.java
  23. 7 4
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/wallet/WalletService.java
  24. 81 23
      PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/wxPaymentV3/WxPaymentService.java

+ 2 - 0
PaymentClient/src/main/java/com/zhongshu/payment/client/model/PrePayModel.java

@@ -19,4 +19,6 @@ public class PrePayModel {
     private String signType;
 
     private String paySign;
+
+    private String prepayId;
 }

+ 30 - 0
PaymentClient/src/main/java/com/zhongshu/payment/client/model/WalletFlowModel.java

@@ -0,0 +1,30 @@
+package com.zhongshu.payment.client.model;
+
+import com.zhongshu.payment.client.types.TradeType;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author wjf
+ * @date 2024/7/26
+ */
+@Data
+public class WalletFlowModel {
+
+    @Schema(description = "钱包id")
+    private WalletModel walletModel;
+
+    @Schema(description = "订单号")
+    private String outTradeNo;
+
+    @Schema(description = "金额")
+    private BigDecimal total;
+
+    @Schema(description = "流水类型:充值/消费/提现")
+    private TradeType tradeType;
+
+    @Schema(description = "附加数据")
+    private String attach;
+}

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

@@ -14,6 +14,9 @@ public class RechargeParam {
     @Schema(name = "oid", description = "项目id",required = true, example = "oid")
     private String oid;
 
+    @Schema(name = "walletId", description = "钱包id",required = true, example = "oid")
+    private String walletId;
+
     @Schema(name = "paymentType", description = "支付方式", required = true, example = "WeChat")
     private PaymentType paymentType;
 
@@ -25,7 +28,7 @@ public class RechargeParam {
     @Schema(name = "amount", description = "订单金额",required = true, example = "{\"total\":100,\"currency\":\"CNY\"}")
     private Integer total;
 
-    @Schema(name = "jscode", description = "微信用户授权码", example = "123456")
-    private String jscode;
+//    @Schema(name = "jscode", description = "微信用户授权码", example = "123456")
+//    private String jscode;
 
 }

+ 50 - 0
PaymentClient/src/main/java/com/zhongshu/payment/client/service/WalletFeignService.java

@@ -0,0 +1,50 @@
+package com.zhongshu.payment.client.service;
+
+import com.zhongshu.payment.client.model.WalletFlowModel;
+import com.zhongshu.payment.client.model.WalletModel;
+import com.zhongshu.payment.client.ret.ResultContent;
+import com.zhongshu.payment.client.types.TradeType;
+import com.zhongshu.payment.client.types.WalletType;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author wjf
+ * @date 2024/7/26
+ */
+@FeignClient("paymentserver/manager/wallet")
+public interface WalletFeignService {
+
+    /** 获取钱包信息 */
+    @RequestMapping(value = "getWallet", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+    WalletModel getWallet(@RequestParam("oid") String oid, @RequestParam("walletType") WalletType walletType, @RequestParam("shopId") String shopId, @RequestParam ("userId")String userId);
+
+//    /** 消费/退款 */
+//    @RequestMapping(value = "tradeWallet", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+//    ResultContent tradeWallet(@RequestBody WalletFlowModel param);
+
+    /** 增加可用余额 */
+    @RequestMapping(value = "addAmount", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+    ResultContent addAmount(@RequestParam("walletId")String walletId, @RequestParam("total") BigDecimal total, @RequestParam("outTradeNo") String outTradeNo, @RequestParam("type") TradeType type, @RequestParam("total")String attach);
+
+    /** 增加总金额 */
+    @RequestMapping(value = "addTotalAmount", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+    ResultContent addTotalAmount(@RequestParam("walletId")String walletId, @RequestParam("total") BigDecimal total, @RequestParam("outTradeNo") String outTradeNo, @RequestParam("type") TradeType type, @RequestParam("total")String attach);
+
+    /** 减少可用余额 */
+    @RequestMapping(value = "subtractAmount", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+    ResultContent subtractAmount(@RequestParam("walletId")String walletId, @RequestParam("total") BigDecimal total, @RequestParam("outTradeNo") String outTradeNo, @RequestParam("type") TradeType type, @RequestParam("total")String attach);
+
+    /** 减少总金额 */
+    @RequestMapping(value = "subtractTotalAmount", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+    ResultContent subtractTotalAmount(@RequestParam("walletId")String walletId, @RequestParam("total") BigDecimal total, @RequestParam("outTradeNo") String outTradeNo, @RequestParam("type") TradeType type, @RequestParam("total")String attach);
+
+    /** 查询钱包流水 */
+    List<WalletFlowModel> queryWalletFlow(String walletId);
+}

+ 27 - 0
PaymentClient/src/main/java/com/zhongshu/payment/client/types/TradeType.java

@@ -0,0 +1,27 @@
+package com.zhongshu.payment.client.types;
+
+import lombok.Getter;
+
+/**
+ * 交易类型
+ * @author wjf
+ * @date 2024/7/26
+ */
+public enum TradeType {
+
+    Pay("消费"),
+//    INCOME("收入"),
+    Refund("退款"),
+    Frozen("冻结"),
+    CancelFrozen("取消冻结"),
+    Take("提现"),
+    InCome("充值")
+    ;
+
+    @Getter
+    private String remark;
+
+    TradeType(String remark) {
+        this.remark = remark;
+    }
+}

+ 2 - 2
PaymentClient/src/main/java/com/zhongshu/payment/client/types/WalletType.java

@@ -8,8 +8,8 @@ import lombok.Getter;
  */
 public enum WalletType {
 
-    Project("项目(商户)"),
-    SubProject("子项目(子商户)"),
+    Shop("商户"),
+    SubShop("子商户"),
     User("用户"),
     ;
 

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

@@ -0,0 +1,65 @@
+package com.zhongshu.payment.server.core.controller;
+
+import com.zhongshu.payment.client.model.param.OrderParam;
+import com.zhongshu.payment.client.model.param.RechargeParam;
+import com.zhongshu.payment.server.core.service.RechargeService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author wjf
+ * @date 2024/7/26
+ */
+@Slf4j
+@RestController
+@RequestMapping("/recharge")
+@Tag(name = "充值")
+public class RechargeController {
+
+    @Autowired
+    RechargeService rechargeService;
+
+    /** 创建充值订单 */
+    @Operation(summary = "创建充值订单", description = "创建充值订单")
+    @PostMapping(value = "create", consumes = MediaType.APPLICATION_JSON_VALUE)
+    public Object create(@RequestBody RechargeParam param){
+        return rechargeService.create(param);
+    }
+
+    /** 下单(获取调用微信支付参数) */
+    @Operation(summary = "下单(获取调用微信支付参数)", description = "下单(获取调用微信支付参数)")
+    @PostMapping(value = "order", consumes = MediaType.APPLICATION_JSON_VALUE)
+    public Object order(@RequestBody OrderParam param){
+        return rechargeService.order(param);
+    }
+
+    /** 查询订单支付状态 */
+    @Operation(summary = "查询订单支付状态", description = "查询订单支付状态")
+    @GetMapping(value = "queryTradeState")
+    public Object queryTradeState(@RequestParam("outTradeNo") String outTradeNo){
+        return rechargeService.queryTradeState(outTradeNo);
+    }
+
+    /** 关闭充值订单 */
+    @Operation(summary = "关闭充值订单", description = "关闭充值订单")
+    @PostMapping(value = "close")
+    public Object close(@RequestParam("outTradeNo") String outTradeNo){
+        return rechargeService.close(outTradeNo);
+    }
+
+    /** 查询充值订单列表 */
+    public Object queryListByWallet(String walletId){
+        return null;
+    }
+
+    /** 查询充值订单详情 */
+    @Operation(summary = "查询充值订单详情", description = "查询充值订单详情")
+    @PostMapping(value = "queryInfoById")
+    public Object queryInfoById(@RequestParam("outTradeNo") String id){
+        return rechargeService.queryInfoById(id);
+    }
+}

+ 34 - 0
PaymentServer/src/main/java/com/zhongshu/payment/server/core/controller/WalletController.java

@@ -0,0 +1,34 @@
+package com.zhongshu.payment.server.core.controller;
+
+import com.zhongshu.payment.client.types.WalletType;
+import com.zhongshu.payment.server.core.service.wallet.WalletService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author wjf
+ * @date 2024/7/26
+ */
+@Slf4j
+@RestController
+@RequestMapping("/wallet")
+@Tag(name = "钱包")
+public class WalletController {
+
+    @Autowired
+    WalletService walletService;
+
+    /** 获取钱包微信授权状态 */
+    @GetMapping("getWeChatAuthState")
+    public Object getWeChatAuthState(@RequestParam(name = "walletId") String walletId){
+        return walletService.getWeChatAuthState(walletId);
+    }
+
+    /** 获取(开通)当前用户钱包信息 */
+    @PostMapping("getWallet")
+    public Object getWalletByUser(String oid, WalletType walletType){
+        return walletService.getWalletByUser(oid, walletType, null);
+    }
+}

+ 22 - 0
PaymentServer/src/main/java/com/zhongshu/payment/server/core/controller/feign/WalletFeignController.java

@@ -0,0 +1,22 @@
+package com.zhongshu.payment.server.core.controller.feign;
+
+import com.zhongshu.payment.client.service.WalletFeignService;
+import lombok.experimental.Delegate;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * @author wjf
+ * @date 2024/7/26
+ */
+
+@RestController
+@RequestMapping("manager/wallet")
+public class WalletFeignController {
+
+    @Resource(name = "walletFeignServiceImpl")
+    @Delegate
+    private WalletFeignService walletFeignService;
+}

+ 14 - 8
PaymentServer/src/main/java/com/zhongshu/payment/server/core/controller/test/TestController.java

@@ -1,10 +1,7 @@
 package com.zhongshu.payment.server.core.controller.test;
 
-import com.zhongshu.card.client.ret.ResultContent;
-import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
 @RestController
@@ -12,11 +9,20 @@ import org.springframework.web.bind.annotation.RestController;
 @Tag(name = "测试")
 public class TestController {
 
-    @Operation(summary = "测试接口", description = "测试接口")
-    @RequestMapping(value = "text", method = {RequestMethod.GET})
-    public ResultContent text() {
-        return ResultContent.buildSuccess();
-    }
+//    @Resource
+//    ProjectPaySettingFeignService projectPaySettingService;
+//
+//    @Operation(summary = "测试接口", description = "测试接口")
+//    @RequestMapping(value = "text", method = {RequestMethod.GET})
+//    public ResultContent text() {
+//        ProjectWxPayParam param = new ProjectWxPayParam();
+//        param.setAppId(WxV3PayConfig.APP_ID);
+//        ResultContent<WxPayConfigModel> resultContent = projectPaySettingService.getProjectWxPayConfig(param);
+//        if (resultContent.isSuccess()){
+//            Log.info(resultContent.getContent());
+//        }
+//        return ResultContent.buildSuccess();
+//    }
 
 
 }

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

@@ -1,10 +1,16 @@
 package com.zhongshu.payment.server.core.controller.wxPaymentV3;
 
+import com.zhongshu.card.client.model.feign.ProjectWxPayParam;
+import com.zhongshu.card.client.model.payment.paySetting.WxPayConfigModel;
+import com.zhongshu.card.client.ret.ResultContent;
+import com.zhongshu.card.client.service.ProjectPaySettingFeignService;
 import com.zhongshu.payment.client.model.param.WxPrepayParam;
+import com.zhongshu.payment.server.core.dataConfig.WxV3PayConfig;
 import com.zhongshu.payment.server.core.service.wxPaymentV3.WxPaymentService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import jline.internal.Log;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
@@ -23,11 +29,25 @@ public class WechatPayV3Controller {
     @Autowired
     WxPaymentService wxPaymentService;
 
-    @Operation(summary = "下单")
+    @Autowired
+    ProjectPaySettingFeignService projectPaySettingService;
+
+    @Operation(summary = "测试接口", description = "测试接口")
+    @RequestMapping(value = "test", method = {RequestMethod.GET})
+    public ResultContent test() {
+        ProjectWxPayParam param = new ProjectWxPayParam();
+        param.setAppId(WxV3PayConfig.APP_ID);
+        ResultContent<WxPayConfigModel> resultContent = projectPaySettingService.getProjectWxPayConfig(param);
+        if (resultContent.isSuccess()){
+            Log.info(resultContent.getContent());
+        }
+        return ResultContent.buildSuccess();
+    }
+
+    @Operation(summary = "充值下单(测试)")
     @PostMapping(value = "transactions", consumes = MediaType.APPLICATION_JSON_VALUE)
-    public Object transactions(@RequestBody WxPrepayParam param){
-//        return wxPaymentService.prepay(param);
-        return null;
+    public Object testPrepay(@RequestBody WxPrepayParam param){
+        return wxPaymentService.testPrepay(param);
     }
 
     @Operation(summary = "获取openid")

+ 4 - 1
PaymentServer/src/main/java/com/zhongshu/payment/server/core/dao/RechargeRecordDao.java

@@ -1,13 +1,16 @@
 package com.zhongshu.payment.server.core.dao;
 
 import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
+import com.zhongshu.payment.server.core.dao.extend.RechargeRecordDaoExtend;
 import com.zhongshu.payment.server.core.domain.wallet.RechargeRecord;
 
 /**
  * @author wjf
  * @date 2024/7/25
  */
-public interface RechargeRecordDao extends MongoDao<RechargeRecord> {
+public interface RechargeRecordDao extends MongoDao<RechargeRecord>, RechargeRecordDaoExtend {
 
     RechargeRecord findByOutTradeNo(String outTradeNo);
+
+    RechargeRecord findTop1ById(String id);
 }

+ 4 - 0
PaymentServer/src/main/java/com/zhongshu/payment/server/core/dao/WalletDao.java

@@ -11,4 +11,8 @@ public interface WalletDao extends MongoDao<Wallet> {
 
     Wallet findByUserIdAndOid(String userId, String oid);
 
+    Wallet findByShopIdAndOid(String shopId, String oid);
+
+    Wallet findTop1ById(String id);
+
 }

+ 11 - 0
PaymentServer/src/main/java/com/zhongshu/payment/server/core/dao/WalletFlowDao.java

@@ -0,0 +1,11 @@
+package com.zhongshu.payment.server.core.dao;
+
+import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
+import com.zhongshu.payment.server.core.domain.wallet.WalletFlow;
+
+/**
+ * @author wjf
+ * @date 2024/7/26
+ */
+public interface WalletFlowDao extends MongoDao<WalletFlow> {
+}

+ 15 - 0
PaymentServer/src/main/java/com/zhongshu/payment/server/core/dao/extend/RechargeRecordDaoExtend.java

@@ -0,0 +1,15 @@
+package com.zhongshu.payment.server.core.dao.extend;
+
+import com.zhongshu.payment.server.core.domain.wallet.RechargeRecord;
+
+import java.awt.print.Pageable;
+import java.util.List;
+
+/**
+ * @author wjf
+ * @date 2024/7/26
+ */
+public interface RechargeRecordDaoExtend {
+
+    List<RechargeRecord> queryListByWallet(Pageable pageable);
+}

+ 18 - 0
PaymentServer/src/main/java/com/zhongshu/payment/server/core/dao/impl/RechargeRecordDaoImpl.java

@@ -0,0 +1,18 @@
+package com.zhongshu.payment.server.core.dao.impl;
+
+import com.zhongshu.payment.server.core.dao.extend.RechargeRecordDaoExtend;
+import com.zhongshu.payment.server.core.domain.wallet.RechargeRecord;
+
+import java.awt.print.Pageable;
+import java.util.List;
+
+/**
+ * @author wjf
+ * @date 2024/7/26
+ */
+public class RechargeRecordDaoImpl implements RechargeRecordDaoExtend {
+    @Override
+    public List<RechargeRecord> queryListByWallet(Pageable pageable) {
+        return null;
+    }
+}

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

@@ -1,6 +1,7 @@
 package com.zhongshu.payment.server.core.domain.wallet;
 
 import com.github.microservice.components.data.mongo.mongo.domain.SuperEntity;
+import com.zhongshu.payment.client.model.PrePayModel;
 import com.zhongshu.payment.client.types.PaymentType;
 import com.zhongshu.payment.client.types.RechargeState;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -41,4 +42,11 @@ public class RechargeRecord extends SuperEntity {
 
     @Schema(name = "tradeTime", description = "交易时间")
     private Long tradeTime;
+
+    @Schema(name = "prePayModel", description = "交易时间")
+    private PrePayModel prePayModel;
+
+    private Integer createMonth;
+
+    private Integer createYear;
 }

+ 3 - 0
PaymentServer/src/main/java/com/zhongshu/payment/server/core/domain/wallet/Wallet.java

@@ -31,6 +31,9 @@ public class Wallet extends SuperEntity {
     @Schema(description = "用户userId")
     private String userId;
 
+    @Schema(description = "商户Id")
+    private String shopId;
+
     @Schema(description = "可用金额,单位:分")
     private BigDecimal amount = BigDecimal.ZERO;
 

+ 5 - 1
PaymentServer/src/main/java/com/zhongshu/payment/server/core/domain/wallet/WalletFlow.java

@@ -1,6 +1,7 @@
 package com.zhongshu.payment.server.core.domain.wallet;
 
 import com.github.microservice.components.data.mongo.mongo.domain.SuperEntity;
+import com.zhongshu.payment.client.types.TradeType;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import org.springframework.data.mongodb.core.mapping.DBRef;
@@ -26,5 +27,8 @@ public class WalletFlow extends SuperEntity {
     private BigDecimal total;
 
     @Schema(description = "流水类型:充值/消费/提现")
-    private String walletFlow;
+    private TradeType tradeType;
+
+    @Schema(description = "附加数据")
+    private String attach;
 }

+ 39 - 0
PaymentServer/src/main/java/com/zhongshu/payment/server/core/model/WechatPayV3Config.java

@@ -0,0 +1,39 @@
+package com.zhongshu.payment.server.core.model;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author wjf
+ * @date 2024/7/26
+ */
+@Data
+public class WechatPayV3Config {
+
+    @Schema(description = "项目id")
+    private String projectOid;
+
+    @Schema(description = "appid")
+    private String appId;
+
+    @Schema(description = "商户证书序列号")
+    public String mchSerialNo;
+
+    @Schema(description = "商户id")
+    public String mchId;
+
+    @Schema(description = "API V3密钥")
+    public String apiV3Key;
+
+    @Schema(description = "认证类型")
+    public String authenticationType;
+
+    @Schema(description = "key文件地址类型,oss、local")
+    private String privateKeyType = "";
+
+    @Schema(description = "私钥地址")
+    public String privateKeyPath;
+
+    @Schema(description = "支付成功回调地址")
+    private String notifyUrl;
+}

+ 68 - 6
PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/RechargeService.java

@@ -6,7 +6,11 @@ import com.wechat.pay.java.service.payments.jsapi.model.Amount;
 import com.wechat.pay.java.service.payments.jsapi.model.Payer;
 import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest;
 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.ProjectPaySettingFeignService;
+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;
@@ -15,9 +19,11 @@ import com.zhongshu.payment.client.types.RechargeState;
 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.WxV3PayConfig;
 import com.zhongshu.payment.server.core.domain.wallet.RechargeRecord;
 import com.zhongshu.payment.server.core.domain.wallet.Wallet;
 import com.zhongshu.payment.server.core.domain.wechatPay.WxPayConfig;
+import com.zhongshu.payment.server.core.service.impl.WalletFeignServiceImpl;
 import com.zhongshu.payment.server.core.service.wxPaymentV3.WxPaymentService;
 import com.zhongshu.payment.server.core.utils.BeanUtils;
 import com.zhongshu.payment.server.core.utils.CommonUtil;
@@ -57,14 +63,21 @@ public class RechargeService {
     @Autowired
     RechargeRecordDao rechargeRecordDao;
 
+    @Autowired
+    WalletFeignServiceImpl walletFeignService;
+
+    @Autowired
+    ProjectPaySettingFeignService paySettingFeignService;
+
     /** 创建充值订单 */
     public Object create(RechargeParam param){
         String userId = authHelper.getCurrentUser().getUser();
-        Wallet userWallet = walletDao.findByUserIdAndOid(userId, param.getOid());
+        Wallet userWallet = walletDao.findTop1ById(param.getWalletId());
         //判断钱包是否初始化
         if (userWallet==null){
             return ResultContent.buildFail("用户钱包未开通");
         }
+
         RechargeRecord rechargeRecord = new RechargeRecord();
         BeanUtils.copyPropertiesWithoutNull(param, rechargeRecord);
         String outTradeNo = CommonUtil.UUID();
@@ -91,6 +104,9 @@ public class RechargeService {
         String userId = authHelper.getCurrentUser().getUser();
 
         RechargeRecord record = rechargeRecordDao.findByOutTradeNo(param.getOutTradeNo());
+        if (record==null){
+            return ResultContent.buildFail("充值订单:"+param.getOutTradeNo()+"不存在");
+        }
         Wallet userWallet = walletDao.findByUserIdAndOid(userId, record.getOid());
         String openId;
         if (StringUtil.notNullNorEmpty(param.getJscode())){
@@ -121,12 +137,31 @@ public class RechargeService {
         Payer payer = new Payer();
         payer.setOpenid(openId);
         request.setPayer(payer);
-        return wxPaymentService.prepay(request);
+
+        ProjectWxPayParam wxPayParam = new ProjectWxPayParam();
+        wxPayParam.setAppId(WxV3PayConfig.APP_ID);
+        com.zhongshu.card.client.ret.ResultContent<WxPayConfigModel> paySetResult = paySettingFeignService.getProjectWxPayConfig(wxPayParam);
+        if (paySetResult.isFailed()){
+            return ResultContent.buildFail("获取微信支付配置失败");
+        }
+        ResultContent<PrePayModel> prepayResult = wxPaymentService.prepay(request, paySetResult.getContent());
+        if (prepayResult.isFailed()){
+            return prepayResult;
+        }
+        record.setPrePayModel(prepayResult.getContent());
+        rechargeRecordDao.save(record);
+        return prepayResult;
     }
 
     /** 查询订单支付状态 */
     public Object queryTradeState(String outTradeNo){
-        ResultContent<Transaction> queryResult = wxPaymentService.queryOrderByOutTradeNo(outTradeNo);
+        ProjectWxPayParam wxPayParam = new ProjectWxPayParam();
+        wxPayParam.setAppId(WxV3PayConfig.APP_ID);
+        com.zhongshu.card.client.ret.ResultContent<WxPayConfigModel> paySetResult = paySettingFeignService.getProjectWxPayConfig(wxPayParam);
+        if (paySetResult.isFailed()){
+            return ResultContent.buildFail("获取微信支付配置失败");
+        }
+        ResultContent<Transaction> queryResult = wxPaymentService.queryOrderByOutTradeNo(outTradeNo, paySetResult.getContent());
         if (queryResult.isSuccess()){
             return ResultContent.buildSuccess(queryResult.getContent().getTradeState().name());
         }
@@ -134,7 +169,7 @@ public class RechargeService {
     }
 
     /** 得到支付结果后处理 */
-    public void update(Transaction transaction){
+    private void update(Transaction transaction){
         RechargeRecord record = rechargeRecordDao.findByOutTradeNo(transaction.getOutTradeNo());
         if (record == null){
             log.error("微信支付通知回调错误:找不到订单outTradeNo:{}", transaction.getOutTradeNo());
@@ -153,8 +188,35 @@ public class RechargeService {
     }
 
     /** 关闭充值订单 */
-    public Object closer(String outTradeNo){
-        return wxPaymentService.closeOrder(outTradeNo);
+    public Object close(String outTradeNo){
+        ProjectWxPayParam wxPayParam = new ProjectWxPayParam();
+        wxPayParam.setAppId(WxV3PayConfig.APP_ID);
+        com.zhongshu.card.client.ret.ResultContent<WxPayConfigModel> paySetResult = paySettingFeignService.getProjectWxPayConfig(wxPayParam);
+        if (paySetResult.isFailed()){
+            return ResultContent.buildFail("获取微信支付配置失败");
+        }
+        RechargeRecord record = rechargeRecordDao.findByOutTradeNo(outTradeNo);
+        if (record==null){
+            return ResultContent.buildFail("充值订单:"+outTradeNo+"不存在");
+        }
+        record.setRechargeState(RechargeState.CLOSED);
+        rechargeRecordDao.save(record);
+        return wxPaymentService.closeOrder(outTradeNo, paySetResult.getContent());
+    }
+
+
+    /** 查询充值订单列表 */
+    public Object queryListByWallet(String walletId){
+
+
+
+        return null;
+    }
+
+    /** 查询充值订单详情 */
+    public Object queryInfoById(String id){
+        RechargeRecord record = rechargeRecordDao.findByOutTradeNo(id);
+        return ResultContent.buildSuccess(toModel(record));
     }
 
     /** 获取用户openid */

+ 182 - 0
PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/impl/WalletFeignServiceImpl.java

@@ -0,0 +1,182 @@
+package com.zhongshu.payment.server.core.service.impl;
+
+import com.zhongshu.payment.client.model.WalletFlowModel;
+import com.zhongshu.payment.client.model.WalletModel;
+import com.zhongshu.payment.client.ret.ResultContent;
+import com.zhongshu.payment.client.service.WalletFeignService;
+import com.zhongshu.payment.client.types.DataState;
+import com.zhongshu.payment.client.types.TradeType;
+import com.zhongshu.payment.client.types.WalletType;
+import com.zhongshu.payment.server.core.dao.WalletDao;
+import com.zhongshu.payment.server.core.dao.WalletFlowDao;
+import com.zhongshu.payment.server.core.domain.wallet.Wallet;
+import com.zhongshu.payment.server.core.domain.wallet.WalletFlow;
+import com.zhongshu.payment.server.core.utils.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author wjf
+ * @date 2024/7/26
+ */
+@Service
+public class WalletFeignServiceImpl implements WalletFeignService {
+
+    @Autowired
+    WalletDao walletDao;
+
+    @Autowired
+    WalletFlowDao walletFlowDao;
+
+
+    @Override
+    public WalletModel getWallet(String oid, WalletType walletType, String shopId, String userId) {
+        Wallet wallet = null;
+        if (walletType.equals(WalletType.User)){
+            wallet = walletDao.findByUserIdAndOid(userId, oid);
+        }
+        if (walletType.equals(WalletType.Shop)){
+            wallet = walletDao.findByShopIdAndOid(shopId, oid);
+        }
+        if (wallet!=null){
+            return toModel(wallet);
+        }
+        wallet = new Wallet();
+        wallet.setOid(oid);
+        wallet.setAmount(BigDecimal.ZERO);
+        wallet.setAmount(BigDecimal.ZERO);
+        wallet.setDataState(DataState.Enable);
+        wallet.setWalletType(walletType);
+        wallet.setShopId(shopId);
+        wallet.setUserId(userId);
+        walletDao.save(wallet);
+        return toModel(wallet);
+    }
+
+    @Override
+    public ResultContent addAmount(String walletId, BigDecimal total, String outTradeNo, TradeType type, String attach) {
+        Wallet wallet = walletDao.findTop1ById(walletId);
+        if (wallet==null){
+            return ResultContent.buildFail("钱包未开通");
+        }
+        wallet.setAmount(wallet.getAmount().add(total));
+        walletDao.save(wallet);
+        createWalletFlow(walletId, total, outTradeNo, type, attach);
+        return ResultContent.buildSuccess();
+    }
+
+    @Override
+    public ResultContent addTotalAmount(String walletId, BigDecimal total, String outTradeNo, TradeType type, String attach) {
+        Wallet wallet = walletDao.findTop1ById(walletId);
+        if (wallet==null){
+            return ResultContent.buildFail("钱包未开通");
+        }
+        wallet.setTotalAmount(wallet.getTotalAmount().add(total));
+        walletDao.save(wallet);
+        createWalletFlow(walletId, total, outTradeNo, type, attach);
+        return ResultContent.buildSuccess();
+    }
+
+    @Override
+    public ResultContent subtractAmount(String walletId, BigDecimal total, String outTradeNo, TradeType type, String attach) {
+        Wallet wallet = walletDao.findTop1ById(walletId);
+        if (wallet==null){
+            return ResultContent.buildFail("钱包未开通");
+        }
+        if (wallet.getAmount().compareTo(total) < 0 ){
+            return ResultContent.buildFail("可用余额不足");
+        }
+        wallet.setAmount(wallet.getAmount().subtract(total));
+        walletDao.save(wallet);
+        createWalletFlow(walletId, total, outTradeNo, type, attach);
+        return ResultContent.buildSuccess();
+    }
+
+    @Override
+    public ResultContent subtractTotalAmount(String walletId, BigDecimal total, String outTradeNo, TradeType type, String attach) {
+        Wallet wallet = walletDao.findTop1ById(walletId);
+        if (wallet==null){
+            return ResultContent.buildFail("钱包未开通");
+        }
+        if (wallet.getTotalAmount().compareTo(total) < 0 ){
+            return ResultContent.buildFail("总额不足");
+        }
+        wallet.setTotalAmount(wallet.getTotalAmount().subtract(total));
+        walletDao.save(wallet);
+        createWalletFlow(walletId, total, outTradeNo, type, attach);
+        return ResultContent.buildSuccess();
+    }
+
+    @Override
+    public List<WalletFlowModel> queryWalletFlow(String walletId) {
+        return null;
+    }
+
+    private WalletFlow createWalletFlow(String walletId, BigDecimal total, String outTradeNo, TradeType type, String attach){
+        WalletFlow walletFlow = new WalletFlow();
+        Wallet wallet = new Wallet();
+        wallet.setId(walletId);
+        walletFlow.setWallet(wallet);
+        walletFlow.setTotal(total);
+        walletFlow.setOutTradeNo(outTradeNo);
+        walletFlow.setTradeType(type);
+        walletFlow.setAttach(attach);
+        return walletFlowDao.save(walletFlow);
+    }
+
+//    public ResultContent tradeWallet(WalletFlowModel param) {
+//        Wallet shopWallet = walletDao.findByShopIdAndOid(param.getShopId(), param.getOid());
+//        Wallet userWallet = walletDao.findByUserIdAndOid(param.getUserId(), param.getOid());
+//        if (param.getTradeType().equals(TradeType.Pay)){//消费
+//            //商户钱包 可用+  总额+
+//            shopWallet.setAmount(shopWallet.getAmount().add(param.getTotal()));
+//            shopWallet.setTotalAmount(shopWallet.getTotalAmount().add(param.getTotal());
+//            //用户钱包 可用-  总额-
+//            //判断用户可用余额是否足够
+//            if (userWallet.getAmount().compareTo(param.getTotal()) < 0){
+//                return ResultContent.buildFail("可用余额不足");
+//            }
+//            userWallet.setAmount(userWallet.getAmount().subtract(param.getTotal()));
+//            userWallet.setTotalAmount(userWallet.getAmount().subtract(param.getTotal()));
+//        }
+//
+//        if (param.getTradeType().equals(TradeType.Refund)){//退款
+//            if (shopWallet.getAmount().compareTo(param.getTotal()) < 0 ){
+//                return ResultContent.buildFail("可用余额不足");
+//            }
+//            shopWallet.setAmount(shopWallet.getAmount().subtract(param.getTotal()));
+//            shopWallet.setTotalAmount(shopWallet.getTotalAmount().subtract(param.getTotal());
+//
+//            userWallet.setAmount(userWallet.getAmount().add(param.getTotal()));
+//            userWallet.setTotalAmount(userWallet.getAmount().add(param.getTotal()));
+//        }
+//
+//        if (param.getTradeType().equals(TradeType.Frozen)){//提现发起(冻结)
+//            if (shopWallet.getAmount().compareTo(param.getTotal()) < 0 ){
+//                return ResultContent.buildFail("可用余额不足");
+//            }
+//            shopWallet.setAmount(shopWallet.getAmount().subtract(param.getTotal()));
+//        }
+//
+//        if (param.getTradeType().equals(TradeType.CancelFrozen)){//取消冻结
+//            shopWallet.setAmount(shopWallet.getAmount().add(param.getTotal()));
+//        }
+//
+//        if (param.getTradeType().equals(TradeType.Take)){//提现
+//            shopWallet.setTotalAmount(shopWallet.getTotalAmount().subtract(param.getTotal()));
+//        }
+//        walletDao.saveAll(List.of(shopWallet, userWallet));
+//        return ResultContent.buildSuccess();
+//    }
+
+    private WalletModel toModel(Wallet wallet){
+        WalletModel model = new WalletModel();
+        if (wallet!=null){
+            BeanUtils.copyPropertiesWithoutNull(wallet, model);
+        }
+        return model;
+    }
+}

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

@@ -31,18 +31,21 @@ public class WalletService {
     @Autowired
     AuthHelper authHelper;
 
-    /** 获取用户微信授权状态 */
-    public Object getWeChatAuthState(String oid){
+    /** 获取钱包微信授权状态 */
+    public Object getWeChatAuthState(String walletId){
         String userId = authHelper.getCurrentUser().getUser();
-        Wallet wallet = walletDao.findByUserIdAndOid(userId, oid);
+        Wallet wallet = walletDao.findTop1ById(walletId);
         if (wallet==null){
+            return ResultContent.buildFail("钱包未开通");
+        }
+        if (StringUtil.isNullOrEmpty(wallet.getOpenid())){
             return ResultContent.build(ResultState.NOT_WECHAT_AUTH);
         }
         return ResultContent.buildSuccess();
     }
 
     /** 查询用户钱包 */
-    public Object getWallet(String oid, WalletType walletType, String userId){
+    public Object getWalletByUser(String oid, WalletType walletType, String userId){
         if (StringUtil.isNullOrEmpty(userId)){
             userId = authHelper.getCurrentUser().getUser();
         }

+ 81 - 23
PaymentServer/src/main/java/com/zhongshu/payment/server/core/service/wxPaymentV3/WxPaymentService.java

@@ -9,8 +9,10 @@ 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.payment.paySetting.WxPayConfigModel;
 import com.zhongshu.card.client.model.wechat.MiniAppUserInfoVo;
 import com.zhongshu.payment.client.model.PrePayModel;
+import com.zhongshu.payment.client.model.param.WxPrepayParam;
 import com.zhongshu.payment.client.ret.ResultContent;
 import com.zhongshu.payment.server.core.dataConfig.WxV3PayConfig;
 import com.zhongshu.payment.server.core.service.base.SuperService;
@@ -41,13 +43,13 @@ public class WxPaymentService extends SuperService {
     public static com.wechat.pay.java.service.payments.jsapi.JsapiService service;
 
     // 初始化商户配置
-    public static Config RSAAutoCertificateConfig(){
+    public static Config RSAAutoCertificateConfig(String mchId, String privateKeyPath, String mchSerialNo, String apiV3Key){
         return new RSAAutoCertificateConfig.Builder()
-                .merchantId(WxV3PayConfig.Mch_ID)
+                .merchantId(mchId)
                 // 使用 com.wechat.pay.java.core.util 中的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名
-                .privateKeyFromPath(WxV3PayConfig.privateKeyPath)
-                .merchantSerialNumber(WxV3PayConfig.mchSerialNo)
-                .apiV3Key(WxV3PayConfig.apiV3Key)
+                .privateKeyFromPath(privateKeyPath)
+                .merchantSerialNumber(mchSerialNo)
+                .apiV3Key(apiV3Key)
                 .build();
     }
 
@@ -73,29 +75,24 @@ public class WxPaymentService extends SuperService {
         return miniAppUserInfo.getOpenid();
     }
 
-    /** @Author wjf
-     * @Description //TODO 预支付下单
-     * @Date 2024/7/24
-     * @Param
-     * @return
-    **/
-    public ResultContent<PrePayModel> prepay(PrepayRequest request){
+    public ResultContent<PrePayModel> testPrepay(WxPrepayParam param){
 
 
         // 初始化商户配置
-        Config config = RSAAutoCertificateConfig();
+        Config config = RSAAutoCertificateConfig(WxV3PayConfig.Mch_ID, WxV3PayConfig.privateKeyPath, WxV3PayConfig.mchSerialNo, WxV3PayConfig.apiV3Key);
         // 初始化服务
         service = new com.wechat.pay.java.service.payments.jsapi.JsapiService.Builder().config(config).build();
         // ... 调用接口
         try {
             // 调用request.setXxx(val)设置所需参数,具体参数可见Request定义
+            PrepayRequest request = new PrepayRequest();
             request.setAppid("wx92ae04fb0f325887");
             request.setMchid("1680033836");
             request.setDescription("充值服务");
-            request.setOutTradeNo("A1111111");
-            request.setNotifyUrl("http://8.137.120.225:8080/paymentserver-wjf/wechat/v3/notify/payNotify");
+            request.setOutTradeNo("A111112");
+            request.setNotifyUrl("https://api.dev.qk.zonelife.cn/paymentserver-wjf/wechat/v3/notify/payNotify");
             Amount amount = new Amount();
-            amount.setTotal(10);
+            amount.setTotal(1);
             amount.setCurrency("CNY");
             request.setAmount(amount);
             Payer payer = new Payer();
@@ -133,14 +130,69 @@ public class WxPaymentService extends SuperService {
         }
     }
 
+    /** @Author wjf
+     * @Description //TODO 预支付下单
+     * @Date 2024/7/24
+     * @Param
+     * @return
+    **/
+    public ResultContent<PrePayModel> prepay(PrepayRequest request, WxPayConfigModel configModel){
+
+        String privateKeyPath = Thread.currentThread().getContextClassLoader().getResource("").getPath() + configModel.getPrivateKeyPath();
+
+        // 初始化商户配置
+        Config config = RSAAutoCertificateConfig(configModel.getMchId(), privateKeyPath, configModel.getMchSerialNo(), configModel.getApiV3Key());
+        // 初始化服务
+        service = new com.wechat.pay.java.service.payments.jsapi.JsapiService.Builder().config(config).build();
+        // ... 调用接口
+        try {
+            // 调用request.setXxx(val)设置所需参数,具体参数可见Request定义
+            request.setAppid(configModel.getAppId());
+            request.setMchid(configModel.getMchId());
+            request.setNotifyUrl(configModel.getNotifyUrl());
+            // 调用接口
+            PrepayResponse response = service.prepay(request);
+
+            PrePayModel prePayModel = new PrePayModel();
+            prePayModel.setNonceStr(NonceUtil.createNonce(10));
+            prePayModel.setPackAge("prepay_id=" + response.getPrepayId());
+            prePayModel.setSignType("RSA");
+            long timeStamp = System.currentTimeMillis() / 1000;
+            prePayModel.setTimeStamp(Long.toString(timeStamp));
+
+            String sign = buildMessage(WxV3PayConfig.APP_ID, timeStamp, prePayModel.getNonceStr(), prePayModel.getPackAge());
+            String signature = sign(privateKeyPath, sign.getBytes("utf-8"));
+            prePayModel.setPaySign(signature);
+            return ResultContent.buildContent(prePayModel);
+        } catch (HttpException e) { // 发送HTTP请求失败
+            // 调用e.getHttpRequest()获取请求打印日志或上报监控,更多方法见HttpException定义
+            log.info("请求失败1:{}", e.getHttpRequest());
+            return ResultContent.buildFail("发送HTTP请求失败");
+        } catch (ServiceException e) { // 服务返回状态小于200或大于等于300,例如500
+            // 调用e.getResponseBody()获取返回体打印日志或上报监控,更多方法见ServiceException定义
+            log.info("请求失败2:{}", e.getResponseBody());
+            return ResultContent.buildFail(e.getErrorMessage());
+        } catch (MalformedMessageException e) { // 服务返回成功,返回体类型不合法,或者解析返回体失败
+            // 调用e.getMessage()获取信息打印日志或上报监控,更多方法见MalformedMessageException定义
+            log.info("请求失败3:{}", e.getMessage());
+            return ResultContent.buildFail("服务返回成功,返回体类型不合法,或者解析返回体失败");
+        } catch (UnsupportedEncodingException e) {
+            log.info("请求失败4:{}", e.getMessage());
+            return ResultContent.buildFail("编码错误");
+        }
+    }
+
     /** @Author wjf
      * @Description //TODO 关闭订单
      * @Date 2024/7/24
      * @Param 商户订单号 outTradeNo
      * @return
     **/
-    public ResultContent closeOrder(String outTradeNo){
-        Config config = RSAAutoCertificateConfig();
+    public ResultContent closeOrder(String outTradeNo, WxPayConfigModel configModel){
+        String privateKeyPath = Thread.currentThread().getContextClassLoader().getResource("").getPath() + configModel.getPrivateKeyPath();
+
+        // 初始化商户配置
+        Config config = RSAAutoCertificateConfig(configModel.getMchId(), privateKeyPath, configModel.getMchSerialNo(), configModel.getApiV3Key());
         // 初始化服务
         service = new com.wechat.pay.java.service.payments.jsapi.JsapiService.Builder().config(config).build();
         try {
@@ -171,8 +223,11 @@ public class WxPaymentService extends SuperService {
      * @Param 商户订单号 outTradeNo
      * @return
      **/
-    public ResultContent<Transaction> queryOrderByOutTradeNo(String outTradeNo){
-        Config config = RSAAutoCertificateConfig();
+    public ResultContent<Transaction> queryOrderByOutTradeNo(String outTradeNo, WxPayConfigModel configModel){
+        String privateKeyPath = Thread.currentThread().getContextClassLoader().getResource("").getPath() + configModel.getPrivateKeyPath();
+
+        // 初始化商户配置
+        Config config = RSAAutoCertificateConfig(configModel.getMchId(), privateKeyPath, configModel.getMchSerialNo(), configModel.getApiV3Key());
         // 初始化服务
         service = new com.wechat.pay.java.service.payments.jsapi.JsapiService.Builder().config(config).build();
         try {
@@ -203,8 +258,11 @@ public class WxPaymentService extends SuperService {
      * @Param 商户订单号 outTradeNo
      * @return
      **/
-    public ResultContent queryOrderById(String transactionId){
-        Config config = RSAAutoCertificateConfig();
+    public ResultContent queryOrderById(String transactionId, WxPayConfigModel configModel){
+        String privateKeyPath = Thread.currentThread().getContextClassLoader().getResource("").getPath() + configModel.getPrivateKeyPath();
+
+        // 初始化商户配置
+        Config config = RSAAutoCertificateConfig(configModel.getMchId(), privateKeyPath, configModel.getMchSerialNo(), configModel.getApiV3Key());
         // 初始化服务
         service = new com.wechat.pay.java.service.payments.jsapi.JsapiService.Builder().config(config).build();
         try {
@@ -234,7 +292,7 @@ public class WxPaymentService extends SuperService {
     @SneakyThrows
     public String sign(String privateKeyPath, byte[] message){
         Signature sign = Signature.getInstance("SHA256withRSA");
-        PrivateKey privateKey = PemUtil.loadPrivateKeyFromPath(WxV3PayConfig.privateKeyPath);
+        PrivateKey privateKey = PemUtil.loadPrivateKeyFromPath(privateKeyPath);
         sign.initSign(privateKey);
         sign.update(message);
         return Base64.getEncoder().encodeToString(sign.sign());