Przeglądaj źródła

Merge remote-tracking branch 'origin/企微聊天' into 企微聊天

ct 2 dni temu
rodzic
commit
fc6f2e268c

+ 18 - 0
fs-service/src/main/java/com/fs/app/service/impl/AppPayServiceImpl.java

@@ -18,6 +18,8 @@ import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.ip.IpUtils;
 import com.fs.core.config.WxPayProperties;
 import com.fs.core.utils.OrderCodeUtils;
+import com.fs.course.service.IFsUserCourseOrderService;
+import com.fs.course.service.IFsUserVipOrderService;
 import com.fs.his.domain.*;
 import com.fs.his.dto.PayConfigDTO;
 import com.fs.his.enums.FsPackageOrderStatusEnum;
@@ -67,6 +69,10 @@ public class AppPayServiceImpl implements AppPayService {
     private IFsStoreOrderService storeOrderService;
     @Autowired
     private IFsPackageOrderService packageOrderService;
+    @Autowired
+    private IFsUserCourseOrderService courseOrderService;
+    @Autowired
+    private IFsUserVipOrderService vipOrderService;
 
     /**
      * 支付宝回调
@@ -99,6 +105,12 @@ public class AppPayServiceImpl implements AppPayService {
                 case "package":
                     packageOrderService.payConfirm("", arr[1],"","",1,tradeNo,"");
                     break;
+                case "appvip":
+                    vipOrderService.payConfirm("", arr[1],"","",1,tradeNo,"");
+                    break;
+                case "course":
+                    courseOrderService.payConfirm("", arr[1],"","",1,tradeNo,"");
+                    break;
             }
 
 
@@ -132,6 +144,12 @@ public class AppPayServiceImpl implements AppPayService {
             case "package":
                 packageOrderService.payConfirm("", tradeNoArr[1],"","",1,result.getTransactionId(),"");
                 break;
+            case "appvip":
+                vipOrderService.payConfirm("", tradeNoArr[1],"","",1,result.getTransactionId(),"");
+                break;
+            case "course":
+                courseOrderService.payConfirm("", tradeNoArr[1],"","",1,result.getTransactionId(),"");
+                break;
         }
         return WxPayNotifyResponse.success("OK");
     }

+ 2 - 0
fs-service/src/main/java/com/fs/course/param/FsUserCourseOrderDoPayParam.java

@@ -11,4 +11,6 @@ public class FsUserCourseOrderDoPayParam implements Serializable {
     Long orderId;
     Long userId;
     private String appId;
+
+    private String payType;
 }

+ 2 - 0
fs-service/src/main/java/com/fs/course/param/FsUserVipOrderPayUParam.java

@@ -12,4 +12,6 @@ public class FsUserVipOrderPayUParam implements Serializable {
    @NotNull(message = "orderId不能为空")
    private Long orderId;
    private String appId;
+
+   private String payType;
 }

+ 4 - 0
fs-service/src/main/java/com/fs/course/service/IFsUserCourseOrderService.java

@@ -9,6 +9,8 @@ import com.fs.course.vo.FsUserCourseOrderListPVO;
 import com.fs.course.vo.FsUserCourseOrderListUVO;
 import com.fs.his.param.FsPackageOrderDoPayParam;
 
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * 课程订单信息Service接口
  *
@@ -84,4 +86,6 @@ public interface IFsUserCourseOrderService
     R createIntegralOrder(FsUserCourseOrderCreateParam param);
 
     List<FsUserCourseOrderListUVO> selectFsUserCourseOrderListUVO(FsUserCourseOrderListUParam param);
+
+    R appPayment(FsUserCourseOrderDoPayParam param, HttpServletRequest request);
 }

+ 4 - 0
fs-service/src/main/java/com/fs/course/service/IFsUserVipOrderService.java

@@ -11,6 +11,8 @@ import com.fs.course.param.FsUserVipOrderPayUParam;
 import com.fs.course.vo.FsUserVipOrderListPVO;
 import com.fs.his.param.FsPackageOrderDoPayParam;
 
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * 购买会员订单Service接口
  *
@@ -78,4 +80,6 @@ public interface IFsUserVipOrderService
     R payConfirm(String orderSn,String payCode, String tradeNo,String payType,Integer type,String bankTransactionId,String bankSerialNo);
 
     R aliPayment(FsUserVipOrderPayUParam param);
+
+    R appPayment(FsUserVipOrderPayUParam param, HttpServletRequest request);
 }

+ 193 - 4
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseOrderServiceImpl.java

@@ -6,6 +6,12 @@ import java.util.*;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.diagnosis.DiagnosisUtils;
+import com.alipay.api.domain.AlipayTradeAppPayModel;
+import com.alipay.api.request.AlipayTradeAppPayRequest;
+import com.alipay.api.response.AlipayTradeAppPayResponse;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fs.common.core.domain.R;
@@ -19,6 +25,7 @@ import com.fs.core.utils.OrderCodeUtils;
 import com.fs.course.domain.*;
 import com.fs.course.mapper.*;
 import com.fs.course.param.*;
+import com.fs.course.service.IFsCoursePlaySourceConfigService;
 import com.fs.course.service.IFsUserCourseStudyService;
 import com.fs.course.vo.FsUserCourseOrderListPVO;
 import com.fs.course.vo.FsUserCourseOrderListUVO;
@@ -29,10 +36,7 @@ import com.fs.his.enums.FsUserIntegralLogTypeEnum;
 import com.fs.his.mapper.*;
 import com.fs.his.param.FsPackageOrderDoPayParam;
 import com.fs.his.param.FsUserAddIntegralTemplateParam;
-import com.fs.his.service.IFsCouponService;
-import com.fs.his.service.IFsStorePaymentService;
-import com.fs.his.service.IFsUserCouponService;
-import com.fs.his.service.IFsUserIntegralLogsService;
+import com.fs.his.service.*;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuifuCreateOrderResult;
 import com.fs.huifuPay.service.HuiFuService;
@@ -55,6 +59,7 @@ import com.github.binarywang.wxpay.config.WxPayConfig;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.google.gson.Gson;
+import lombok.extern.slf4j.Slf4j;
 import org.checkerframework.checker.units.qual.A;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -64,12 +69,15 @@ import com.fs.course.service.IFsUserCourseOrderService;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * 课程订单信息Service业务层处理
  *
  * @author fs
  * @date 2024-05-21
  */
+@Slf4j
 @Service
 public class FsUserCourseOrderServiceImpl implements IFsUserCourseOrderService
 {
@@ -133,6 +141,14 @@ public class FsUserCourseOrderServiceImpl implements IFsUserCourseOrderService
     private IFsUserIntegralLogsService userIntegralLogsService;
     @Autowired
     private FsUserWxMapper fsUserWxMapper;
+    @Autowired
+    private FsUserMapper userMapper;
+    @Autowired
+    private IFsCoursePlaySourceConfigService fsCoursePlaySourceConfigService;
+    @Autowired
+    private IMerchantAppConfigService merchantAppConfigService;
+    @Autowired
+    private IFsUserService fsUserService;
 
 
 
@@ -373,6 +389,177 @@ public class FsUserCourseOrderServiceImpl implements IFsUserCourseOrderService
         }
     }
 
+    @Override
+    public R appPayment(FsUserCourseOrderDoPayParam param, HttpServletRequest request) {
+        FsUserCourseOrder order = fsUserCourseOrderMapper.selectFsUserCourseOrderByOrderId(param.getOrderId());
+        if (order == null) {
+            return R.error("订单不存在");
+        }
+        if (order.getStatus() != 1) {
+            return R.error("非法操作");
+        }
+
+        FsUser user = userMapper.selectFsUserByUserId(param.getUserId());
+        if (user == null) {
+            return R.error("用户不存在");
+        }
+
+        if (order.getPayMoney().compareTo(new BigDecimal(0)) <= 0) {
+            this.payConfirm(order.getOrderCode(),"","","",2,null,null);
+            return R.ok().put("isPay",1);
+        }
+
+        FsCoursePlaySourceConfig fsCoursePlaySourceConfig = fsCoursePlaySourceConfigService.selectCoursePlaySourceConfigByAppId(param.getAppId());
+        if (fsCoursePlaySourceConfig == null) {
+            throw new CustomException("未找到appId对应的配置: " + param.getAppId());
+        }
+        Long merchantConfigId = fsCoursePlaySourceConfig.getMerchantConfigId();
+        if (merchantConfigId == null || merchantConfigId <= 0) {
+            throw new CustomException("没有配置商户信息");
+        }
+
+        MerchantAppConfig merchantAppConfig = merchantAppConfigService.selectMerchantAppConfigById(fsCoursePlaySourceConfig.getMerchantConfigId());
+        FsPayConfig fsPayConfig = JSON.parseObject(merchantAppConfig.getDataJson(), FsPayConfig.class);
+        String openId = null;
+        String appId = param.getAppId();
+        if (request.getHeader("sourcetype") != null && "APP".equals(request.getHeader("sourcetype"))) {
+            FsUser fsUser = fsUserService.selectFsUserByUserId(param.getUserId().longValue());
+            openId = fsUser.getAppOpenId();
+        } else {
+            if (StringUtils.isNotBlank(appId)) {
+                //查询fs_user_wx的openId
+                Wrapper<FsUserWx> queryWrapper = Wrappers.<FsUserWx>lambdaQuery()
+                        .eq(FsUserWx::getFsUserId, param.getUserId())
+                        .eq(FsUserWx::getAppId, appId);
+                FsUserWx fsUserWx = fsUserWxMapper.selectOne(queryWrapper);
+                if (fsUserWx != null) {
+                    openId = fsUserWx.getOpenId();
+                }
+            } else {
+                appId = merchantAppConfig.getAppId();
+                openId = Objects.isNull(user) ? "" : user.getMaOpenId();
+                if (StringUtils.isBlank(openId)){
+                    Wrapper<FsUserWx> queryWrapper = Wrappers.<FsUserWx>lambdaQuery()
+                            .eq(FsUserWx::getFsUserId, param.getUserId())
+                            .eq(FsUserWx::getAppId, appId);
+                    FsUserWx fsUserWx = fsUserWxMapper.selectOne(queryWrapper);
+                    if (Objects.nonNull(fsUserWx)){
+                        openId = fsUserWx.getOpenId();
+                    }
+                }
+            }
+        }
+
+        if ("hf".equals(merchantAppConfig.getMerchantType()) && "wx".equals(param.getPayType()) && StringUtils.isBlank(openId)) {
+            return R.error("用户OPENID不存在");
+        }
+
+        String payCode = OrderCodeUtils.getOrderSn();
+        if (StringUtils.isEmpty(payCode)) {
+            return R.error("订单生成失败,请重试");
+        }
+
+        FsStorePayment storePayment = new FsStorePayment();
+        storePayment.setStatus(0);
+        storePayment.setPayMode(merchantAppConfig.getMerchantType());
+        storePayment.setBusinessCode(order.getOrderCode());
+        storePayment.setPayCode(payCode);
+        storePayment.setPayMoney(order.getPayMoney());
+        storePayment.setCreateTime(new Date());
+        storePayment.setPayTypeCode("app");
+        storePayment.setBusinessType(5);
+        storePayment.setRemark("课程订单支付");
+        storePayment.setPayTypeCode(param.getPayType());
+        storePayment.setUserId(user.getUserId());
+        storePayment.setBusinessId(order.getOrderId().toString());
+        storePayment.setMerchantId(merchantAppConfig.getId());
+        storePayment.setAppId(param.getAppId());
+        if (storePaymentService.insertFsStorePayment(storePayment) > 0) {
+            if (!"hf".equals(merchantAppConfig.getMerchantType()) && !"appPay".equals(merchantAppConfig.getMerchantType())) {
+                return R.error("支付暂不可用!");
+            }
+
+            if ("hf".equals(merchantAppConfig.getMerchantType())) {
+                HuiFuCreateOrder o = new HuiFuCreateOrder();
+                o.setTradeType(param.getPayType().equals("wx") ? "T_MINIAPP" : "A_NATIVE");
+                o.setOpenid(openId);
+                o.setAppId(appId);
+                o.setReqSeqId("course-"+storePayment.getPayCode());
+                o.setTransAmt(storePayment.getPayMoney().toString());
+                o.setAppId(param.getAppId());
+                o.setGoodsDesc("课程订单支付");
+                HuifuCreateOrderResult result = huiFuService.createOrder(o);
+                FsStorePayment mt=new FsStorePayment();
+                mt.setPaymentId(storePayment.getPaymentId());
+                mt.setTradeNo(result.getHf_seq_id());
+                mt.setAppId(appId);
+                storePaymentService.updateFsStorePayment(mt);
+                return R.ok().put("isPay",0).put("data",result).put("type","hf");
+            } else if ("appPay".equals(merchantAppConfig.getMerchantType()) && "wx".equals(param.getPayType())) {
+                //创建微信订单
+                WxPayConfig payConfig = new WxPayConfig();
+                payConfig.setAppId(appId);
+                payConfig.setMchId(fsPayConfig.getWxAppMchId());
+                payConfig.setMchKey(fsPayConfig.getWxAppMchKey());
+                payConfig.setSubAppId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+                payConfig.setSubMchId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+                payConfig.setKeyPath(null);
+                payConfig.setNotifyUrl(fsPayConfig.getWxAppNotifyUrl());
+                wxPayService.setConfig(payConfig);
+                WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
+                orderRequest.setBody("课程订单支付");
+                orderRequest.setOutTradeNo("course-"+storePayment.getPayCode());
+                orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(storePayment.getPayMoney().toString()));
+                orderRequest.setTradeType("APP");
+                orderRequest.setSpbillCreateIp(IpUtils.getIpAddr(request));
+                orderRequest.setNotifyUrl(fsPayConfig.getNotifyUrlScrm());
+                //调用统一下单接口,获取"预支付交易会话标识"
+                try {
+                    log.info("会员开通订单支付 调用微信入参:{}", orderRequest.toString());
+                    Object result = wxPayService.createOrder(orderRequest);
+                    log.info("会员开通订单支付 调用微信出参:{}", result.toString());
+                    return R.ok().put("data",result).put("type","wxApp").put("isPay",0);
+                } catch (WxPayException e) {
+                    e.printStackTrace();
+                    throw new CustomException("会员开通订单支付"+e.getMessage());
+                }
+            } else if ("appPay".equals(merchantAppConfig.getMerchantType()) && "ali".equals(param.getPayType())) {
+                // 实例化客户端
+                AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", fsPayConfig.getAliAppId(), fsPayConfig.getAliPrivateKey(), "json", "utf-8", fsPayConfig.getAliPublicKey(), "RSA2");
+                // 构造请求参数以调用接口
+                AlipayTradeAppPayRequest aliRequest = new AlipayTradeAppPayRequest();
+                AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
+                // 商户订单号
+                model.setOutTradeNo("course-" + storePayment.getPayCode());
+                // 订单总金额
+                model.setTotalAmount(storePayment.getPayMoney().toString());
+                // 订单标题
+                model.setSubject("课程订单支付");
+                aliRequest.setBizModel(model);
+                aliRequest.setNotifyUrl(fsPayConfig.getAliNotifyUrl());
+
+                try {
+                    log.info("会员开通订单支付 调用支付宝入参:{}", aliRequest.toString());
+                    AlipayTradeAppPayResponse result = alipayClient.sdkExecute(aliRequest);
+                    if (!result.isSuccess()) {
+                        String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(result);
+                        log.error("支付宝支付调用失败 诊断链接:{}", diagnosisUrl);
+                        throw new CustomException(result.getSubMsg());
+                    }
+
+                    log.info("会员开通订单支付 调用支付宝入参:{}", result.toString());
+
+                    return R.ok().put("isPay", 0).put("data", result).put("type", "aliPay");
+                } catch (Exception e){
+                    log.info("支付宝支付异常: {}", e);
+                    throw new CustomException("支付系统异常,请稍后重试");
+                }
+            }
+        }
+
+        return R.error();
+    }
+
     @Override
     public R payment(FsUserCourseOrderDoPayParam param) {
         FsUserCourseOrder order = fsUserCourseOrderMapper.selectFsUserCourseOrderByOrderId(param.getOrderId());
@@ -906,3 +1093,5 @@ public class FsUserCourseOrderServiceImpl implements IFsUserCourseOrderService
         return moneys;
     }
 }
+
+

+ 188 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserVipOrderServiceImpl.java

@@ -11,6 +11,12 @@ import java.util.Objects;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.diagnosis.DiagnosisUtils;
+import com.alipay.api.domain.AlipayTradeAppPayModel;
+import com.alipay.api.request.AlipayTradeAppPayRequest;
+import com.alipay.api.response.AlipayTradeAppPayResponse;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fs.common.core.domain.R;
@@ -29,11 +35,14 @@ import com.fs.course.mapper.FsUserVipPackageMapper;
 import com.fs.course.param.FsUserVipOrderCreateUParam;
 import com.fs.course.param.FsUserVipOrderParam;
 import com.fs.course.param.FsUserVipOrderPayUParam;
+import com.fs.course.service.IFsCoursePlaySourceConfigService;
 import com.fs.course.vo.FsUserVipOrderListPVO;
 import com.fs.his.domain.*;
 import com.fs.his.dto.PayConfigDTO;
 import com.fs.his.mapper.*;
 import com.fs.his.service.IFsStorePaymentService;
+import com.fs.his.service.IFsUserService;
+import com.fs.his.service.IMerchantAppConfigService;
 import com.fs.hisStore.domain.FsPayConfigScrm;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.huifuPay.domain.HuifuCreateOrderResult;
@@ -55,6 +64,7 @@ import com.github.binarywang.wxpay.config.WxPayConfig;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;
 import com.google.gson.Gson;
+import lombok.extern.slf4j.Slf4j;
 import org.checkerframework.checker.units.qual.A;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -66,12 +76,15 @@ import com.fs.course.service.IFsUserVipOrderService;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * 购买会员订单Service业务层处理
  *
  * @author fs
  * @date 2024-06-27
  */
+@Slf4j
 @Service
 public class FsUserVipOrderServiceImpl implements IFsUserVipOrderService
 {
@@ -113,6 +126,12 @@ public class FsUserVipOrderServiceImpl implements IFsUserVipOrderService
     private IPayService payService;
     @Autowired
     private FsUserWxMapper fsUserWxMapper;
+    @Autowired
+    private IFsCoursePlaySourceConfigService fsCoursePlaySourceConfigService;
+    @Autowired
+    private IMerchantAppConfigService merchantAppConfigService;
+    @Autowired
+    private IFsUserService fsUserService;
 
 
     /**
@@ -221,6 +240,175 @@ public class FsUserVipOrderServiceImpl implements IFsUserVipOrderService
     }
 
 
+    @Override
+    public R appPayment(FsUserVipOrderPayUParam param, HttpServletRequest request) {
+        FsUserVipOrder order = fsUserVipOrderMapper.selectFsUserVipOrderByOrderId(param.getOrderId());
+        if (order == null) {
+            return R.error("订单不存在");
+        }
+        if (order.getStatus() != 0) {
+            return R.error("非法操作");
+        }
+
+        FsUser user = userMapper.selectFsUserByUserId(param.getUserId());
+        if (user == null) {
+            return R.error("用户不存在");
+        }
+
+        if (order.getPayMoney().compareTo(new BigDecimal(0)) <= 0) {
+            this.payConfirm(order.getOrderCode(),"","","",2,null,null);
+            return R.ok().put("isPay",1);
+        }
+
+        FsCoursePlaySourceConfig fsCoursePlaySourceConfig = fsCoursePlaySourceConfigService.selectCoursePlaySourceConfigByAppId(param.getAppId());
+        if (fsCoursePlaySourceConfig == null) {
+            throw new CustomException("未找到appId对应的配置: " + param.getAppId());
+        }
+        Long merchantConfigId = fsCoursePlaySourceConfig.getMerchantConfigId();
+        if (merchantConfigId == null || merchantConfigId <= 0) {
+            throw new CustomException("没有配置商户信息");
+        }
+
+        MerchantAppConfig merchantAppConfig = merchantAppConfigService.selectMerchantAppConfigById(fsCoursePlaySourceConfig.getMerchantConfigId());
+        FsPayConfig fsPayConfig = JSON.parseObject(merchantAppConfig.getDataJson(), FsPayConfig.class);
+        String openId = null;
+        String appId = param.getAppId();
+        if (request.getHeader("sourcetype") != null && "APP".equals(request.getHeader("sourcetype"))) {
+            FsUser fsUser = fsUserService.selectFsUserByUserId(param.getUserId().longValue());
+            openId = fsUser.getAppOpenId();
+        } else {
+            if (StringUtils.isNotBlank(appId)) {
+                //查询fs_user_wx的openId
+                Wrapper<FsUserWx> queryWrapper = Wrappers.<FsUserWx>lambdaQuery()
+                        .eq(FsUserWx::getFsUserId, param.getUserId())
+                        .eq(FsUserWx::getAppId, appId);
+                FsUserWx fsUserWx = fsUserWxMapper.selectOne(queryWrapper);
+                if (fsUserWx != null) {
+                    openId = fsUserWx.getOpenId();
+                }
+            } else {
+                appId = merchantAppConfig.getAppId();
+                openId = Objects.isNull(user) ? "" : user.getMaOpenId();
+                if (StringUtils.isBlank(openId)){
+                    Wrapper<FsUserWx> queryWrapper = Wrappers.<FsUserWx>lambdaQuery()
+                            .eq(FsUserWx::getFsUserId, param.getUserId())
+                            .eq(FsUserWx::getAppId, appId);
+                    FsUserWx fsUserWx = fsUserWxMapper.selectOne(queryWrapper);
+                    if (Objects.nonNull(fsUserWx)){
+                        openId = fsUserWx.getOpenId();
+                    }
+                }
+            }
+        }
+
+        if ("hf".equals(merchantAppConfig.getMerchantType()) && "wx".equals(param.getPayType()) && StringUtils.isBlank(openId)) {
+            return R.error("用户OPENID不存在");
+        }
+
+        String payCode = OrderCodeUtils.getOrderSn();
+        if (StringUtils.isEmpty(payCode)) {
+            return R.error("订单生成失败,请重试");
+        }
+
+        FsStorePayment storePayment = new FsStorePayment();
+        storePayment.setStatus(0);
+        storePayment.setPayMode(merchantAppConfig.getMerchantType());
+        storePayment.setBusinessCode(order.getOrderCode());
+        storePayment.setPayCode(payCode);
+        storePayment.setPayMoney(order.getPayMoney());
+        storePayment.setCreateTime(new Date());
+        storePayment.setPayTypeCode("app");
+        storePayment.setBusinessType(5);
+        storePayment.setRemark("会员开通订单支付");
+        storePayment.setPayTypeCode(param.getPayType());
+        storePayment.setUserId(user.getUserId());
+        storePayment.setBusinessId(order.getOrderId().toString());
+        storePayment.setMerchantId(merchantAppConfig.getId());
+        storePayment.setAppId(param.getAppId());
+        if (storePaymentService.insertFsStorePayment(storePayment) > 0) {
+            if (!"hf".equals(merchantAppConfig.getMerchantType()) && !"appPay".equals(merchantAppConfig.getMerchantType())) {
+                return R.error("支付暂不可用!");
+            }
+
+            if ("hf".equals(merchantAppConfig.getMerchantType())) {
+                HuiFuCreateOrder o = new HuiFuCreateOrder();
+                o.setTradeType(param.getPayType().equals("wx") ? "T_MINIAPP" : "A_NATIVE");
+                o.setOpenid(openId);
+                o.setAppId(appId);
+                o.setReqSeqId("appvip-"+storePayment.getPayCode());
+                o.setTransAmt(storePayment.getPayMoney().toString());
+                o.setAppId(param.getAppId());
+                o.setGoodsDesc("会员开通订单支付");
+                HuifuCreateOrderResult result = huiFuService.createOrder(o);
+                FsStorePayment mt=new FsStorePayment();
+                mt.setPaymentId(storePayment.getPaymentId());
+                mt.setTradeNo(result.getHf_seq_id());
+                mt.setAppId(appId);
+                storePaymentService.updateFsStorePayment(mt);
+                return R.ok().put("isPay",0).put("data",result).put("type","hf");
+            } else if ("appPay".equals(merchantAppConfig.getMerchantType()) && "wx".equals(param.getPayType())) {
+                //创建微信订单
+                WxPayConfig payConfig = new WxPayConfig();
+                payConfig.setAppId(appId);
+                payConfig.setMchId(fsPayConfig.getWxAppMchId());
+                payConfig.setMchKey(fsPayConfig.getWxAppMchKey());
+                payConfig.setSubAppId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+                payConfig.setSubMchId(org.apache.commons.lang3.StringUtils.trimToNull(null));
+                payConfig.setKeyPath(null);
+                payConfig.setNotifyUrl(fsPayConfig.getWxAppNotifyUrl());
+                wxPayService.setConfig(payConfig);
+                WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
+                orderRequest.setBody("会员开通订单支付");
+                orderRequest.setOutTradeNo("appvip-"+storePayment.getPayCode());
+                orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(storePayment.getPayMoney().toString()));
+                orderRequest.setTradeType("APP");
+                orderRequest.setSpbillCreateIp(IpUtils.getIpAddr(request));
+                orderRequest.setNotifyUrl(fsPayConfig.getNotifyUrlScrm());
+                //调用统一下单接口,获取"预支付交易会话标识"
+                try {
+                    log.info("会员开通订单支付 调用微信入参:{}", orderRequest.toString());
+                    Object result = wxPayService.createOrder(orderRequest);
+                    return R.ok().put("data",result).put("type","wxApp").put("isPay",0);
+                } catch (WxPayException e) {
+                    e.printStackTrace();
+                    throw new CustomException("会员开通订单支付"+e.getMessage());
+                }
+            } else if ("appPay".equals(merchantAppConfig.getMerchantType()) && "ali".equals(param.getPayType())) {
+                // 实例化客户端
+                AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", fsPayConfig.getAliAppId(), fsPayConfig.getAliPrivateKey(), "json", "utf-8", fsPayConfig.getAliPublicKey(), "RSA2");
+                // 构造请求参数以调用接口
+                AlipayTradeAppPayRequest aliRequest = new AlipayTradeAppPayRequest();
+                AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
+                // 商户订单号
+                model.setOutTradeNo("appvip-" + storePayment.getPayCode());
+                // 订单总金额
+                model.setTotalAmount(storePayment.getPayMoney().toString());
+                // 订单标题
+                model.setSubject("会员开通订单支付");
+                aliRequest.setBizModel(model);
+                aliRequest.setNotifyUrl(fsPayConfig.getAliNotifyUrl());
+
+                try {
+                    log.info("会员开通订单支付 调用微信入参:{}", aliRequest.toString());
+                    AlipayTradeAppPayResponse result = alipayClient.sdkExecute(aliRequest);
+                    if (!result.isSuccess()) {
+                        String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(result);
+                        log.error("支付宝支付调用失败 诊断链接:{}", diagnosisUrl);
+                        throw new CustomException(result.getSubMsg());
+                    }
+
+                    return R.ok().put("isPay", 0).put("data", result).put("type", "aliPay");
+                } catch (Exception e){
+                    log.info("支付宝支付异常: {}", e);
+                    throw new CustomException("支付系统异常,请稍后重试");
+                }
+            }
+        }
+
+        return R.error();
+    }
+
+
     @Override
     public R payment(FsUserVipOrderPayUParam param) {
         FsUserVipOrder order = fsUserVipOrderMapper.selectFsUserVipOrderByOrderId(param.getOrderId());

+ 15 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsStoreAfterSalesServiceImpl.java

@@ -640,6 +640,8 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
                         paymentMap.setRefundTime(DateUtils.getNowDate());
                         paymentMap.setRefundMoney(payment.getPayMoney());
                         fsStorePaymentMapper.updateFsStorePayment(paymentMap);
+
+                        updateStatus(payment);
                     } else {
                         throw new CustomException("退款请求失败" + refundQueryResult.getReturnMsg());
                     }
@@ -669,6 +671,8 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
                         paymentMap.setRefundTime(DateUtils.getNowDate());
                         paymentMap.setRefundMoney(payment.getPayMoney());
                         fsStorePaymentMapper.updateFsStorePayment(paymentMap);
+
+                        updateStatus(payment);
                     } else {
 //                        String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
                         throw new CustomException("支付宝退款请求失败" + response.getSubMsg());
@@ -718,6 +722,17 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
         return i;
     }
 
+    private void updateStatus(FsStorePayment fsStorePayment){
+        switch (fsStorePayment.getBusinessType()){
+            case 1:
+                FsInquiryOrder fsInquiryOrder = new FsInquiryOrder();
+                fsInquiryOrder.setOrderId(Long.valueOf(fsStorePayment.getBusinessId()));
+                fsInquiryOrder.setStatus(-2);
+                fsInquiryOrderMapper.updateFsInquiryOrder(fsInquiryOrder);
+                break;
+        }
+    }
+
     private WxPayService getWxPayService(FsPayConfig fsPayConfig){
         WxPayConfig payConfig = new WxPayConfig();
         payConfig.setAppId(fsPayConfig.getWxAppAppId());

+ 17 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java

@@ -257,6 +257,8 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
 
     @Autowired
     FsInquiryOrderMapper inquiryOrderMapper;
+    @Autowired
+    private FsInquiryOrderMapper fsInquiryOrderMapper;
 
     @Autowired
     private IFsIntegralRedPacketLogService integralRedPacketLogService;
@@ -727,6 +729,8 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
                         paymentMap.setRefundTime(DateUtils.getNowDate());
                         paymentMap.setRefundMoney(fsStorePayment.getPayMoney());
                         fsStorePaymentMapper.updateFsStorePayment(paymentMap);
+
+                        updateStatus(fsStorePayment);
                     } else {
                         throw new CustomException("退款请求失败" + refundQueryResult.getReturnMsg());
                     }
@@ -756,6 +760,8 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
                         paymentMap.setRefundTime(DateUtils.getNowDate());
                         paymentMap.setRefundMoney(fsStorePayment.getPayMoney());
                         fsStorePaymentMapper.updateFsStorePayment(paymentMap);
+
+                        updateStatus(fsStorePayment);
                     } else {
 //                        String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
                         throw new CustomException("支付宝退款请求失败" + response.getSubMsg());
@@ -770,6 +776,17 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
         return R.ok();
     }
 
+    private void updateStatus(FsStorePayment fsStorePayment){
+        switch (fsStorePayment.getBusinessType()){
+            case 1:
+                FsInquiryOrder fsInquiryOrder = new FsInquiryOrder();
+                fsInquiryOrder.setOrderId(Long.valueOf(fsStorePayment.getBusinessId()));
+                fsInquiryOrder.setStatus(-2);
+                fsInquiryOrderMapper.updateFsInquiryOrder(fsInquiryOrder);
+                break;
+        }
+    }
+
 
     private WxPayService getWxPayService(FsPayConfig fsPayConfig){
 

+ 9 - 0
fs-user-app/src/main/java/com/fs/app/controller/CourseOrderController.java

@@ -110,4 +110,13 @@ public class CourseOrderController extends  AppBaseController{
         return R.ok().put("order",order);
     }
 
+    @Login
+    @ApiOperation("app支付")
+    @PostMapping("/appPayment")
+    public R appPayment(@Validated @RequestBody FsUserCourseOrderDoPayParam param,HttpServletRequest request)
+    {
+        param.setUserId(Long.parseLong(getUserId()));
+        return courseOrderService.appPayment(param,request);
+    }
+
 }

+ 9 - 0
fs-user-app/src/main/java/com/fs/app/controller/UserVipController.java

@@ -127,6 +127,15 @@ public class UserVipController extends  AppBaseController{
         return R.ok();
     }
 
+    @Login
+    @ApiOperation("app支付")
+    @PostMapping("/appPayment")
+    public R appPayment(@Validated @RequestBody FsUserVipOrderPayUParam param,HttpServletRequest request)
+    {
+        param.setUserId(Long.parseLong(getUserId()));
+        return fsUserVipOrderService.appPayment(param,request);
+    }
+
     public boolean isSameYearMonthDay(LocalDate date1, LocalDate date2) {
         return date1.isEqual(date2);
     }