瀏覽代碼

支付扩展多应用支持

liweifan 3 年之前
父節點
當前提交
fd56cc07e8
共有 26 個文件被更改,包括 332 次插入187 次删除
  1. 0 36
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/PlatformEnum.java
  2. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderPayReq.java
  3. 12 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderPayment.java
  4. 5 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderPaymentServiceImpl.java
  5. 3 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java
  6. 8 18
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  7. 8 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml
  8. 9 5
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/PaymentController.java
  9. 2 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java
  10. 2 5
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/adapay/AdapayTemplate.java
  11. 3 1
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/PaymentTemplate.java
  12. 32 0
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/enums/PaymentClientEnum.java
  13. 15 1
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/Base.java
  14. 4 2
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/ClosePayment.java
  15. 3 2
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/OpenAuth.java
  16. 4 3
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/Payment.java
  17. 3 2
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/RefundBill.java
  18. 6 2
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/PaymentClient.java
  19. 23 10
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/SysConfigPaymentService.java
  20. 3 2
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/impl/PaymentClientImpl.java
  21. 13 3
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/impl/SysConfigPaymentServiceImpl.java
  22. 23 16
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/ali/OriginalAliAppTemplate.java
  23. 24 8
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/ali/config/AlipayConfiguration.java
  24. 67 22
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/OriginalWxAppTemplate.java
  25. 35 43
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/config/WxpayConfiguration.java
  26. 14 2
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/constant/WxpayConstant.java

+ 0 - 36
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/PlatformEnum.java

@@ -1,36 +0,0 @@
-package com.yonge.cooleshow.common.enums;
-
-import com.yonge.toolset.base.enums.BaseEnum;
-
-/**
- * Description
- *
- * @author liujunchi
- * @date 2022-04-24
- */
-public enum PlatformEnum implements BaseEnum<String,PlatformEnum> {
-
-    STUDENT("STUDENT","STUDENT"),
-    TEACHER("TEACHER","TEACHER");
-
-    private String code;
-    private String msg;
-
-    PlatformEnum(String code,String msg) {
-        this.code = code;
-        this.msg = msg;
-    }
-
-    @Override
-    public String getCode() {
-        return this.code;
-    }
-
-    public String getMsg() {
-        return msg;
-    }
-
-    public void setMsg(String msg) {
-        this.msg = msg;
-    }
-}

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderPayReq.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.dto.req;
 
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -32,6 +33,8 @@ public class OrderPayReq {
     private Long userId;
     @ApiModelProperty(value = "用户ip ",hidden = true)
     private String ipAddress;
+    @ApiModelProperty(value = "付款客户端 ",hidden = true)
+    private PaymentClientEnum paymentClient;
 
     public String getOrderNo() {
         return orderNo;
@@ -88,4 +91,12 @@ public class OrderPayReq {
     public void setBuyerId(String buyerId) {
         this.buyerId = buyerId;
     }
+
+    public PaymentClientEnum getPaymentClient() {
+        return paymentClient;
+    }
+
+    public void setPaymentClient(PaymentClientEnum paymentClient) {
+        this.paymentClient = paymentClient;
+    }
 }

+ 12 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserOrderPayment.java

@@ -28,7 +28,10 @@ public class UserOrderPayment implements Serializable {
     @ApiModelProperty("服务提供方: ORIGINAL 微信支付宝 ADAPAY 汇付")
     @TableField(value = "open_type_")
     private OpenEnum openType;
-    @ApiModelProperty("支付渠道:  alipay 支付宝  wx_lite 微信 ")
+    @ApiModelProperty("服务提供方: STUDENT 微信支付宝 TEACHER 汇付")
+    @TableField(value = "payment_client_")
+    private String paymentClient;
+    @ApiModelProperty("支付渠道: alipay 支付宝  wx_lite 微信 ")
     @TableField(value = "pay_channel_")
     private PayChannelEnum payChannel;
     @ApiModelProperty("订单号 ")
@@ -215,4 +218,12 @@ public class UserOrderPayment implements Serializable {
     public void setUpdateTime(Date updateTime) {
         this.updateTime = updateTime;
     }
+
+    public String getPaymentClient() {
+        return paymentClient;
+    }
+
+    public void setPaymentClient(String paymentClient) {
+        this.paymentClient = paymentClient;
+    }
 }

+ 5 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderPaymentServiceImpl.java

@@ -15,6 +15,7 @@ import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import com.yonge.toolset.payment.base.model.*;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
@@ -94,7 +95,8 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
         //发送支付关单请求
         if (!StringUtil.isEmpty(orderPayment.getTransNo())
                 || !StringUtil.isEmpty(orderPayment.getPaymentNo())) {
-            ClosePayment param = new ClosePayment(orderPayment.getOpenType(), orderPayment.getPayChannel());
+            ClosePayment param = new ClosePayment(orderPayment.getOpenType(),
+                    PaymentClientEnum.valueOf(orderPayment.getPaymentClient()), orderPayment.getPayChannel());
             param.setId(orderPayment.getTransNo());
             param.setPaymentNo(orderPayment.getPaymentNo());
             param.setReason(reason);
@@ -127,7 +129,7 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
 
         //构建汇付统一下单请求
         OpenEnum openType = OpenEnum.valueOf(paymentProperties.getOpenType());
-        Payment payment = new Payment(openType, payReq.getPayChannel());
+        Payment payment = new Payment(openType, payReq.getPaymentClient(), payReq.getPayChannel());
         payment.setPaymentNo(paymentNo.toString());
         payment.setOrderNo(payReq.getOrderNo());
         payment.setOrderTitle(detail.getOrderName());
@@ -223,6 +225,7 @@ public class UserOrderPaymentServiceImpl extends ServiceImpl<UserOrderPaymentDao
     private UserOrderPayment insertOrderPayment(Payment payment) {
         UserOrderPayment orderPayment = new UserOrderPayment();
         orderPayment.setOpenType(payment.getOpenType());
+        orderPayment.setPaymentClient(payment.getPaymentClient().getCode());
         orderPayment.setPayChannel(payment.getPayChannel());
         orderPayment.setOrderNo(payment.getOrderNo());
         orderPayment.setPaymentNo(payment.getPaymentNo());

+ 3 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java

@@ -25,6 +25,7 @@ import com.yonge.cooleshow.biz.dal.vo.res.RefundCreateRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.service.IdGeneratorService;
 import com.yonge.toolset.base.result.BaseResult;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import com.yonge.toolset.payment.base.model.RefundBill;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
@@ -290,7 +291,8 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         //单号生成
         Long billNo = idGeneratorService.generatorId("billNo");
 
-        RefundBill refundBill = new RefundBill(payment.getOpenType(), payment.getPayChannel());
+        RefundBill refundBill = new RefundBill(payment.getOpenType(),
+                PaymentClientEnum.valueOf(payment.getPaymentClient()), payment.getPayChannel());
         refundBill.setId(payment.getTransNo());
         refundBill.setRefundNo(billNo.toString());
         refundBill.setRefundAmt(orderRefund.getActualAmount());

+ 8 - 18
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java

@@ -19,6 +19,7 @@ import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.cooleshow.common.service.IdGeneratorService;
 import com.yonge.toolset.base.result.BaseResult;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import com.yonge.toolset.payment.base.model.Payment;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
@@ -182,20 +183,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 && !OrderStatusEnum.PAYING.equals(detail.getStatus())) {
             return HttpResponseResult.failed("订单已关闭");
         }
-
-        if (!StringUtil.isEmpty(detail.getTransNo())) {
-            Payment param = new Payment(detail.getOpenType(), detail.getPayChannel());
-            param.setId(detail.getTransNo());
-            param.setPaymentNo(detail.getPaymentNo());
-            BaseResult<Payment> res = paymentClient.queryPayment(param);
-            //支付成功
-            if (res.getStatus() && TradeStatusEnum.succeeded.getCode().equals(res.getData().getStatus())) {
-                orderSuccess(detail);
-                return HttpResponseResult.failed("订单已经交易完成");
-            }
-            //关闭订单付款单
-            orderPaymentService.closePaymentAndReqOpen(payReq.getOrderNo(), StringUtil.isEmpty(payReq.getReason()) ? "用户取消订单" : payReq.getReason());
-        }
+        orderPaymentService.closePaymentAndReqOpen(payReq.getOrderNo(),"用户取消订单");
         //关闭订单
         doOrderCancel(detail, OrderStatusEnum.CLOSE, StringUtil.isEmpty(payReq.getReason()) ? "用户取消订单" : payReq.getReason());
         return HttpResponseResult.succeed(true);
@@ -364,8 +352,10 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 && !OrderStatusEnum.PAYING.equals(detail.getStatus())) {
             return;
         }
-        if (!StringUtil.isEmpty(detail.getTransNo())) {
-            Payment param = new Payment(detail.getOpenType(), detail.getPayChannel());
+        UserOrderPayment userOrderPayment = orderPaymentService.detailByTransNoOrPaymentNo(detail.getTransNo(), detail.getPaymentNo());
+        if (null != userOrderPayment && TradeStatusEnum.pending.equals(userOrderPayment.getStatus())) {
+            Payment param = new Payment(detail.getOpenType(),
+                    PaymentClientEnum.valueOf(userOrderPayment.getPaymentClient()), detail.getPayChannel());
             param.setId(detail.getTransNo());
             param.setPaymentNo(detail.getPaymentNo());
             BaseResult<Payment> res = paymentClient.queryPayment(param);
@@ -384,7 +374,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
     }
 
     private HttpResponseResult<OrderPayRes> doOrderPay(OrderPayReq payReq, UserOrderVo detail) throws Exception {
-        UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(payReq.getOrderNo(), payReq.getPayChannel(), TradeStatusEnum.pending);
+        /*UserOrderPayment orderPayment = orderPaymentService.detailByOrderNo(payReq.getOrderNo(), payReq.getPayChannel(), TradeStatusEnum.pending);
         //当前渠道已经有创建支付请求
         if (null != orderPayment && !StringUtil.isEmpty(orderPayment.getPayInfo())) {
             OrderPayRes orderPayRes = new OrderPayRes();
@@ -393,7 +383,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             orderPayRes.setPayChannel(orderPayment.getPayChannel());
             orderPayRes.setPaymentNo(orderPayment.getPaymentNo());
             return HttpResponseResult.succeed(orderPayRes);
-        }
+        }*/
         return orderPaymentService.createOrderPayment(payReq, detail);
     }
 

+ 8 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml

@@ -3,6 +3,11 @@
 <mapper namespace="com.yonge.cooleshow.biz.dal.dao.UserOrderPaymentDao">
     <resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.UserOrderPayment">
         <result column="id_" property="id" />
+
+        <result column="open_type_" property="openType" />
+        <result column="payment_client_" property="paymentClient" />
+        <result column="pay_channel_" property="payChannel" />
+
         <result column="order_no_" property="orderNo" />
         <result column="payment_no_" property="paymentNo" />
         <result column="trans_no_" property="transNo" />
@@ -23,6 +28,9 @@
     <!-- 表字段 -->
     <sql id="baseColumns">
          t.id_ as id
+        , t.open_type_ as openType,
+        , t.payment_client_ as paymentClient,
+        , t.pay_channel_ as payChannel,
         , t.order_no_ as orderNo
         , t.payment_no_ as paymentNo
         , t.trans_no_ as transNo

+ 9 - 5
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/PaymentController.java

@@ -24,6 +24,7 @@ import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.enums.MethodNameEnum;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.model.OpenAuth;
 import com.yonge.toolset.payment.base.model.Payment;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
@@ -79,7 +80,8 @@ public class PaymentController extends BaseController {
         if (null == userOrderPayment) {
             return HttpResponseResult.succeed();
         }
-        Payment param = new Payment(userOrderPayment.getOpenType(), userOrderPayment.getPayChannel());
+        Payment param = new Payment(userOrderPayment.getOpenType(),
+                PaymentClientEnum.valueOf(userOrderPayment.getPaymentClient()), userOrderPayment.getPayChannel());
         param.setId(userOrderPayment.getTransNo());
         param.setPaymentNo(userOrderPayment.getPaymentNo());
         BaseResult<Payment> paymentBaseResult = paymentClient.queryPayment(param);
@@ -105,21 +107,23 @@ public class PaymentController extends BaseController {
      * @param: request
      * @updateTime 2022/3/11 18:35
      */
-    @PostMapping("/callback/{openType}/{payChannel}/{payMethod}")
+    @PostMapping("/callback/{openType}/{client}/{payChannel}/{payMethod}")
     public Object callback(
             @PathVariable("openType") String openType,
+            @PathVariable("client") String client,
             @PathVariable("payChannel") String payChannel,
             @PathVariable("payMethod") String payMethod,
             HttpServletRequest request
     ) {
-        log.info("支付回调:openType is {} ,payChannel is {},payMethod is {}", openType, payChannel, payMethod);
+        log.info("支付回调:openType is {} ,paymentClient is {},payChannel is {},payMethod is {}", openType, client, payChannel, payMethod);
         BaseResult<PaymentCallBack> res = paymentClient.analysisNotice(
-                OpenEnum.valueOf(openType), PayChannelEnum.valueOf(payChannel), MethodNameEnum.valueOf(payMethod), request);
+                OpenEnum.valueOf(openType), PaymentClientEnum.valueOf(client),
+                PayChannelEnum.valueOf(payChannel), MethodNameEnum.valueOf(payMethod), request);
         if (res.getStatus()) {
             PaymentCallBack data = res.getData();
             //查询到订单
             UserOrderVo userOrderVo = userOrderService.getUserOrderByPaymentNoOrTransNo(data.getPaymentNo(), data.getId());
-            if(null == userOrderVo){
+            if (null == userOrderVo) {
                 return res.getData().getResMsg();
             }
             try {

+ 2 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserOrderController.java

@@ -19,6 +19,7 @@ import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.toolset.utils.string.StringUtil;
 import com.yonge.toolset.utils.web.WebUtil;
@@ -92,6 +93,7 @@ public class UserOrderController extends BaseController {
         if (StringUtil.isEmpty(payReq.getOrderNo())) {
             return failed("订单号不能为空");
         }
+        payReq.setPaymentClient(PaymentClientEnum.STUDENT);
         payReq.setUserId(user.getId());
         payReq.setIpAddress(WebUtil.getRemoteIp(request));
 

+ 2 - 5
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/adapay/AdapayTemplate.java

@@ -8,10 +8,7 @@ import com.huifu.adapay.model.Refund;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.adapay.constant.AdapayConstant;
 import com.yonge.toolset.payment.base.PaymentTemplate;
-import com.yonge.toolset.payment.base.enums.MethodNameEnum;
-import com.yonge.toolset.payment.base.enums.OpenEnum;
-import com.yonge.toolset.payment.base.enums.PayChannelEnum;
-import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
+import com.yonge.toolset.payment.base.enums.*;
 import com.yonge.toolset.payment.base.model.ClosePayment;
 import com.yonge.toolset.payment.base.model.OpenAuth;
 import com.yonge.toolset.payment.base.model.Payment;
@@ -179,7 +176,7 @@ public class AdapayTemplate implements PaymentTemplate {
     }
 
     @Override
-    public BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request) {
+    public BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request) {
         PaymentCallBack paymentCallBack = new PaymentCallBack();
 
         try {

+ 3 - 1
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/PaymentTemplate.java

@@ -4,6 +4,7 @@ import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.enums.MethodNameEnum;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.model.ClosePayment;
 import com.yonge.toolset.payment.base.model.OpenAuth;
 import com.yonge.toolset.payment.base.model.Payment;
@@ -67,10 +68,11 @@ public interface PaymentTemplate {
     /**
      * 解析异步通知
      * @param openType
+     * @param paymentClient
      * @param payChannel
      * @param methodName
      * @param request
      * @return
      */
-    BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request);
+    BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request);
 }

+ 32 - 0
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/enums/PaymentClientEnum.java

@@ -0,0 +1,32 @@
+package com.yonge.toolset.payment.base.enums;
+
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 支付客户端
+ *
+ * @author liweifan
+ * @date 2022-04-24
+ */
+public enum PaymentClientEnum implements BaseEnum<String, PaymentClientEnum> {
+
+    STUDENT("学生端"),
+    TEACHER("老师端");
+    
+    private String code;
+    private String msg;
+
+    PaymentClientEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+}

+ 15 - 1
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/Base.java

@@ -2,6 +2,7 @@ package com.yonge.toolset.payment.base.model;
 
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 
 import java.io.Serializable;
@@ -17,6 +18,10 @@ public class Base implements Serializable {
      * @updateTime 2022/3/31 11:01
      */
     private OpenEnum openType;
+    /**
+     * 付款应用
+     */
+    private PaymentClientEnum paymentClient;
     /***
      * 支付渠道
      * @author liweifan
@@ -34,8 +39,9 @@ public class Base implements Serializable {
     public Base() {
     }
 
-    public Base(OpenEnum openType, PayChannelEnum payChannel) {
+    public Base(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel) {
         this.openType = openType;
+        this.paymentClient = paymentClient;
         this.payChannel = payChannel;
     }
 
@@ -47,6 +53,14 @@ public class Base implements Serializable {
         this.openType = openType;
     }
 
+    public PaymentClientEnum getPaymentClient() {
+        return paymentClient;
+    }
+
+    public void setPaymentClient(PaymentClientEnum paymentClient) {
+        this.paymentClient = paymentClient;
+    }
+
     public PayChannelEnum getPayChannel() {
         return payChannel;
     }

+ 4 - 2
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/ClosePayment.java

@@ -2,9 +2,11 @@ package com.yonge.toolset.payment.base.model;
 
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 
 /**
  * 统一支付对象
+ *
  * @Author: liweifan
  * @Data: 2022/5/10 15:06
  */
@@ -38,8 +40,8 @@ public class ClosePayment extends Base {
      */
     Boolean hasNotify = true;
 
-    public ClosePayment(OpenEnum openType, PayChannelEnum payChannel){
-        super(openType,payChannel);
+    public ClosePayment(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel) {
+        super(openType, paymentClient, payChannel);
     }
 
     public String getId() {

+ 3 - 2
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/OpenAuth.java

@@ -2,6 +2,7 @@ package com.yonge.toolset.payment.base.model;
 
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 
 /**
  * 统一支付授权请求对象
@@ -18,8 +19,8 @@ public class OpenAuth extends Base {
 
     private String code;
 
-    public OpenAuth(OpenEnum openType, PayChannelEnum payChannel){
-        super(openType,payChannel);
+    public OpenAuth(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel) {
+        super(openType,paymentClient , payChannel);
     }
 
     public String getCode() {

+ 4 - 3
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/Payment.java

@@ -2,6 +2,7 @@ package com.yonge.toolset.payment.base.model;
 
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 
 import java.util.List;
 import java.util.Map;
@@ -78,7 +79,7 @@ public class Payment extends Base {
      * @author liweifan
      * @updateTime 2022/3/31 11:01
      */
-    private Map<String,Object> expend;
+    private Map<String, Object> expend;
     /***
      * 三方拉起支付字符串(请求后才有)
      * @author liweifan
@@ -86,8 +87,8 @@ public class Payment extends Base {
      */
     private String payInfo;
 
-    public Payment(OpenEnum openType,PayChannelEnum payChannel){
-        super(openType,payChannel);
+    public Payment(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel) {
+        super(openType, paymentClient, payChannel);
     }
 
     public String getId() {

+ 3 - 2
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/base/model/RefundBill.java

@@ -2,6 +2,7 @@ package com.yonge.toolset.payment.base.model;
 
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 
 import java.math.BigDecimal;
 
@@ -53,8 +54,8 @@ public class RefundBill extends Base {
      */
     private String reason;
 
-    public RefundBill(OpenEnum openType, PayChannelEnum payChannel){
-        super(openType,payChannel);
+    public RefundBill(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel) {
+        super(openType, paymentClient, payChannel);
     }
 
     public String getId() {

+ 6 - 2
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/PaymentClient.java

@@ -4,6 +4,7 @@ import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.enums.MethodNameEnum;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.model.ClosePayment;
 import com.yonge.toolset.payment.base.model.OpenAuth;
 import com.yonge.toolset.payment.base.model.Payment;
@@ -23,9 +24,10 @@ public interface PaymentClient {
      * @author liweifan
      * @param: openAuth
      * @updateTime 2022/5/12 10:42
-     * @return: com.yonge.toolset.base.result.BaseResult<java.util.Map<java.lang.String,java.lang.Object>>
+     * @return: com.yonge.toolset.base.result.BaseResult<java.util.Map < java.lang.String, java.lang.Object>>
      */
     BaseResult<Map<String, Object>> getOpenAuthMsg(OpenAuth openAuth);
+
     /***
      * 统一下单接口
      * @author liweifan
@@ -64,11 +66,13 @@ public interface PaymentClient {
 
     /**
      * 解析异步通知
+     *
      * @param openType
+     * @param paymentClient
      * @param payChannel
      * @param methodName
      * @param request
      * @return
      */
-    BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request);
+    BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request);
 }

+ 23 - 10
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/SysConfigPaymentService.java

@@ -1,22 +1,35 @@
 package com.yonge.toolset.payment.core.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.core.entity.SysConfigPayment;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 
 /**
  * 支付服务配置参数 服务类
+ *
  * @author liweifan
  * @date 2022-05-10
  */
-public interface SysConfigPaymentService extends IService<SysConfigPayment>  {
-	/***
-	 * 获取支付配置
-	 * @author liweifan
-	 * @param: openType 支付服务提供方
-	 * @param: paramName 配置名称
-	 * @updateTime 2022/5/10 22:55
-	 * @return: com.yonge.toolset.payment.core.entity.SysConfigPayment
-	 */
-	SysConfigPayment getPaymentConfig(OpenEnum openType, String paramName);
+public interface SysConfigPaymentService extends IService<SysConfigPayment> {
+    /***
+     * 获取支付配置
+     * @author liweifan
+     * @param: openType 支付服务提供方
+     * @param: platform 请求客户端
+     * @param: paramName 配置名称
+     * @updateTime 2022/5/10 22:55
+     * @return: com.yonge.toolset.payment.core.entity.SysConfigPayment
+     */
+    SysConfigPayment getPaymentConfig(OpenEnum openType, PaymentClientEnum client, String paramName);
+
+    /***
+     * 获取支付配置
+     * @author liweifan
+     * @param: openType 支付服务提供方
+     * @param: paramName 配置名称
+     * @updateTime 2022/5/10 22:55
+     * @return: com.yonge.toolset.payment.core.entity.SysConfigPayment
+     */
+    SysConfigPayment getPaymentConfig(OpenEnum openType, String paramName);
 }

+ 3 - 2
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/impl/PaymentClientImpl.java

@@ -5,6 +5,7 @@ import com.yonge.toolset.payment.base.PaymentTemplate;
 import com.yonge.toolset.payment.base.enums.MethodNameEnum;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
 import com.yonge.toolset.payment.base.enums.PayChannelEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.model.ClosePayment;
 import com.yonge.toolset.payment.base.model.OpenAuth;
 import com.yonge.toolset.payment.base.model.Payment;
@@ -49,7 +50,7 @@ public class PaymentClientImpl implements PaymentClient {
     }
 
     @Override
-    public BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request) {
-        return PaywayUtil.getRealTemplate(openType, payChannel).analysisNotice(openType, payChannel, methodName, request);
+    public BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request) {
+        return PaywayUtil.getRealTemplate(openType, payChannel).analysisNotice(openType, paymentClient, payChannel, methodName, request);
     }
 }

+ 13 - 3
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/core/service/impl/SysConfigPaymentServiceImpl.java

@@ -2,6 +2,7 @@ package com.yonge.toolset.payment.core.service.impl;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.core.dao.SysConfigPaymentDao;
 import com.yonge.toolset.payment.core.entity.SysConfigPayment;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
@@ -31,22 +32,31 @@ public class SysConfigPaymentServiceImpl extends ServiceImpl<SysConfigPaymentDao
     private void init() {
         List<SysConfigPayment> sysConfigPayments = baseMapper.selectList(Wrappers.emptyWrapper());
         for (SysConfigPayment configPayment : sysConfigPayments) {
-            redissonClient.getBucket(REDIS_KEY + ":" + configPayment.getOpenType()+ ":" + configPayment.getParamName()).set(configPayment);
+            redissonClient.getBucket(REDIS_KEY + ":" + configPayment.getOpenType() + ":" + configPayment.getParamName()).set(configPayment);
         }
     }
 
     @Override
+    public SysConfigPayment getPaymentConfig(OpenEnum openType, PaymentClientEnum client, String paramName) {
+        return getPaymentConfig(openType, client.getCode(), paramName);
+    }
+
+    @Override
     public SysConfigPayment getPaymentConfig(OpenEnum openType, String paramName) {
+        return getPaymentConfig(openType, "ALL", paramName);
+    }
+
+    private SysConfigPayment getPaymentConfig(OpenEnum openType, String platform, String paramName) {
         if (null == openType || StringUtil.isEmpty(paramName)) {
             return new SysConfigPayment();
         }
-        SysConfigPayment configPayment = (SysConfigPayment) redissonClient.getBucket(REDIS_KEY + ":" + openType.getCode() + ":" + paramName).get();
+        SysConfigPayment configPayment = (SysConfigPayment) redissonClient.getBucket(REDIS_KEY + ":" + openType.getCode() + ":" + platform + ":" + paramName).get();
         if (null == configPayment) {
             configPayment = baseMapper.selectOne(Wrappers.<SysConfigPayment>lambdaQuery()
                     .eq(SysConfigPayment::getOpenType, openType.getCode())
                     .eq(SysConfigPayment::getParamName, paramName)
             );
-            redissonClient.getBucket(REDIS_KEY + ":" + openType.getCode() + ":" + paramName).set(configPayment);
+            redissonClient.getBucket(REDIS_KEY + ":" + openType.getCode() + ":" + platform + ":" + paramName).set(configPayment);
         }
         return configPayment;
     }

+ 23 - 16
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/ali/OriginalAliAppTemplate.java

@@ -12,13 +12,11 @@ import com.alipay.api.response.AlipayTradeAppPayResponse;
 import com.alipay.api.response.AlipayTradeCloseResponse;
 import com.alipay.api.response.AlipayTradeQueryResponse;
 import com.alipay.api.response.AlipayTradeRefundResponse;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.PaymentTemplate;
 import com.yonge.toolset.payment.base.constant.PaymentConstant;
-import com.yonge.toolset.payment.base.enums.MethodNameEnum;
-import com.yonge.toolset.payment.base.enums.OpenEnum;
-import com.yonge.toolset.payment.base.enums.PayChannelEnum;
-import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
+import com.yonge.toolset.payment.base.enums.*;
 import com.yonge.toolset.payment.base.model.*;
 import com.yonge.toolset.payment.base.model.callback.ClosePaymentCallBack;
 import com.yonge.toolset.payment.base.model.callback.ExecutePaymentCallBack;
@@ -28,16 +26,12 @@ import com.yonge.toolset.payment.core.props.PaymentProperties;
 import com.yonge.toolset.payment.core.service.SysConfigPaymentService;
 import com.yonge.toolset.payment.core.util.RequestKitBean;
 import com.yonge.toolset.payment.original.ali.constant.AlipayConstant;
-import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.toolset.utils.string.StringUtil;
-import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Component;
-import org.springframework.web.context.request.RequestAttributes;
-import org.springframework.web.context.request.RequestContextHolder;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
@@ -52,8 +46,11 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
     @Autowired
     private PaymentProperties paymentProperties;
 
-    @Autowired
-    private AlipayClient alipayClient;
+    @Resource(name="studentAlipayClient")
+    private AlipayClient studentAlipayClient;
+
+    @Resource(name="teacherAlipayClient")
+    private AlipayClient teacherAlipayClient;
 
     @Autowired
     private SysConfigPaymentService configPaymentService;
@@ -92,7 +89,7 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
         bizContent.put("merchant_order_no", payment.getOrderNo());
         request.setBizContent(bizContent.toString());
         try {
-            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
+            AlipayTradeAppPayResponse response = getAlipayClient(payment.getPaymentClient()).sdkExecute(request);
             if (response.isSuccess()) {
                 payment.setId(response.getTradeNo());
                 payment.setPayInfo(response.getBody());
@@ -119,7 +116,7 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
 
         request.setBizContent(bizContent.toString());
         try {
-            AlipayTradeQueryResponse response = alipayClient.execute(request);
+            AlipayTradeQueryResponse response = getAlipayClient(payment.getPaymentClient()).execute(request);
 
             if (response.isSuccess()) {
                 payment.setPayAmt(response.getPayAmount());
@@ -160,7 +157,7 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
 
         request.setBizContent(bizContent.toString());
         try {
-            AlipayTradeCloseResponse response = alipayClient.execute(request);
+            AlipayTradeCloseResponse response = getAlipayClient(closePayment.getPaymentClient()).execute(request);
             closePayment.setStatus(TradeStatusEnum.succeeded);
             if (response.isSuccess()) {
                 return BaseResult.succeed(closePayment);
@@ -189,7 +186,7 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
 
         request.setBizContent(bizContent.toString());
         try {
-            AlipayTradeRefundResponse response = alipayClient.execute(request);
+            AlipayTradeRefundResponse response = getAlipayClient(refundBill.getPaymentClient()).execute(request);
 
             if (response.isSuccess()) {
                 //获取交易状态
@@ -207,9 +204,8 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
         }
     }
 
-
     @Override
-    public BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request) {
+    public BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request) {
         PaymentCallBack paymentCallBack = new PaymentCallBack();
         try {
             JSONObject jsonParams = requestKitBean.getReqParamJSON();
@@ -300,4 +296,15 @@ public class OriginalAliAppTemplate implements PaymentTemplate {
         }
     }
 
+
+    private AlipayClient getAlipayClient(PaymentClientEnum paymentClient){
+        if(PaymentClientEnum.STUDENT.equals(paymentClient)){
+            return this.studentAlipayClient;
+        }
+        if(PaymentClientEnum.TEACHER.equals(paymentClient)){
+            return this.teacherAlipayClient;
+        }
+        throw new BizException("未知的客户端类型");
+    }
+
 }

+ 24 - 8
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/ali/config/AlipayConfiguration.java

@@ -6,6 +6,7 @@ import com.huifu.adapay.Adapay;
 import com.huifu.adapay.model.MerConfig;
 import com.yonge.toolset.payment.adapay.constant.AdapayConstant;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.core.service.SysConfigPaymentService;
 import com.yonge.toolset.payment.original.ali.constant.AlipayConstant;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -27,17 +28,32 @@ public class AlipayConfiguration {
      * @updateTime 2022/5/12 14:16
      * @return: com.alipay.api.AlipayClient
      */
-    @Bean
-    public AlipayClient alipayClient() {
+    @Bean(name = "studentAlipayClient")
+    public AlipayClient studentAlipayClient() {
         AlipayClient alipayClient = new DefaultAlipayClient(
                 configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_URL).getParamValue(),
-                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_APPID).getParamValue(),
-                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_APP_PRIVATE_KEY).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.STUDENT, AlipayConstant.ALI_APPID).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.STUDENT, AlipayConstant.ALI_APP_PRIVATE_KEY).getParamValue(),
                 "json", "UTF-8",
-                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_ALIPAY_PUBLIC_KEY).getParamValue(),
-                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_SIGN_TYPE).getParamValue(),
-                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_CONTENT_SIGN_KEY).getParamValue(),
-                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_CONTENT_SIGN_TYPE).getParamValue()
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.STUDENT, AlipayConstant.ALI_ALIPAY_PUBLIC_KEY).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.STUDENT, AlipayConstant.ALI_SIGN_TYPE).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.STUDENT, AlipayConstant.ALI_CONTENT_SIGN_KEY).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.STUDENT, AlipayConstant.ALI_CONTENT_SIGN_TYPE).getParamValue()
+        );
+        return alipayClient;
+    }
+
+    @Bean(name = "teacherAlipayClient")
+    public AlipayClient teacherAlipayClient() {
+        AlipayClient alipayClient = new DefaultAlipayClient(
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, AlipayConstant.ALI_URL).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.TEACHER, AlipayConstant.ALI_APPID).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.TEACHER, AlipayConstant.ALI_APP_PRIVATE_KEY).getParamValue(),
+                "json", "UTF-8",
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.TEACHER, AlipayConstant.ALI_ALIPAY_PUBLIC_KEY).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.TEACHER, AlipayConstant.ALI_SIGN_TYPE).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.TEACHER, AlipayConstant.ALI_CONTENT_SIGN_KEY).getParamValue(),
+                configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.TEACHER, AlipayConstant.ALI_CONTENT_SIGN_TYPE).getParamValue()
         );
         return alipayClient;
     }

+ 67 - 22
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/OriginalWxAppTemplate.java

@@ -8,14 +8,14 @@ import com.github.binarywang.wxpay.bean.request.*;
 import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryV3Result;
 import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result;
 import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
+import com.github.binarywang.wxpay.constant.WxPayConstants;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;
+import com.github.binarywang.wxpay.util.SignUtils;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.PaymentTemplate;
-import com.yonge.toolset.payment.base.enums.MethodNameEnum;
-import com.yonge.toolset.payment.base.enums.OpenEnum;
-import com.yonge.toolset.payment.base.enums.PayChannelEnum;
-import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
+import com.yonge.toolset.payment.base.enums.*;
 import com.yonge.toolset.payment.base.model.ClosePayment;
 import com.yonge.toolset.payment.base.model.OpenAuth;
 import com.yonge.toolset.payment.base.model.Payment;
@@ -47,13 +47,14 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.io.ByteArrayOutputStream;
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.TimeZone;
+import java.nio.charset.StandardCharsets;
+import java.security.PrivateKey;
+import java.security.Signature;
+import java.util.*;
 
 @Component
 public class OriginalWxAppTemplate implements PaymentTemplate {
@@ -66,8 +67,10 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
     @Autowired
     private SysConfigPaymentService configPaymentService;
 
-    @Autowired
-    private WxPayService wxPayService;
+    @Resource(name = "studentWxService")
+    private WxPayService studentWxService;
+    @Resource(name = "teacherWxService")
+    private WxPayService teacherWxService;
 
     @Override
     public BaseResult<Map<String, Object>> getOpenAuthMsg(OpenAuth openAuth) {
@@ -86,6 +89,7 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
         request.setOutTradeNo(payment.getPaymentNo());
         request.setNotifyUrl(paymentProperties.getNotifyUrl()
                 + "/" + payment.getOpenType().getCode()
+                + "/" + payment.getPaymentClient().getCode()
                 + "/" + payment.getPayChannel().getCode()
                 + "/executePayment");
 
@@ -100,8 +104,20 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
         request.setAmount(amount);
 
         try {
-            Object orderV3 = wxPayService.createOrderV3(TradeTypeEnum.APP, request);
-            payment.setPayInfo(JSONObject.toJSONString(orderV3));
+            Object orderV3 = getWxPayService(payment.getPaymentClient())
+                    .createOrderV3(TradeTypeEnum.APP, request);
+            Map<String, String> stringStringMap = SignUtils.xmlBean2Map(orderV3);
+            String msg = buildMessage(
+                    APP_ID,
+                    Long.parseLong(stringStringMap.get("timestamp")),
+                    stringStringMap.get("noncestr"),
+                    stringStringMap.get("prepayid")
+            );
+
+            String sign = sign(msg.getBytes(StandardCharsets.UTF_8), payment.getPaymentClient());
+            stringStringMap.put("sign", sign);
+
+            payment.setPayInfo(JSONObject.toJSONString(stringStringMap));
 
             BaseResult<Payment> paymentBaseResult = queryPayment(payment);
             if (paymentBaseResult.getStatus()) {
@@ -129,7 +145,8 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
         param.setOutTradeNo(payment.getPaymentNo());
 
         try {
-            WxPayOrderQueryV3Result res = wxPayService.queryOrderV3(param);
+            WxPayOrderQueryV3Result res = getWxPayService(payment.getPaymentClient())
+                    .queryOrderV3(param);
 
             payment.setId(res.getTransactionId());
             String tradeState = res.getTradeState();
@@ -154,7 +171,7 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
 
     @Override
     public BaseResult<ClosePayment> closePayment(ClosePayment closePayment) {
-        if(StringUtil.isEmpty(closePayment.getPaymentNo())){
+        if (StringUtil.isEmpty(closePayment.getPaymentNo())) {
             return BaseResult.failed("缺失渠道关单必要参数");
         }
 
@@ -165,7 +182,8 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
         param.setOutTradeNo(closePayment.getPaymentNo());
 
         try {
-            wxPayService.closeOrderV3(param);
+            getWxPayService(closePayment.getPaymentClient())
+                    .closeOrderV3(param);
             closePayment.setStatus(TradeStatusEnum.succeeded);
             return BaseResult.succeed(closePayment);
         } catch (WxPayException e) {
@@ -187,6 +205,7 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
 
         param.setNotifyUrl(paymentProperties.getNotifyUrl()
                 + "/" + refundBill.getOpenType().getCode()
+                + "/" + refundBill.getPaymentClient().getCode()
                 + "/" + refundBill.getPayChannel().getCode()
                 + "/refundPayment");
 
@@ -201,7 +220,8 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
         param.setAmount(amount);
 
         try {
-            WxPayRefundV3Result res = wxPayService.refundV3(param);
+            WxPayRefundV3Result res = getWxPayService(refundBill.getPaymentClient())
+                    .refundV3(param);
 
             String refund_id = res.getRefundId();
             refundBill.setId(refund_id);
@@ -216,7 +236,7 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
     }
 
     @Override
-    public BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request) {
+    public BaseResult<PaymentCallBack> analysisNotice(OpenEnum openType, PaymentClientEnum paymentClient, PayChannelEnum payChannel, MethodNameEnum methodName, HttpServletRequest request) {
         //支付回调
         SignatureHeader header = new SignatureHeader();
         header.setTimeStamp(request.getHeader("Wechatpay-Timestamp"));
@@ -234,7 +254,7 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
         Map<String, Object> resMsg = new HashMap<>();
         try {
             if (MethodNameEnum.executePayment.equals(methodName)) {
-                WxPayOrderNotifyV3Result wxPayOrderNotifyV3Result = wxPayService.parseOrderNotifyV3Result(params, header);
+                WxPayOrderNotifyV3Result wxPayOrderNotifyV3Result = getWxPayService(paymentClient).parseOrderNotifyV3Result(params, header);
                 log.info("微信APP回调-支付请求:{}", JSONObject.toJSONString(wxPayOrderNotifyV3Result));
 
                 //封装支付回调对象
@@ -254,16 +274,16 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
                 }
 
                 ExecutePaymentCallBack executePayment = new ExecutePaymentCallBack();
-                if(!StringUtil.isEmpty(result.getAmount().getTotal())){
+                if (!StringUtil.isEmpty(result.getAmount().getTotal())) {
                     executePayment.setPayAmt(new BigDecimal(result.getAmount().getTotal()).divide(new BigDecimal("100")).toString());
                 }
-                if(!StringUtil.isEmpty(result.getSuccessTime())){
+                if (!StringUtil.isEmpty(result.getSuccessTime())) {
                     Date date = new DateTime(result.getSuccessTime()).toDate();
                     executePayment.setTradeTime(date);
                 }
                 paymentCallBack.setExecutePaymentCallBack(executePayment);
             } else if (MethodNameEnum.refundPayment.equals(methodName)) {
-                WxPayRefundNotifyV3Result wxPayRefundNotifyV3Result = wxPayService.parseRefundNotifyV3Result(params, header);
+                WxPayRefundNotifyV3Result wxPayRefundNotifyV3Result = getWxPayService(paymentClient).parseRefundNotifyV3Result(params, header);
                 log.info("微信APP回调-退款请求:{}", JSONObject.toJSONString(wxPayRefundNotifyV3Result));
                 //封装退款回调对象
                 WxPayRefundNotifyV3Result.DecryptNotifyResult result = wxPayRefundNotifyV3Result.getResult();
@@ -286,7 +306,7 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
                 refundPayment.setTransNo(result.getRefundId());
                 refundPayment.setRefundAmt(result.getAmount().getRefund());
 
-                if(!StringUtil.isEmpty(result.getSuccessTime())){
+                if (!StringUtil.isEmpty(result.getSuccessTime())) {
                     Date date = new DateTime(result.getSuccessTime()).toDate();
                     refundPayment.setTradeTime(date);
                 }
@@ -309,4 +329,29 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
             return BaseResult.failed(HttpStatus.INTERNAL_SERVER_ERROR, paymentCallBack, "解析异常");
         }
     }
+
+    String sign(byte[] message, PaymentClientEnum paymentClient) throws Exception {
+        Signature sign = Signature.getInstance("SHA256withRSA");
+        PrivateKey privateKey = getWxPayService(paymentClient).getConfig().getPrivateKey();
+        sign.initSign(privateKey);
+        sign.update(message);
+        return Base64.getEncoder().encodeToString(sign.sign());
+    }
+
+    String buildMessage(String appid, long timestamp, String nonceStr, String prepay_id) {
+        return appid + "\n"
+                + timestamp + "\n"
+                + nonceStr + "\n"
+                + prepay_id + "\n";
+    }
+
+    private WxPayService getWxPayService(PaymentClientEnum paymentClient) {
+        if (PaymentClientEnum.STUDENT.equals(paymentClient)) {
+            return this.studentWxService;
+        }
+        if (PaymentClientEnum.TEACHER.equals(paymentClient)) {
+            return this.teacherWxService;
+        }
+        throw new BizException("未知的客户端类型");
+    }
 }

+ 35 - 43
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/config/WxpayConfiguration.java

@@ -4,6 +4,7 @@ import com.github.binarywang.wxpay.config.WxPayConfig;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
+import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.core.service.SysConfigPaymentService;
 import com.yonge.toolset.payment.original.wx.constant.WxpayConstant;
 import org.apache.commons.lang3.StringUtils;
@@ -23,14 +24,19 @@ public class WxpayConfiguration {
     @Autowired
     private SysConfigPaymentService configPaymentService;
 
-    @Bean
-    public WxPayService wxService() {
-        String appId = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_APPID).getParamValue();
+    @Bean(name = "studentWxService")
+    public WxPayService studentWxService() {
         String merchantId = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
-        String merchantPrivateKey = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_PRIVATE_KEY).getParamValue();
-        String merchantSerialNumber = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_SERIAL_NUMBER).getParamValue();
         String apiV3Key = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_API_V3_KEY).getParamValue();
 
+        String merchantSerialNumber = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_SERIAL_NUMBER).getParamValue();
+        String merchantPrivateKey = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_PRIVATE_KEY).getParamValue();
+
+        String privateCertPath = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_PRIVATE_CERT_PATH).getParamValue();
+        String privateKeyPath = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_PRIVATE_KEY_PATH).getParamValue();
+
+        String appId = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.STUDENT, WxpayConstant.WX_APPID).getParamValue();
+
 
         WxPayConfig payConfig = new WxPayConfig();
         payConfig.setAppId(appId);
@@ -38,59 +44,45 @@ public class WxpayConfiguration {
         payConfig.setMchKey(merchantPrivateKey);
         payConfig.setCertSerialNo(merchantSerialNumber);
         payConfig.setApiV3Key(apiV3Key);
-        payConfig.setPrivateCertPath("classpath:apiclient_cert.pem");
-        payConfig.setPrivateKeyPath("classpath:apiclient_key.pem");
-
-        //"classpath:apiclient_cert.pem"
+        payConfig.setPrivateCertPath(privateCertPath);
+        payConfig.setPrivateKeyPath(privateKeyPath);
         // 可以指定是否使用沙箱环境
         payConfig.setUseSandboxEnv(false);
 
+
         WxPayService wxPayService = new WxPayServiceImpl();
         wxPayService.setConfig(payConfig);
         return wxPayService;
     }
 
-/*
-    @Bean
-    public CertificatesManager certificatesManager() throws Exception{
+    @Bean(name = "teacherWxService")
+    public WxPayService teacherWxService() {
         String merchantId = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
-        String privateKey = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_PRIVATE_KEY).getParamValue();
-        String merchantSerialNumber = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_SERIAL_NUMBER).getParamValue();
         String apiV3Key = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_API_V3_KEY).getParamValue();
 
-        PrivateKey merchantPrivateKey = PemUtil
-                .loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes(StandardCharsets.UTF_8)));
-
-        // 获取证书管理器实例
-        CertificatesManager certificatesManager = CertificatesManager.getInstance();
-
-        WechatPay2Credentials wechatPay2Credentials = new WechatPay2Credentials(merchantId, new PrivateKeySigner(merchantSerialNumber, merchantPrivateKey));
-
-        // 向证书管理器增加需要自动更新平台证书的商户信息
-        certificatesManager.putMerchant(merchantId,
-                wechatPay2Credentials,
-                apiV3Key.getBytes(StandardCharsets.UTF_8)
-        );
-        return certificatesManager;
-    }
-
-    @Bean
-    public CloseableHttpClient closeableHttpClient(CertificatesManager certificatesManager) throws Exception{
-        String merchantId = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
-        String privateKey = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_PRIVATE_KEY).getParamValue();
         String merchantSerialNumber = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_SERIAL_NUMBER).getParamValue();
+        String merchantPrivateKey = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_PRIVATE_KEY).getParamValue();
 
-        PrivateKey merchantPrivateKey = PemUtil
-                .loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes(StandardCharsets.UTF_8)));
+        String privateCertPath = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_PRIVATE_CERT_PATH).getParamValue();
+        String privateKeyPath = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_PRIVATE_KEY_PATH).getParamValue();
 
-        // 从证书管理器中获取verifier
-        Verifier verifier = certificatesManager.getVerifier(merchantId);
+        String appId = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, PaymentClientEnum.TEACHER, WxpayConstant.WX_APPID).getParamValue();
 
-        WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
-                .withMerchant(merchantId, merchantSerialNumber, merchantPrivateKey)
-                .withValidator(new WechatPay2Validator(verifier));
 
-        return builder.build();
-    }*/
+        WxPayConfig payConfig = new WxPayConfig();
+        payConfig.setAppId(appId);
+        payConfig.setMchId(merchantId);
+        payConfig.setMchKey(merchantPrivateKey);
+        payConfig.setCertSerialNo(merchantSerialNumber);
+        payConfig.setApiV3Key(apiV3Key);
+        payConfig.setPrivateCertPath(privateCertPath);
+        payConfig.setPrivateKeyPath(privateKeyPath);
+        // 可以指定是否使用沙箱环境
+        payConfig.setUseSandboxEnv(false);
 
+
+        WxPayService wxPayService = new WxPayServiceImpl();
+        wxPayService.setConfig(payConfig);
+        return wxPayService;
+    }
 }

+ 14 - 2
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/constant/WxpayConstant.java

@@ -19,6 +19,12 @@ public interface WxpayConstant {
      */
     String WX_MERCHANT_ID = "WX_MERCHANT_ID";
     /***
+     * V3密钥
+     * @author liweifan
+     * @updateTime 2022/5/13 14:09
+     */
+    String WX_API_V3_KEY = "WX_API_V3_KEY";
+    /***
      * 商户证书序列号
      * @author liweifan
      * @updateTime 2022/5/13 14:09
@@ -31,9 +37,15 @@ public interface WxpayConstant {
      */
     String WX_MERCHANT_PRIVATE_KEY = "WX_MERCHANT_PRIVATE_KEY";
     /***
-     * V3密钥
+     * 证书apiclient_cert.pem在服务器中的路径
      * @author liweifan
      * @updateTime 2022/5/13 14:09
      */
-    String WX_API_V3_KEY = "WX_API_V3_KEY";
+    String WX_PRIVATE_CERT_PATH = "WX_PRIVATE_CERT_PATH";
+    /***
+     * 证书apiclient_key.pem在服务器中的路径
+     * @author liweifan
+     * @updateTime 2022/5/13 14:09
+     */
+    String WX_PRIVATE_KEY_PATH = "WX_PRIVATE_KEY_PATH";
 }