guohongjin
2024-05-01 1901fceb6ddaa56a57f3131191454554c3e77e68
rest/src/main/java/cn/stylefeng/rest/ijpay/controller/WxPayController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.net.NetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import cn.stylefeng.guns.modular.business.dto.request.OrderPayRequest;
import cn.stylefeng.guns.modular.business.entity.CounsellingOrder;
import cn.stylefeng.guns.modular.business.entity.CourseOrder;
@@ -47,6 +48,8 @@
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
@Slf4j
@@ -85,23 +88,52 @@
   @ResponseBody
   public ResponseData appPay(@RequestBody @Validated WxAppPayRequest req) {
      // 支付金额
      String totalAmount = "";
      BigDecimal totalAmount = BigDecimal.valueOf(0);
      // 订单编号判断订单类型
      if (req.getOrderNo().contains(OrderTypeEnum.MENTAL_TEST.getCode())) {
         // 心理测试订单
         OrderMentalTest order = orderMentalTestService.getOrderByNo(req.getOrderNo());
         totalAmount = order.getPayAmount().toString();
         totalAmount = order.getPayAmount();
      } else if (req.getOrderNo().contains(OrderTypeEnum.CONSULT_ONE.getCode())) {
         // 心理咨询1V1订单
         OrderConsultOne order = orderConsultOneService.getOrderByNo(req.getOrderNo());
         totalAmount = order.getPayAmount().toString();
         totalAmount = order.getPayAmount();
      }else if (req.getOrderNo().startsWith(OrderTypeEnum.COURSE_ORDER.getCode())){
         CourseOrder courseOrder = this.courseOrderService.getCourseOrderByNo(req.getOrderNo());
         totalAmount = courseOrder.getPayAmount().toString();
         totalAmount = courseOrder.getPayAmount();
      } else if (req.getOrderNo().startsWith(OrderTypeEnum.COUNSELLING_ORDER.getCode())) {
         CounsellingOrder counsellingOrder = this.counsellingOrderService.getCounsellingOrderByNo(req.getOrderNo());
         totalAmount = counsellingOrder.getPayAmount().toString();
         totalAmount = counsellingOrder.getPayAmount();
      }
      // 判断转换后的BigDecimal是否为0
      if (totalAmount.compareTo(BigDecimal.ZERO) == 0) {
         if (req.getOrderNo().startsWith(OrderTypeEnum.MENTAL_TEST.getCode())) {
            // 心理测试订单
            orderMentalTestService.paySuccess(req.getOrderNo(), req.getOrderNo(), String.valueOf(totalAmount), PayTypeEnum.ALIPAY.getCode());
         } else if (req.getOrderNo().startsWith(OrderTypeEnum.CONSULT_ONE.getCode())) {
            // 心理咨询1V1订单
            mentalTestOrderBizService.paySuccessOrderConsultOne(req.getOrderNo(), req.getOrderNo(), String.valueOf(totalAmount), PayTypeEnum.ALIPAY.getCode());
         } else if (req.getOrderNo().startsWith(OrderTypeEnum.COURSE_ORDER.getCode())) {
            //课程订单
            OrderPayRequest orderPayRequest = new OrderPayRequest();
            orderPayRequest.setOrderNo(req.getOrderNo());
            orderPayRequest.setTransactionNo(req.getOrderNo());
            orderPayRequest.setPayType("2");
            orderPayRequest.setOrderType(1);
            courseOrderService.payCourseOrder(orderPayRequest);
         } else if (req.getOrderNo().startsWith(OrderTypeEnum.COUNSELLING_ORDER.getCode())) {
            //咨询订单
            OrderPayRequest orderPayRequest = new OrderPayRequest();
            orderPayRequest.setOrderNo(req.getOrderNo());
            orderPayRequest.setTransactionNo(req.getOrderNo());
            orderPayRequest.setPayType("2");
            orderPayRequest.setOrderType(2);
            counsellingOrderService.payCounsellingOrder(orderPayRequest);
         }
         return new SuccessResponseData("支付成功");
      }
      // 设置支付配置
@@ -115,6 +147,10 @@
      // 获取微信支付配置
      WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getWxPayApiConfig();
      // 支付金额X100求整
      String totalFee = totalAmount.multiply(BigDecimal.valueOf(100))
            .setScale(0, RoundingMode.HALF_UP)
            .toPlainString();
      // 组装支付参数
      Map<String, String> params = UnifiedOrderModel
            .builder()
@@ -123,35 +159,34 @@
            .nonce_str(WxPayKit.generateStr())
            .body(req.getSubject())
            .attach(req.getSubject())
            //.out_trade_no(WxPayKit.generateStr())
            .out_trade_no(req.getOrderNo())
            .total_fee(totalAmount)
            .out_trade_no(WxPayKit.generateStr())
//            .out_trade_no(req.getOrderNo())
            .total_fee(totalFee)
            .spbill_create_ip(ip)
            .notify_url(notifyUrl)
            .trade_type(TradeType.APP.getTradeType())
            .trade_type(TradeType.APP.getTradeType()).attach(req.getOrderNo())
            .build()
            .createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
            .createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5);
      log.debug("微信APP支付请求params:{}", JSONUtil.toJsonStr(params));
      String xmlResult = WxPayApi.pushOrder(false, params);
      log.info("微信APP支付结果xml:{}", xmlResult);
      log.debug("微信APP支付结果xml:{}", xmlResult);
      Map<String, String> result = WxPayKit.xmlToMap(xmlResult);
      String returnCode = result.get("return_code");
      String resultCode = result.get("result_code");
      String returnMsg = result.get("return_msg");
      if (!WxPayKit.codeIsOk(returnCode) || !WxPayKit.codeIsOk(resultCode)) {
         log.error("微信APP支付异常!{}", returnMsg);
         log.error("微信APP支付异常!{}", result);
         return new ErrorResponseData(returnMsg);
      }
      // 以下字段在 return_code 和 result_code 都为 SUCCESS 的时候有返回
      String prepayId = result.get("prepay_id");
      Map<String, String> packageParams = WxPayKit.appPrepayIdCreateSign(wxPayApiConfig.getAppId(), wxPayApiConfig.getMchId(), prepayId, wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
      Map<String, String> packageParams = WxPayKit.appPrepayIdCreateSign(wxPayApiConfig.getAppId(), wxPayApiConfig.getMchId(), prepayId, wxPayApiConfig.getPartnerKey(), SignType.MD5);
      String jsonStr = JSON.toJSONString(packageParams);
      log.info("微信APP支付返回参数:{}", jsonStr);
      return new SuccessResponseData(jsonStr);
      log.info("微信APP支付返回参数:{}", JSONUtil.toJsonStr(packageParams));
      return new SuccessResponseData(packageParams);
   }
   /**
@@ -167,13 +202,14 @@
      // 注意重复通知的情况,同一订单号可能收到多次通知,请注意一定先判断订单状态
      // 注意此处签名方式需与统一下单的签名类型一致
      if (WxPayKit.verifyNotify(params, WxPayApiConfigKit.getWxPayApiConfig().getPartnerKey(), SignType.HMACSHA256)) {
      if (WxPayKit.verifyNotify(params, WxPayApiConfigKit.getWxPayApiConfig().getPartnerKey(), SignType.MD5)) {
         if (WxPayKit.codeIsOk(returnCode)) {
            // 参数文档: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7&index=8
            String totalFee = params.get("total_fee");
            String totalFee = new BigDecimal(params.get("total_fee")).divide(BigDecimal.valueOf(100)).toString();
            String transactionId = params.get("transaction_id");
            // 获取订单号
            String orderNo = params.get("out_trade_no");
//            String orderNo = params.get("out_trade_no");
            String orderNo = params.get("attach");
            // 订单编号判断订单类型
            if (orderNo.startsWith(OrderTypeEnum.MENTAL_TEST.getCode())) {
               // 心理测试订单
@@ -274,7 +310,7 @@
         .trade_type(TradeType.MWEB.getTradeType())
         .scene_info(JSON.toJSONString(sceneInfo))
         .build()
         .createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
         .createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5);
      String xmlResult = WxPayApi.pushOrder(false, params);
      log.info(xmlResult);
@@ -338,7 +374,7 @@
         .trade_type(TradeType.JSAPI.getTradeType())
         .openid(openId)
         .build()
         .createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
         .createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5);
      String xmlResult = WxPayApi.pushOrder(false, params);
      log.info(xmlResult);
@@ -359,7 +395,7 @@
      String prepayId = resultMap.get("prepay_id");
      Map<String, String> packageParams = WxPayKit.prepayIdCreateSign(prepayId, wxPayApiConfig.getAppId(),
         wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
         wxPayApiConfig.getPartnerKey(), SignType.MD5);
      String jsonStr = JSON.toJSONString(packageParams);
      return new SuccessResponseData(jsonStr);
@@ -452,7 +488,7 @@
            .trade_type(TradeType.NATIVE.getTradeType())
            .openid(openId)
            .build()
            .createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
            .createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5);
         String xmlResult = WxPayApi.pushOrder(false, params);
         log.info("统一下单:" + xmlResult);
         /**
@@ -479,7 +515,7 @@
               //result_code为FAIL时,添加该键值对,value值是微信告诉客户的信息
               prepayParams.put("err_code_des", "订单失效");
            }
            prepaySign = WxPayKit.createSign(prepayParams, wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
            prepaySign = WxPayKit.createSign(prepayParams, wxPayApiConfig.getPartnerKey(), SignType.MD5);
            prepayParams.put("sign", prepaySign);
            String xml = WxPayKit.toXml(prepayParams);
            log.error(xml);
@@ -521,7 +557,7 @@
         .notify_url(notifyUrl)
         .trade_type(TradeType.NATIVE.getTradeType())
         .build()
         .createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
         .createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5);
      String xmlResult = WxPayApi.pushOrder(false, params);
      log.info("统一下单:" + xmlResult);
@@ -583,7 +619,7 @@
         .spbill_create_ip(ip)
         .auth_code(authCode)
         .build()
         .createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
         .createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5);
      String xmlResult = WxPayApi.microPay(false, params);
      //同步返回结果
@@ -644,7 +680,7 @@
         .trade_type(TradeType.JSAPI.getTradeType())
         .openid(openId)
         .build()
         .createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
         .createSign(wxPayApiConfig.getPartnerKey(), SignType.MD5);
      String xmlResult = WxPayApi.pushOrder(false, params);
@@ -663,7 +699,7 @@
      // 以下字段在 return_code 和 result_code 都为 SUCCESS 的时候有返回
      String prepayId = result.get("prepay_id");
      Map<String, String> packageParams = WxPayKit.miniAppPrepayIdCreateSign(wxPayApiConfig.getAppId(), prepayId,
         wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
         wxPayApiConfig.getPartnerKey(), SignType.MD5);
      String jsonStr = JSON.toJSONString(packageParams);
      log.info("小程序支付的参数:" + jsonStr);
      return new SuccessResponseData(jsonStr);
@@ -805,7 +841,7 @@
         params.put("bank_code", "1001");
         params.put("amount", "1");
         params.put("desc", "IJPay 让支付触手可及-付款到银行卡");
         params.put("sign", WxPayKit.createSign(params, wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256));
         params.put("sign", WxPayKit.createSign(params, wxPayApiConfig.getPartnerKey(), SignType.MD5));
         return WxPayApi.payBank(params, wxPayApiConfig.getCertPath(), wxPayApiConfig.getMchId());
      } catch (Exception e) {
         e.printStackTrace();
@@ -853,7 +889,7 @@
            .nonce_str(WxPayKit.generateStr())
            .receiver(JSON.toJSONString(receiver))
            .build()
            .createSign(wxPayBean.getPartnerKey(), SignType.HMACSHA256);
            .createSign(wxPayBean.getPartnerKey(), SignType.MD5);
         log.info("请求参数:{}", WxPayKit.toXml(params));
         String result = WxPayApi.profitSharingAddReceiver(params);
         log.info("请求结果:{}", result);
@@ -887,7 +923,7 @@
         .out_order_no(WxPayKit.generateStr())
         .receivers(JSON.toJSONString(list))
         .build()
         .createSign(wxPayBean.getPartnerKey(), SignType.HMACSHA256);
         .createSign(wxPayBean.getPartnerKey(), SignType.MD5);
      log.info("请求参数:{}", WxPayKit.toXml(params));
      String result = WxPayApi.profitSharing(params, wxPayBean.getCertPath(), wxPayBean.getMchId());