Prechádzať zdrojové kódy

微信支付接口修改,系統退款接口編寫

liweifan 3 rokov pred
rodič
commit
50288e51a8

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TeacherStyleVideo.java

@@ -56,6 +56,7 @@ public class TeacherStyleVideo implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date updateTime;
     @ApiModelProperty(value = "假删除 false : 未删除 true:已删除",hidden = true)
+    @TableField(value = "del_flag_")
     private Boolean delFlag = false;
 
     public Long getId() {

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundService.java

@@ -47,4 +47,12 @@ public interface UserOrderRefundService extends IService<UserOrderRefund>  {
 	 * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.lang.Boolean>
 	 */
     HttpResponseResult<RefundBill> doAuth(AuthOperaReq authOperaReq, SysUser user);
+
+	/**
+	 * 系統自動退款
+	 * @param orderNo
+	 * @param reason
+	 * @return
+	 */
+	HttpResponseResult<RefundBill> orderRefund(String orderNo, String reason);
 }

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

@@ -193,6 +193,83 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
         return HttpResponseResult.succeed();
     }
 
+
+    @Transactional
+    public HttpResponseResult<RefundBill> orderRefund(String orderNo, String reason) {
+        UserOrderVo detail = orderService.detail(orderNo, null);
+
+        if (null == detail || CollectionUtils.isEmpty(detail.getOrderDetailList())) {
+            return HttpResponseResult.failed("未找到订单信息");
+        }
+        if (!OrderStatusEnum.PAID.equals(detail.getStatus())) {
+            return HttpResponseResult.failed("订单状态异常");
+        }
+        if (StringUtil.isEmpty(detail.getTransNo())) {
+            return HttpResponseResult.failed("未找到订单付款信息");
+        }
+
+        UserOrderPayment orderPayment = orderPaymentService.detailByTransNo(detail.getTransNo());
+        if (null == orderPayment || !TradeStatusEnum.succeeded.equals(orderPayment.getStatus())) {
+            return HttpResponseResult.failed("订单付款状态异常");
+        }
+        //查询订单下未退款的所有详情订单
+        List<UserOrderDetail> orderDetails = baseMapper.selectOrderRefundDetils(detail.getId());
+
+        //退款的详情id
+        List<Long> detilIds = orderDetails.stream().map(UserOrderDetail::getId).collect(Collectors.toList());
+
+        OrderRefundReq orderRefundReq = new OrderRefundReq();
+        orderRefundReq.setOrderId(detail.getId());
+        orderRefundReq.setUserId(detail.getUserId());
+        orderRefundReq.setReason(reason);
+        orderRefundReq.setOredrDetilIds(detilIds);
+        //退款金额
+        BigDecimal actualPrice = BigDecimal.ZERO;
+        for (UserOrderDetailVo vo : detail.getOrderDetailList()) {
+            Optional<Long> first = detilIds.stream().filter(o -> o.equals(vo.getId())).findFirst();
+            if (!first.isPresent()) {
+                continue;
+            }
+
+            Function<OrderRefundReq, HttpResponseResult<RefundCreateRes>> refundCreateFunction = refundCreate.get(vo.getGoodType());
+            if (Objects.isNull(refundCreateFunction)) {
+                orderRefundReq.setOredrDetil(vo);
+                HttpResponseResult<RefundCreateRes> apply = refundCreateFunction.apply(orderRefundReq);
+                if (apply.getStatus()) {
+                    detilIds.add(vo.getId());
+                    actualPrice.add(apply.getData().getActualPrice());
+                }
+            } else {
+                detilIds.add(vo.getId());
+                actualPrice.add(vo.getActualPrice());
+            }
+        }
+        String join = StringUtil.join(detilIds, ",");
+
+        UserOrderRefund orderRefunds = new UserOrderRefund();
+        orderRefunds.setUserId(detail.getUserId());
+        orderRefunds.setOrderId(detail.getId());
+        orderRefunds.setOrderNo(detail.getOrderNo());
+        orderRefunds.setOredrDetilIds(join);
+        orderRefunds.setStatus(AuthStatusEnum.PASS);
+        orderRefunds.setApplyAmount(actualPrice);
+        orderRefunds.setReason(reason);
+        save(orderRefunds);
+
+        for (UserOrderDetailVo vo : detail.getOrderDetailList()) {
+            List<Long> collect = orderRefundReq.getOredrDetilIds().stream().filter(o -> o.equals(vo.getId())).collect(Collectors.toList());
+            if (CollectionUtils.isNotEmpty(collect)) {
+                Consumer<UserOrderDetailVo> refundAfterConsumer = refundAfter.get(vo.getGoodType());
+                if (Objects.isNull(refundAfterConsumer)) {
+                    refundAfterConsumer.accept(vo);
+                }
+            }
+        }
+
+        return doOrderRefund(orderRefunds);
+
+    }
+
     private HttpResponseResult<RefundBill> doOrderRefund(UserOrderRefund orderRefund) {
         UserOrderPayment payment = orderPaymentService.getOne(Wrappers.<UserOrderPayment>lambdaQuery()
                 .eq(UserOrderPayment::getOrderNo, orderRefund.getOrderNo())

+ 1 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherStyleVideoMapper.xml

@@ -105,7 +105,7 @@
 		LEFT JOIN teacher a on t.user_id_ = a.user_id_
 		LEFT JOIN sys_user u on t.user_id_ = u.id_
 		LEFT JOIN teacher_total ta on t.user_id_ = ta.user_id_
-		where t.del_flag_ = '0'
+		where t.del_flag_ = '0' and t.auth_status_ = 'PASS'
 		<if test="param.username != null and param.username != ''">
 			AND u.username_ LIKE CONCAT('%', #{param.username}, '%')
 		</if>

+ 7 - 10
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserOrderMapper.xml

@@ -182,16 +182,13 @@
         where t.status_ in ('WAIT_PAY','PAYING')
         and t.user_id_ = #{param.userId}
         and exists (
-        select 1 from user_order_detail d where t.order_no_ = d.order_no_
-        and d.good_type_ = #{param.goodType}
-        <choose>
-            <when test="param.goodType != null and param.goodType == 'PRACTICE'">
-                and d.merch_id_ = #{param.bizId}
-            </when>
-            <otherwise>
-                and d.biz_id_ = #{param.bizId}
-            </otherwise>
-        </choose>
+            select 1 from user_order_detail d where t.order_no_ = d.order_no_
+            and d.good_type_ = #{param.goodType}
+            <choose>
+                <when test="param.goodType != null and param.goodType != 'PRACTICE'">
+                    and d.biz_id_ = #{param.bizId}
+                </when>
+            </choose>
         )
         order by t.create_time_ desc limit 1
     </select>

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

@@ -13,10 +13,13 @@ import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 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.model.OpenAuth;
 import com.yonge.toolset.payment.base.model.Payment;
 import com.yonge.toolset.payment.core.props.PaymentProperties;
 import com.yonge.toolset.payment.core.service.PaymentClient;
+import com.yonge.toolset.payment.core.service.SysConfigPaymentService;
+import com.yonge.toolset.payment.original.wx.constant.WxpayConstant;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
@@ -26,6 +29,8 @@ import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -47,6 +52,8 @@ public class PaymentController extends BaseController {
     private PaymentClient paymentClient;
     @Autowired
     private PaymentProperties paymentProperties;
+    @Autowired
+    private SysConfigPaymentService configPaymentService;
 
     @ApiOperation(value = "查询付款单")
     @GetMapping("/queryPayment")
@@ -84,18 +91,57 @@ public class PaymentController extends BaseController {
      * @updateTime 2022/3/11 18:35
      */
     @PostMapping("/callback/{openType}/{payChannel}/{payMethod}")
-    public void callback(
+    public Object callback(
             @PathVariable("openType") String openType,
             @PathVariable("payChannel") String payChannel,
             @PathVariable("payMethod") String payMethod,
             HttpServletRequest request
-    ) {
+    ) throws Exception{
         if (OpenEnum.ADAPAY.getCode().equals(openType)) {
-            adapayCallbackHandle(request);
+            return adapayCallbackHandle(payChannel, payMethod, request);
+        }
+        if (OpenEnum.ORIGINAL.getCode().equals(openType)) {
+            return originalCallbackHandle(payChannel, payMethod, request);
+        }
+        return null;
+    }
+
+    /**
+     * 原生微信支付宝回调
+     *
+     * @param request
+     */
+    private Object originalCallbackHandle(String payChannel, String payMethod, HttpServletRequest request) throws Exception{
+        if (PayChannelEnum.alipay_app.getCode().equals(payChannel)) {
+            return alipayAppCallbackHandle(payMethod, request);
+        }
+        if (PayChannelEnum.wx_app.getCode().equals(payChannel)) {
+            return wxAppCallbackHandle(payMethod, request);
+        }
+        return null;
+    }
+
+    private Object wxAppCallbackHandle(String payMethod, HttpServletRequest request) throws Exception {
+        String merchantId = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
+        String apiV3Key = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_API_V3_KEY).getParamValue();
+
+
+
+        //支付回调
+        if ("executePayment".equals(payMethod)) {
+
+
+
         }
+        return null;
+    }
+
+    //支付宝App支付回调
+    private Object alipayAppCallbackHandle(String payMethod, HttpServletRequest request) {
+        return null;
     }
 
-    private void adapayCallbackHandle(HttpServletRequest request) {
+    private Object adapayCallbackHandle(String payChannel, String payMethod, HttpServletRequest request) {
         try {
             //验签传参data
             String data = request.getParameter("data");
@@ -106,7 +152,7 @@ public class PaymentController extends BaseController {
             log.info("汇付回调,type is {},sign is {}, data is {}", type, sign, data);
             if (StringUtil.isEmpty(type)) {
                 log.error("汇付回调参数异常");
-                return;
+                return null;
             }
             //验签传参publicKey
             String publicKey = AdapayCore.PUBLIC_KEY;
@@ -119,5 +165,6 @@ public class PaymentController extends BaseController {
         } catch (Exception e) {
             e.printStackTrace();
         }
+        return null;
     }
 }

+ 1 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/TeacherController.java

@@ -71,7 +71,7 @@ public class TeacherController extends BaseController {
         }
         HttpResponseResult<TeacherHomeVo> res = teacherService.queryTeacherHome(user.getId(), userId);
         //学生端过滤只看审核通过的
-        if (null != res.getData() && CollectionUtils.isEmpty(res.getData().getStyleVideo())) {
+        if (null != res.getData() && !CollectionUtils.isEmpty(res.getData().getStyleVideo())) {
             List<TeacherStyleVideo> styleVideo = res.getData().getStyleVideo();
             List<TeacherStyleVideo> collect = styleVideo.stream().filter(o -> AuthStatusEnum.PASS.equals(o.getAuthStatus())).collect(Collectors.toList());
             res.getData().setStyleVideo(collect);

+ 7 - 1
toolset/toolset-payment/pom.xml

@@ -15,6 +15,7 @@
 
     <properties>
         <redisson.version>3.16.4</redisson.version>
+        <binarywang.weixin.java.version>4.1.0</binarywang.weixin.java.version>
     </properties>
 
     <dependencies>
@@ -49,10 +50,15 @@
             <version>4.23.0.ALL</version>
         </dependency>
         <!-- 微信 -->
-        <dependency>
+        <!--<dependency>
             <groupId>com.github.wechatpay-apiv3</groupId>
             <artifactId>wechatpay-apache-httpclient</artifactId>
             <version>0.4.6</version>
+        </dependency>-->
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-pay</artifactId>
+            <version>${binarywang.weixin.java.version}</version>
         </dependency>
         <!-- 汇付 -->
         <dependency>

+ 153 - 2
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/OriginalWxAppTemplate.java

@@ -3,6 +3,12 @@ package com.yonge.toolset.payment.original.wx;
 import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+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.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
 import com.yonge.toolset.base.result.BaseResult;
 import com.yonge.toolset.payment.base.PaymentTemplate;
 import com.yonge.toolset.payment.base.enums.OpenEnum;
@@ -14,7 +20,10 @@ import com.yonge.toolset.payment.base.model.RefundBill;
 import com.yonge.toolset.payment.core.props.PaymentProperties;
 import com.yonge.toolset.payment.core.service.SysConfigPaymentService;
 import com.yonge.toolset.payment.original.wx.constant.WxpayConstant;
+import com.yonge.toolset.utils.collection.MapUtil;
+import com.yonge.toolset.utils.obj.ObjectUtil;
 import com.yonge.toolset.utils.string.StringUtil;
+import org.apache.commons.collections.map.HashedMap;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.client.methods.HttpPost;
@@ -42,14 +51,18 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
     @Autowired
     private SysConfigPaymentService configPaymentService;
 
+    /*@Autowired
+    private CloseableHttpClient httpClient;*/
     @Autowired
-    private CloseableHttpClient httpClient;
+    private WxPayService wxPayService;
+    private String tradeState;
+
 
     @Override
     public BaseResult<Map<String, Object>> getOpenAuthMsg(OpenAuth openAuth) {
         return null;
     }
-
+    /**
     @Override
     public BaseResult<Payment> executePayment(Payment payment) {
         String APP_ID = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_APPID).getParamValue();
@@ -252,4 +265,142 @@ public class OriginalWxAppTemplate implements PaymentTemplate {
         refundBill.setId(refund_id);
         return BaseResult.succeed(refundBill);
     }
+    **/
+
+    @Override
+    public BaseResult<Payment> executePayment(Payment payment) {
+        String APP_ID = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_APPID).getParamValue();
+        String MERCHANT_ID = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
+
+        WxPayUnifiedOrderV3Request request = new WxPayUnifiedOrderV3Request();
+        request.setAppid(APP_ID);
+        request.setMchid(MERCHANT_ID);
+        request.setDescription(payment.getOrderDesc());
+        request.setOutTradeNo(payment.getPaymentNo());
+        request.setNotifyUrl(paymentProperties.getNotifyUrl()
+                + "/" + payment.getOpenType().getCode()
+                + "/" + payment.getPayChannel().getCode()
+                + "/executePayment");
+
+        if (StringUtil.isEmpty(payment.getPayAmt())) {
+            return BaseResult.failed("微信APP支付金额异常");
+        }
+
+        BigDecimal payAmt = new BigDecimal(payment.getPayAmt()).multiply(new BigDecimal("100"));
+
+        WxPayUnifiedOrderV3Request.Amount amount = new WxPayUnifiedOrderV3Request.Amount();
+        amount.setTotal(payAmt.abs().intValue());
+        request.setAmount(amount);
+
+        try {
+            Object orderV3 = wxPayService.createOrderV3(TradeTypeEnum.APP, request);
+            String prepayid = ObjectUtil.getFieldValueByFieldName("prepayid", orderV3);
+            payment.setPayInfo(StringUtil.get(prepayid));
+
+            BaseResult<Payment> paymentBaseResult = queryPayment(payment);
+            if (paymentBaseResult.getStatus()) {
+                payment.setId(paymentBaseResult.getData().getId());
+            }
+            return BaseResult.succeed(payment);
+        } catch (WxPayException e) {
+            log.error("微信APP支付请求失败:{}", e.toString());
+            return BaseResult.failed(e.getReturnMsg());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return BaseResult.failed("微信APP支付请求失败");
+        }
+    }
+
+    @Override
+    public BaseResult<Payment> queryPayment(Payment payment) {
+        String MERCHANT_ID = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
+
+        WxPayOrderQueryV3Request param = new WxPayOrderQueryV3Request();
+        param.setMchid(MERCHANT_ID);
+        if(!StringUtil.isEmpty(payment.getId())){
+            param.setTransactionId(payment.getId());
+        }
+        param.setOutTradeNo(payment.getPaymentNo());
+
+        try {
+            WxPayOrderQueryV3Result res = wxPayService.queryOrderV3(param);
+
+            payment.setId(res.getTransactionId());
+            String tradeState = res.getTradeState();
+            if ("SUCCESS".equals(tradeState)) {
+                payment.setStatus(TradeStatusEnum.succeeded);
+            } else if ("REFUND".equals(tradeState)) {
+                payment.setStatus(TradeStatusEnum.close);
+            } else if ("NOTPAY".equals(tradeState)) {
+                payment.setStatus(TradeStatusEnum.pending);
+            } else if ("CLOSED".equals(tradeState)) {
+                payment.setStatus(TradeStatusEnum.close);
+            }
+            return BaseResult.succeed(payment);
+        } catch (WxPayException e) {
+            log.error("微信APP支付查询请求失败:{}", e.toString());
+            return BaseResult.failed(e.getReturnMsg());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return BaseResult.failed("微信APP支付查询请求失败");
+        }
+    }
+
+    @Override
+    public BaseResult<ClosePayment> closePayment(ClosePayment closePayment) {
+        String MERCHANT_ID = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_ID).getParamValue();
+
+        WxPayOrderCloseV3Request param = new WxPayOrderCloseV3Request();
+        param.setMchid(MERCHANT_ID);
+        param.setOutTradeNo(closePayment.getPaymentNo());
+
+        try{
+            wxPayService.closeOrderV3(param);
+            return BaseResult.succeed(closePayment);
+        } catch (WxPayException e) {
+            log.error("微信APP支付关单请求失败:{}", e.toString());
+            return BaseResult.failed(e.getReturnMsg());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return BaseResult.failed("微信APP支付关单请求失败");
+        }
+    }
+
+    @Override
+    public BaseResult<RefundBill> refundPayment(RefundBill refundBill) {
+        WxPayRefundV3Request param = new WxPayRefundV3Request();
+        param.setTransactionId(refundBill.getTradeNo());
+        param.setOutTradeNo(refundBill.getPaymentNo());
+        param.setOutRefundNo(refundBill.getRefundNo());
+        param.setReason(refundBill.getReason());
+
+        param.setNotifyUrl(paymentProperties.getNotifyUrl()
+                + "/" + refundBill.getOpenType().getCode()
+                + "/" + refundBill.getPayChannel().getCode()
+                + "/refundPayment");
+
+        WxPayRefundV3Request.Amount amount = new WxPayRefundV3Request.Amount();
+        BigDecimal refundAmt = refundBill.getRefundAmt().multiply(new BigDecimal("100"));
+        amount.setRefund(refundAmt.intValue());
+
+        BigDecimal orderAmt = refundBill.getOrderAmt().multiply(new BigDecimal("100"));
+        amount.setTotal(orderAmt.intValue());
+
+        amount.setCurrency("CNY");
+        param.setAmount(amount);
+
+        try {
+            WxPayRefundV3Result res = wxPayService.refundV3(param);
+
+            String refund_id = res.getRefundId();
+            refundBill.setId(refund_id);
+            return BaseResult.succeed(refundBill);
+        } catch (WxPayException e) {
+            log.error("微信APP支付请求失败:{}", e.toString());
+            return BaseResult.failed(e.getReturnMsg());
+        } catch (Exception e) {
+            e.printStackTrace();
+            return BaseResult.failed("微信APP支付关单请求失败");
+        }
+    }
 }

+ 47 - 31
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/original/wx/config/WxpayConfiguration.java

@@ -1,21 +1,19 @@
 package com.yonge.toolset.payment.original.wx.config;
 
-import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
-import com.wechat.pay.contrib.apache.httpclient.auth.*;
-import com.wechat.pay.contrib.apache.httpclient.cert.CertificatesManager;
-import com.wechat.pay.contrib.apache.httpclient.util.PemUtil;
+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.core.service.SysConfigPaymentService;
 import com.yonge.toolset.payment.original.wx.constant.WxpayConstant;
-import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-import java.io.ByteArrayInputStream;
-import java.nio.charset.StandardCharsets;
 import java.security.PrivateKey;
 
+
 /**
  * @Author: liweifan
  * @Data: 2022/5/12 10:12
@@ -25,20 +23,41 @@ public class WxpayConfiguration {
     @Autowired
     private SysConfigPaymentService configPaymentService;
 
-    /***
-     * 支付宝APP支付Bean
-     * @author liweifan
-     * @updateTime 2022/5/12 14:16
-     * @return: com.alipay.api.AlipayClient
-     */
     @Bean
-    public CloseableHttpClient closeableHttpClient() throws Exception{
+    public WxPayService wxService() {
+        String appId = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_APPID).getParamValue();
         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 privateKey = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_MERCHANT_PRIVATE_KEY).getParamValue();
         String apiV3Key = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_API_V3_KEY).getParamValue();
 
 
+        WxPayConfig payConfig = new WxPayConfig();
+        payConfig.setAppId(appId);
+        payConfig.setMchId(merchantId);
+        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.setUseSandboxEnv(false);
+
+        WxPayService wxPayService = new WxPayServiceImpl();
+        wxPayService.setConfig(payConfig);
+        return wxPayService;
+    }
+
+/*
+    @Bean
+    public 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 apiV3Key = configPaymentService.getPaymentConfig(OpenEnum.ORIGINAL, WxpayConstant.WX_API_V3_KEY).getParamValue();
+
         PrivateKey merchantPrivateKey = PemUtil
                 .loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes(StandardCharsets.UTF_8)));
 
@@ -46,11 +65,23 @@ public class WxpayConfiguration {
         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();
+
+        PrivateKey merchantPrivateKey = PemUtil
+                .loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes(StandardCharsets.UTF_8)));
 
         // 从证书管理器中获取verifier
         Verifier verifier = certificatesManager.getVerifier(merchantId);
@@ -60,21 +91,6 @@ public class WxpayConfiguration {
                 .withValidator(new WechatPay2Validator(verifier));
 
         return builder.build();
-        /**
-        // 加载商户私钥(privateKey:私钥字符串)
-        PrivateKey merchantPrivateKey = PemUtil
-                .loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8")));
-
-        // 加载平台证书(mchId:商户号,mchSerialNo:商户证书序列号,apiV3Key:V3密钥)
-        AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
-                new WechatPay2Credentials(merchantId, new PrivateKeySigner(merchantSerialNumber, merchantPrivateKey)),apiV3Key.getBytes("utf-8"));
-
-        // 初始化httpClient
-        CloseableHttpClient build = WechatPayHttpClientBuilder.create()
-                .withMerchant(merchantId, merchantSerialNumber, merchantPrivateKey)
-                .withValidator(new WechatPay2Validator(verifier)).build();
-        return build;
-        **/
-    }
+    }*/
 
 }

+ 24 - 0
toolset/toolset-payment/src/main/resources/apiclient_cert.pem

@@ -0,0 +1,24 @@
+-----BEGIN CERTIFICATE-----
+MIID8zCCAtugAwIBAgIUXkiyBI0+OOmO2K35AnprC9vhf8kwDQYJKoZIhvcNAQEL
+BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
+FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
+Q0EwHhcNMjIwNTE2MDcxNzE5WhcNMjcwNTE1MDcxNzE5WjCBhDETMBEGA1UEAwwK
+MTYyNTkzMDAzNDEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMTAwLgYDVQQL
+DCfmrabmsYnphbfkuZDnp4DnvZHnu5znp5HmioDmnInpmZDlhazlj7gxCzAJBgNV
+BAYMAkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBANAWcWJgjzWHrqjxidhyekmBXOTj54lHYkggJC1esX1AwEISOk1E
+edbsw4OVvUZJcyg6pu/vmLTgNZSoCQ2fuiWhTXg5BeMBRN/UejSQFDRVSCfsAnkY
+Xx2eGMKvLWD8Z8VGBtM7nCfb18EGe35vyNtj2v/9o/8hv/cUoGGccFY21gYxiJAQ
+sEKwRjz1hgmahgSOYnb4GQRLbKKPwzToo7oVeKnAjRHQ8wr/+shCjIFGiPXHcIha
+DcU/Wz6StHMp54m9E7cvyHoNK4jlSHjNqWdBZPKzaYx+sozsZD9rZQGjB6l5h3RU
+kU4PaIe+g06FCEp1Yw7eaoTVCM3j+dhVvRcCAwEAAaOBgTB/MAkGA1UdEwQCMAAw
+CwYDVR0PBAQDAgTwMGUGA1UdHwReMFwwWqBYoFaGVGh0dHA6Ly9ldmNhLml0cnVz
+LmNvbS5jbi9wdWJsaWMvaXRydXNjcmw/Q0E9MUJENDIyMEU1MERCQzA0QjA2QUQz
+OTc1NDk4NDZDMDFDM0U4RUJEMjANBgkqhkiG9w0BAQsFAAOCAQEAS3D2jC435T13
+PRYgNceYidbnds+cHWT7e8YJZl5aKNzGY8mCxuGPrmNHblUOfeq0V4cfoSlh/RCv
+8kgKI3a5z6ZvFhuZ9CITKELkuV9ClQIiMveJkxcU68giR7GY68kesZRDYeM2lVCk
+sSOzKjfXbZX30OhDM24vcVD2z6/y/XVoB7MOY8PcrdFT3hRnP1u+3lUXQGijLkMY
+szU6yX4NSac7OSaKNwaJNMqpuHM1uAd6NM4qTQ0oXuwN+uOR0+GCgrUkM/34MPsm
+P/o8TmyqzwJl12k9RNwqlGBem5re08vxrDTnEaZG5NklV8GFmxGyToo+4foueunk
+22KIeOpo6g==
+-----END CERTIFICATE-----

+ 28 - 0
toolset/toolset-payment/src/main/resources/apiclient_key.pem

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDQFnFiYI81h66o
+8YnYcnpJgVzk4+eJR2JIICQtXrF9QMBCEjpNRHnW7MODlb1GSXMoOqbv75i04DWU
+qAkNn7oloU14OQXjAUTf1Ho0kBQ0VUgn7AJ5GF8dnhjCry1g/GfFRgbTO5wn29fB
+Bnt+b8jbY9r//aP/Ib/3FKBhnHBWNtYGMYiQELBCsEY89YYJmoYEjmJ2+BkES2yi
+j8M06KO6FXipwI0R0PMK//rIQoyBRoj1x3CIWg3FP1s+krRzKeeJvRO3L8h6DSuI
+5Uh4zalnQWTys2mMfrKM7GQ/a2UBowepeYd0VJFOD2iHvoNOhQhKdWMO3mqE1QjN
+4/nYVb0XAgMBAAECggEAPHN4pwrEL9nl/MCGujGvovEI6pnm5rOtMqTbva53w5pv
+AALJmy7ccnq/5dc3cFbgNHytiKDDbTCBgFk8oA+aBVqR5e4y7pqsxpW0ltaQeA+a
+cbaXlVRmNXV7XfuEJFvPTbklPHJh0BaG3FWkxLt2z3133sxxuymz2fTNDu5imDi5
+zmwQ0+WHy955jPOsE726Vnef76PtOxYdZip0QigXeVTr715ohsxPQ+sXyNYMpYsF
+k5A19IkGSYqCzQpyDCA1dDKiAQQQ9Ikh34/B/lOkfOI/Ivf1YTSVjj/XsRd6RW3V
+CQWx7MKTXFE3U/dxragu98ejYmaT5DL9/G5Yptx1kQKBgQDvLLCp0iT5sCCrisH+
+f8fLfvCgUE+MuVYyvFMcps+b/eXaF7SjESqqYgpB2U32vJiCzk760yMFGR7zeoRs
+eUPT0SYIKgm8+t4DnaMBxIarDbgU+KvVlYQR7n1tqf8f2InTWbq/KCVzt+fCP6gO
+vjHUEB2m22pKomGTrNYNQaWxXwKBgQDeueglZsx7Z4QyRKBLYAIqUtFD0kysMz9x
+KLPwRZCceFF8jEl4vk8Ldrvhn0oiz0sPKyvL9Fg4oH+ZWPs2ovCA3vNWGea6Sa5Z
+s1QBDWch1yBaHLStniC1vrLd4lUOraKXFqFBae75430vUlYxzXdaJXdbrzmvFp+V
+yLIZiT13SQKBgGcwPcwWyTMcpQu9ovLdSGLokoJoA9owABuFmsoKwhmIEknk3l9Y
+QbMe91PvoC5qsdYFkpeuzjYd33emjUmLjBLv8lulX2w0Q+MFeNWDZ6KXGauamfBd
+QIzH+z98D4E62EPiO6rLdFUXrBrngedScYcPqOtbUOGAa17eO7+eahE7AoGACKOR
+W5IHMGoteH2s8f+BVf7sWwMXMj6yoUMA57rrBwarsncGioZnLnymgPPavkroEGiO
+RFTv7xJaoKoQ5GehiH4dViOfDW66MoSAJ6JLc8aSXKxsXaeagTIqYezbe7xEaDPa
+gV0IhezK+EDrUvczP+3gGVBMnnv0KK0mK1NlbPECgYEAqs9Usr1XfV/2T0qYY+6J
+KiEHav/SL583ED9ZwPxE/DArc0T0GdJj6ZLhhZFPRFaIRoV4LvoTEg/P5yAg3gkk
+ngc7BCofbkMJ5fIDKO7d6p8aPnlJDYz6GVtGNFJqoCFw7138b0YoxRar0nlUXWBj
+LfwTdN+4AsR0S8oLaKju7QQ=
+-----END PRIVATE KEY-----