|
|
@@ -3,6 +3,7 @@ package com.fs.hisStore.service.impl;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
|
+import java.time.LocalDateTime;
|
|
|
import java.time.ZoneId;
|
|
|
import java.time.ZonedDateTime;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
@@ -16,6 +17,7 @@ import cn.binarywang.wx.miniapp.bean.shop.request.shipping.*;
|
|
|
import cn.binarywang.wx.miniapp.bean.shop.request.shipping.*;
|
|
|
import cn.binarywang.wx.miniapp.bean.shop.response.WxMaOrderShippingInfoBaseResponse;
|
|
|
import cn.hutool.core.util.IdUtil;
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.alibaba.fastjson.TypeReference;
|
|
|
@@ -36,6 +38,7 @@ import com.fs.common.utils.StringUtils;
|
|
|
import com.fs.common.utils.ip.IpUtils;
|
|
|
import com.fs.company.domain.Company;
|
|
|
import com.fs.company.domain.CompanyUser;
|
|
|
+import com.fs.company.domain.RechargeRecord;
|
|
|
import com.fs.company.mapper.CompanyConfigMapper;
|
|
|
import com.fs.company.service.ICompanyService;
|
|
|
import com.fs.company.service.ICompanyUserService;
|
|
|
@@ -47,24 +50,31 @@ import com.fs.course.domain.FsCourseRedPacketLog;
|
|
|
import com.fs.course.mapper.FsCoursePlaySourceConfigMapper;
|
|
|
import com.fs.course.mapper.FsCourseRedPacketLogMapper;
|
|
|
import com.fs.course.service.IFsCourseRedPacketLogService;
|
|
|
+import com.fs.his.config.AppConfig;
|
|
|
import com.fs.his.domain.*;
|
|
|
import com.fs.his.domain.FsPayConfig;
|
|
|
import com.fs.his.domain.FsUser;
|
|
|
import com.fs.his.domain.FsUserWx;
|
|
|
import com.fs.his.domain.MerchantAppConfig;
|
|
|
+import com.fs.his.dto.PayConfigDTO;
|
|
|
+import com.fs.his.enums.PaymentMethodEnum;
|
|
|
import com.fs.his.mapper.FsUserWxMapper;
|
|
|
import com.fs.his.mapper.MerchantAppConfigMapper;
|
|
|
+import com.fs.his.param.PayOrderParam;
|
|
|
import com.fs.his.service.IFsUserService;
|
|
|
import com.fs.his.service.IFsUserWxService;
|
|
|
import com.fs.his.utils.ConfigUtil;
|
|
|
import com.fs.hisStore.config.StoreConfig;
|
|
|
import com.fs.hisStore.config.StoreConfig;
|
|
|
+import com.fs.hisStore.domain.FsStoreOrderScrm;
|
|
|
import com.fs.hisStore.domain.FsStorePaymentScrm;
|
|
|
import com.fs.hisStore.domain.FsUserScrm;
|
|
|
+import com.fs.hisStore.enums.OrderInfoEnum;
|
|
|
import com.fs.hisStore.enums.StatTypeEnum;
|
|
|
import com.fs.his.utils.HttpUtil;
|
|
|
import com.fs.hisStore.config.StoreConfig;
|
|
|
import com.fs.hisStore.enums.SysConfigEnum;
|
|
|
+import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
|
|
|
import com.fs.hisStore.mapper.FsStorePaymentScrmMapper;
|
|
|
import com.fs.hisStore.param.*;
|
|
|
import com.fs.hisStore.service.IFsStorePaymentScrmService;
|
|
|
@@ -73,6 +83,10 @@ import com.fs.huifuPay.domain.HuiFuCreateOrder;
|
|
|
import com.fs.huifuPay.domain.HuifuCreateOrderResult;
|
|
|
import com.fs.huifuPay.sdk.opps.core.utils.HuiFuUtils;
|
|
|
import com.fs.huifuPay.service.HuiFuService;
|
|
|
+import com.fs.live.domain.LiveOrder;
|
|
|
+import com.fs.live.domain.LiveOrderPayment;
|
|
|
+import com.fs.live.mapper.LiveOrderMapper;
|
|
|
+import com.fs.live.mapper.LiveOrderPaymentMapper;
|
|
|
import com.fs.pay.pay.dto.WxJspayDTO;
|
|
|
import com.fs.pay.service.IPayService;
|
|
|
import com.fs.system.oss.CloudStorageService;
|
|
|
@@ -99,6 +113,7 @@ import com.github.binarywang.wxpay.service.WxPayService;
|
|
|
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
|
|
|
import com.google.common.reflect.TypeToken;
|
|
|
import com.google.gson.Gson;
|
|
|
+import com.hc.openapi.tool.fastjson.JSON;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import me.chanjar.weixin.common.error.WxErrorException;
|
|
|
@@ -128,6 +143,12 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
|
|
|
Logger logger = LoggerFactory.getLogger(getClass());
|
|
|
@Autowired
|
|
|
private WxPayService wxPayService;
|
|
|
+ @Autowired
|
|
|
+ private FsUserWxMapper userWxMapper;
|
|
|
+ @Autowired
|
|
|
+ private LiveOrderPaymentMapper liveOrderPaymentMapper;
|
|
|
+// @Autowired
|
|
|
+// private RechargeRecordMapper rechargeRecordMapper;
|
|
|
|
|
|
@Autowired
|
|
|
private FsCoursePlaySourceConfigMapper fsCoursePlaySourceConfigMapper;
|
|
|
@@ -160,6 +181,10 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
|
|
|
|
|
|
@Autowired
|
|
|
private RedisCache redisCache;
|
|
|
+ @Autowired
|
|
|
+ private LiveOrderMapper liveOrderMapper;
|
|
|
+ @Autowired
|
|
|
+ private FsStoreOrderScrmMapper storeOrderScrmMapper;
|
|
|
|
|
|
/**
|
|
|
* 查询支付明细
|
|
|
@@ -1398,4 +1423,506 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
|
|
|
return WxShippingErrorHandler.handleExceptionError(e.getMessage(), dto.getBankTransactionId());
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 发起支付
|
|
|
+ * @param payOrderParam 入参
|
|
|
+ * @return R
|
|
|
+ */
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public R processPaymentScrm( PayOrderParam payOrderParam) {
|
|
|
+ logger.info("发起支付 payOrderParam: {}", JSON.toJSONString(payOrderParam));
|
|
|
+
|
|
|
+ if (payOrderParam.getAmount().compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
+ throw new CustomException("支付金额不正确");
|
|
|
+ }
|
|
|
+
|
|
|
+ FsUserScrm user = userService.selectFsUserById(payOrderParam.getUserId());
|
|
|
+ if (Objects.isNull(user)) {
|
|
|
+ throw new CustomException("用户不存在");
|
|
|
+ }
|
|
|
+ if (PaymentMethodEnum.CZ_PAY == payOrderParam.getPaymentMethod()) {
|
|
|
+ if (user.getRechargeBalance().compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
+ throw new CustomException("余额不足!请先充值。");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String type = null;
|
|
|
+ FsPayConfig payConfig = new FsPayConfig();
|
|
|
+ if (PaymentMethodEnum.WX_APP == payOrderParam.getPaymentMethod()) {
|
|
|
+ String json = configService.selectConfigByKey("app.config");
|
|
|
+ AppConfig config = JSONUtil.toBean(json, AppConfig.class);
|
|
|
+ payOrderParam.setAppId(config.getAppId());
|
|
|
+ type = "wxApp";
|
|
|
+ }
|
|
|
+ //支付宝可以不需要appid(在没有appid的情况下)【ps:小程序的支付宝没传appid 就G】
|
|
|
+ if ((PaymentMethodEnum.ALIPAY == payOrderParam.getPaymentMethod())
|
|
|
+ && StringUtils.isBlank(payOrderParam.getAppId())) {
|
|
|
+ String json = configService.selectConfigByKey("his.pay");
|
|
|
+ PayConfigDTO payConfigDTO = JSONUtil.toBean(json, PayConfigDTO.class);
|
|
|
+ payConfig.setType(payConfigDTO.getType());
|
|
|
+ }else if(!(PaymentMethodEnum.CZ_PAY == payOrderParam.getPaymentMethod())){
|
|
|
+ if (StringUtils.isBlank(payOrderParam.getAppId())) {
|
|
|
+ throw new IllegalArgumentException("appId不能为空");
|
|
|
+ }
|
|
|
+ FsCoursePlaySourceConfig fsCoursePlaySourceConfig = fsCoursePlaySourceConfigMapper.selectCoursePlaySourceConfigByAppId(payOrderParam.getAppId());
|
|
|
+ if (fsCoursePlaySourceConfig == null) {
|
|
|
+ throw new CustomException("未找到appId对应的小程序配置: " + payOrderParam.getAppId());
|
|
|
+ }
|
|
|
+ Long merchantConfigId = fsCoursePlaySourceConfig.getMerchantConfigId();
|
|
|
+ if (merchantConfigId == null || merchantConfigId <= 0) {
|
|
|
+ throw new CustomException("小程序没有配置商户信息");
|
|
|
+ }
|
|
|
+
|
|
|
+ MerchantAppConfig merchantAppConfig = merchantAppConfigMapper.selectMerchantAppConfigById(fsCoursePlaySourceConfig.getMerchantConfigId());
|
|
|
+ payConfig = JSON.parseObject(merchantAppConfig.getDataJson(), FsPayConfig.class);
|
|
|
+ if (StringUtils.isNotEmpty(type)) {
|
|
|
+ payConfig.setType(type);
|
|
|
+ } else {
|
|
|
+ payConfig.setType(merchantAppConfig.getMerchantType());
|
|
|
+ }
|
|
|
+ payConfig.setAppId(fsCoursePlaySourceConfig.getAppid());
|
|
|
+
|
|
|
+ logger.debug("支付配置 his.pay: {}", payConfig);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+// FsPayConfig payConfig = JSONUtil.toBean(json, FsPayConfig.class);
|
|
|
+
|
|
|
+ if (isWechatPayment(payOrderParam.getPaymentMethod())) {
|
|
|
+ String openId = getOpenIdForPaymentMethod(user, payOrderParam.getPaymentMethod(), payConfig);
|
|
|
+ if (StringUtils.isBlank(openId)) {
|
|
|
+ throw new CustomException("用户OPENID不存在");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ FsStorePaymentScrm storePayment = new FsStorePaymentScrm();
|
|
|
+
|
|
|
+ // 1. 根据业务类型创建对应的支付对象
|
|
|
+ if (payOrderParam.getBusinessType().getPrefix().equals("live")) {
|
|
|
+ // 处理直播业务支付
|
|
|
+ LiveOrderPayment liveOrderPayment = createLiveStorePayment(payConfig, user, payOrderParam);
|
|
|
+ BeanUtils.copyProperties(liveOrderPayment, storePayment);
|
|
|
+
|
|
|
+ // 处理储值支付
|
|
|
+ if (isRechargePayment(payOrderParam)) {
|
|
|
+ return processLiveRechargePayment(liveOrderPayment, user);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 处理商城业务支付
|
|
|
+ storePayment = createStorePaymentScrm(payConfig, user, payOrderParam);
|
|
|
+
|
|
|
+// // 处理储值支付
|
|
|
+// if (isRechargePayment(payOrderParam)) {
|
|
|
+// return processStoreRechargePayment(storePayment, user);
|
|
|
+// }
|
|
|
+ }
|
|
|
+ // 根据配置类型创建第三方支付订单
|
|
|
+ return createThirdPartyPaymentScrm(payConfig, storePayment, user, payOrderParam);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断是否为储值支付
|
|
|
+ * @param payOrderParam 支付订单参数
|
|
|
+ * @return true:储值支付 false:其他支付方式
|
|
|
+ */
|
|
|
+ private boolean isRechargePayment(PayOrderParam payOrderParam) {
|
|
|
+ return PaymentMethodEnum.CZ_PAY == payOrderParam.getPaymentMethod();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理直播储值支付
|
|
|
+ * @param liveOrderPayment 直播订单支付信息
|
|
|
+ * @param user 用户信息
|
|
|
+ * @return 支付处理结果
|
|
|
+ */
|
|
|
+ private R processLiveRechargePayment(LiveOrderPayment liveOrderPayment, FsUserScrm user) {
|
|
|
+ // 查询直播订单信息
|
|
|
+ LiveOrder liveOrder = liveOrderMapper.selectLiveOrderByOrderId(liveOrderPayment.getBusinessId());
|
|
|
+ Company company = companyService.selectCompanyById(liveOrder.getCompanyId());
|
|
|
+
|
|
|
+ // 扣减用户储值余额
|
|
|
+ deductUserRechargeBalance(user, liveOrder.getPayMoney());
|
|
|
+
|
|
|
+ // 更新直播订单状态
|
|
|
+ updateLiveOrderStatus(liveOrder);
|
|
|
+
|
|
|
+ // 创建消费记录
|
|
|
+ return R.ok();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理商城储值支付
|
|
|
+ * @param storePayment 商城订单支付信息
|
|
|
+ * @param user 用户信息
|
|
|
+ * @return 支付处理结果
|
|
|
+ */
|
|
|
+ private R processStoreRechargePayment(FsStorePaymentScrm storePayment, FsUserScrm user) {
|
|
|
+ // 查询商城订单信息
|
|
|
+ FsStoreOrderScrm fsStoreOrderScrm = storeOrderScrmMapper.selectFsStoreOrderById(storePayment.getOrderId());
|
|
|
+ Company company = companyService.selectCompanyById(fsStoreOrderScrm.getCompanyId());
|
|
|
+
|
|
|
+ // 扣减用户储值余额
|
|
|
+ deductUserRechargeBalance(user, storePayment.getPayMoney());
|
|
|
+
|
|
|
+ // 更新商城订单状态
|
|
|
+ updateStoreOrderStatus(fsStoreOrderScrm);
|
|
|
+
|
|
|
+ // 创建消费记录
|
|
|
+ return R.ok();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 扣减用户储值余额
|
|
|
+ * @param user 用户信息
|
|
|
+ * @param amount 扣减金额
|
|
|
+ */
|
|
|
+ private void deductUserRechargeBalance(FsUserScrm user, BigDecimal amount) {
|
|
|
+ user.setRechargeBalance(user.getRechargeBalance().subtract(amount));
|
|
|
+ userService.updateFsUser(user);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新直播订单状态
|
|
|
+ * @param liveOrder 直播订单
|
|
|
+ */
|
|
|
+ private void updateLiveOrderStatus(LiveOrder liveOrder) {
|
|
|
+ liveOrder.setStatus(OrderInfoEnum.STATUS_1.getValue());
|
|
|
+ liveOrder.setPayTime(LocalDateTime.now());
|
|
|
+ liveOrder.setIsPay("1");
|
|
|
+ liveOrderMapper.updateLiveOrder(liveOrder);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新商城订单状态
|
|
|
+ * @param storeOrder 商城订单
|
|
|
+ */
|
|
|
+ private void updateStoreOrderStatus(FsStoreOrderScrm storeOrder) {
|
|
|
+ storeOrder.setPaid(OrderInfoEnum.PAY_STATUS_1.getValue());
|
|
|
+ storeOrder.setStatus(OrderInfoEnum.STATUS_1.getValue());
|
|
|
+ storeOrder.setPayTime(new Date());
|
|
|
+ storeOrderScrmMapper.updateFsStoreOrder(storeOrder);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 订单支付成功后,增加消费记录
|
|
|
+ * @param orderId 订单ID
|
|
|
+ * @param orderNo 订单编号
|
|
|
+ * @param userId 用户ID
|
|
|
+ * @param userName 用户姓名
|
|
|
+ * @param amount 消费金额
|
|
|
+ * @return 影响行数
|
|
|
+ */
|
|
|
+// public int createConsumptionRecord(Long orderId, String orderNo, Long userId,
|
|
|
+// String userName, BigDecimal amount,Company company
|
|
|
+// ) {
|
|
|
+// RechargeRecord record = new RechargeRecord();
|
|
|
+// record.setUserId(userId);
|
|
|
+// record.setUserName(userName);
|
|
|
+// record.setTotalAmount(amount);
|
|
|
+// record.setTransactionId(generateTransactionId());
|
|
|
+// record.setOrderId(orderId);
|
|
|
+// record.setOrderNo(orderNo);
|
|
|
+// record.setBusinessType(1); // 1-消费
|
|
|
+// if (ObjectUtil.isEmpty(company)){
|
|
|
+// record.setRemark("订单消费,自主下单没有归属公司");
|
|
|
+// }else {
|
|
|
+// record.setCompanyId(company.getCompanyId());
|
|
|
+// record.setCompanyName(company.getCompanyName());
|
|
|
+// record.setRemark("订单消费");
|
|
|
+// }
|
|
|
+// record.setCreateTime(new Date());
|
|
|
+// record.setDelFlag("0");
|
|
|
+//
|
|
|
+// return rechargeRecordMapper.insertRechargeRecord(record);
|
|
|
+// }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成交易流水号
|
|
|
+ * @return 交易流水号
|
|
|
+ */
|
|
|
+ private String generateTransactionId() {
|
|
|
+ return "TXF" + System.currentTimeMillis() + UUID.randomUUID().toString().substring(0, 8).toUpperCase();
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 直播订单支付信息
|
|
|
+ *
|
|
|
+ * @param payConfig
|
|
|
+ * @param user
|
|
|
+ * @param payOrderParam
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private LiveOrderPayment createLiveStorePayment(FsPayConfig payConfig, FsUserScrm user, PayOrderParam payOrderParam) {
|
|
|
+ String payCode = OrderCodeUtils.getOrderSn();
|
|
|
+ if (StringUtils.isEmpty(payCode)) {
|
|
|
+ throw new CustomException("订单生成失败,请重试");
|
|
|
+ }
|
|
|
+
|
|
|
+ LiveOrderPayment storePayment = new LiveOrderPayment();
|
|
|
+
|
|
|
+ if (PaymentMethodEnum.CZ_PAY == payOrderParam.getPaymentMethod()){
|
|
|
+ storePayment.setStatus(1);
|
|
|
+ storePayment.setPayMode("cz");
|
|
|
+ }else {
|
|
|
+ storePayment.setStatus(0);
|
|
|
+ storePayment.setPayMode(payConfig.getType());
|
|
|
+ }
|
|
|
+ storePayment.setAppId(payConfig.getAppId());
|
|
|
+ storePayment.setBusinessCode(payOrderParam.getOrderCode());
|
|
|
+ storePayment.setPayCode(payCode);
|
|
|
+ storePayment.setPayMoney(payOrderParam.getAmount());
|
|
|
+ storePayment.setCreateTime(new Date());
|
|
|
+ storePayment.setPayTypeCode(payOrderParam.getPaymentMethod().getDesc());
|
|
|
+ storePayment.setBusinessType(payOrderParam.getBusinessType().getCode());
|
|
|
+ storePayment.setCompanyId(payOrderParam.getCompanyId());
|
|
|
+ storePayment.setCompanyUserId(payOrderParam.getCompanyUserId());
|
|
|
+ storePayment.setRemark(payOrderParam.getBusinessType().getDesc());
|
|
|
+ storePayment.setStoreId(payOrderParam.getStoreId());
|
|
|
+ storePayment.setUserId(user.getUserId());
|
|
|
+ storePayment.setBusinessId(payOrderParam.getOrderId().toString());
|
|
|
+
|
|
|
+ // 设置openId(如果是微信支付)
|
|
|
+ if (isWechatPayment(payOrderParam.getPaymentMethod())) {
|
|
|
+ storePayment.setOpenId(getOpenIdForPaymentMethod(user, payOrderParam.getPaymentMethod(), payConfig));
|
|
|
+ }
|
|
|
+
|
|
|
+ if (liveOrderPaymentMapper.insertLiveOrderPayment(storePayment) <= 0) {
|
|
|
+ throw new CustomException("支付订单创建失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ return storePayment;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断是否微信支付
|
|
|
+ * @param method 支付类型
|
|
|
+ * @return boolean
|
|
|
+ */
|
|
|
+ private boolean isWechatPayment(PaymentMethodEnum method) {
|
|
|
+ return method == PaymentMethodEnum.MINIAPP_WECHAT || method == PaymentMethodEnum.H5_WECHAT;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据支付方式获取对应的openId
|
|
|
+ */
|
|
|
+ private String getOpenIdForPaymentMethod(FsUserScrm user, PaymentMethodEnum method, FsPayConfig payConfig) {
|
|
|
+ String openId;
|
|
|
+ switch (method) {
|
|
|
+ case MINIAPP_WECHAT:
|
|
|
+ openId = user.getMaOpenId();
|
|
|
+ break;
|
|
|
+ case H5_WECHAT:
|
|
|
+ openId = user.getMpOpenId();
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ openId = null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (StringUtils.isBlank(openId)) {
|
|
|
+ Wrapper<FsUserWx> queryWrapper = Wrappers.<FsUserWx>lambdaQuery()
|
|
|
+ .eq(FsUserWx::getFsUserId, user.getUserId())
|
|
|
+ .eq(FsUserWx::getAppId, payConfig.getAppId());
|
|
|
+ FsUserWx fsUserWx = userWxMapper.selectOne(queryWrapper);
|
|
|
+ if (Objects.nonNull(fsUserWx)) {
|
|
|
+ openId = fsUserWx.getOpenId();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return openId;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 发起预支付
|
|
|
+ */
|
|
|
+ private R createThirdPartyPaymentScrm(FsPayConfig payConfig, FsStorePaymentScrm storePayment, FsUserScrm user, PayOrderParam payOrderParam) {
|
|
|
+ switch (payConfig.getType()) {
|
|
|
+ case "wx":
|
|
|
+ return createWxPayment(storePayment, user, payOrderParam, payConfig);
|
|
|
+ case "wxApp":
|
|
|
+ return createWxAppPayment(storePayment, user, payOrderParam, payConfig);
|
|
|
+ case "hf":
|
|
|
+ return createHfPayment(storePayment, user, payOrderParam, payConfig);
|
|
|
+ default:
|
|
|
+ throw new CustomException("不支持的支付方式");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 汇付
|
|
|
+ */
|
|
|
+ private R createHfPayment(FsStorePaymentScrm storePayment, FsUserScrm user, PayOrderParam payOrderParam, FsPayConfig payConfig) {
|
|
|
+ logger.debug("创建汇付订单");
|
|
|
+
|
|
|
+ HuiFuCreateOrder order = new HuiFuCreateOrder();
|
|
|
+ order.setTradeType(getHfTradeType(payOrderParam.getPaymentMethod()));
|
|
|
+ order.setReqSeqId(payOrderParam.getBusinessType().getPrefix() + "-" + storePayment.getPayCode());
|
|
|
+ order.setTransAmt(storePayment.getPayMoney().toString());
|
|
|
+ order.setGoodsDesc(payOrderParam.getBusinessType().getDesc());
|
|
|
+
|
|
|
+ // 微信支付需要设置openid
|
|
|
+ if (isWechatPayment(payOrderParam.getPaymentMethod())) {
|
|
|
+ order.setOpenid(getOpenIdForPaymentMethod(user, payOrderParam.getPaymentMethod(), payConfig));
|
|
|
+ }
|
|
|
+
|
|
|
+ HuifuCreateOrderResult result = huiFuService.createOrder(order);
|
|
|
+ logger.debug("汇付支付创建结果: {}", result);
|
|
|
+
|
|
|
+ updateStorePaymentTradeNo(storePayment.getPaymentId(), result.getHf_seq_id());
|
|
|
+ return R.ok().put("isPay", 0).put("data", result).put("type", "hf");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取汇付交易类型
|
|
|
+ */
|
|
|
+ private String getHfTradeType(PaymentMethodEnum paymentMethod) {
|
|
|
+ switch (paymentMethod) {
|
|
|
+ case MINIAPP_WECHAT:
|
|
|
+ return "T_MINIAPP";
|
|
|
+ case H5_WECHAT:
|
|
|
+ return "T_JSAPI";
|
|
|
+ case ALIPAY:
|
|
|
+ case H5_ALIPAY:
|
|
|
+ return "A_NATIVE";
|
|
|
+ case T_NATIVE:
|
|
|
+ return "T_NATIVE";
|
|
|
+ default:
|
|
|
+ throw new CustomException("不支持的支付方式");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新支付订单交易号
|
|
|
+ */
|
|
|
+ private void updateStorePaymentTradeNo(Long paymentId, String tradeNo) {
|
|
|
+ FsStorePaymentScrm updatePayment = new FsStorePaymentScrm();
|
|
|
+ updatePayment.setPaymentId(paymentId);
|
|
|
+ updatePayment.setTradeNo(tradeNo);
|
|
|
+ fsStorePaymentMapper.updateFsStorePayment(updatePayment);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 微信支付
|
|
|
+ */
|
|
|
+ private R createWxPayment(FsStorePaymentScrm storePayment, FsUserScrm user, PayOrderParam payOrderParam, FsPayConfig payConfig) {
|
|
|
+ PaymentMethodEnum paymentMethod = payOrderParam.getPaymentMethod();
|
|
|
+ if (paymentMethod != PaymentMethodEnum.MINIAPP_WECHAT) {
|
|
|
+ logger.debug("微信支付 PaymentMethod: {}", paymentMethod.name());
|
|
|
+ throw new CustomException("不支持的支付方式");
|
|
|
+ }
|
|
|
+
|
|
|
+ WxPayConfig wxPayConfig = buildWxPayConfig(payConfig);
|
|
|
+ wxPayService.setConfig(wxPayConfig);
|
|
|
+
|
|
|
+ WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
|
|
|
+ orderRequest.setOpenid(getOpenIdForPaymentMethod(user, paymentMethod, payConfig));
|
|
|
+ orderRequest.setBody(payOrderParam.getBusinessType().getDesc());
|
|
|
+ orderRequest.setOutTradeNo(payOrderParam.getBusinessType().getPrefix() + "-" + storePayment.getPayCode());
|
|
|
+ orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(storePayment.getPayMoney().toString()));
|
|
|
+ orderRequest.setTradeType("JSAPI");
|
|
|
+ orderRequest.setSpbillCreateIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
|
|
|
+
|
|
|
+ try {
|
|
|
+ WxPayMpOrderResult orderResult = wxPayService.createOrder(orderRequest);
|
|
|
+ return R.ok().put("data", orderResult).put("type", "wx").put("isPay", 0);
|
|
|
+ } catch (WxPayException e) {
|
|
|
+ logger.error("微信支付发起失败: {}", e.getMessage(), e);
|
|
|
+ throw new CustomException("支付失败: " + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 微信App支付
|
|
|
+ */
|
|
|
+ private R createWxAppPayment(FsStorePaymentScrm storePayment, FsUserScrm user, PayOrderParam payOrderParam, FsPayConfig payConfig) {
|
|
|
+ //创建微信订单
|
|
|
+ WxPayConfig wxPayConfig = buildWxPayConfig(payConfig);
|
|
|
+
|
|
|
+ wxPayConfig.setAppId(wxPayConfig.getAppId());
|
|
|
+ wxPayConfig.setMchId(wxPayConfig.getMchId());
|
|
|
+ wxPayConfig.setMchKey(wxPayConfig.getMchKey());
|
|
|
+ wxPayConfig.setSubAppId(StringUtils.trimToNull(null));
|
|
|
+ wxPayConfig.setSubMchId(StringUtils.trimToNull(null));
|
|
|
+ wxPayConfig.setKeyPath(null);
|
|
|
+ wxPayConfig.setNotifyUrl(wxPayConfig.getNotifyUrl());
|
|
|
+ wxPayService.setConfig(wxPayConfig);
|
|
|
+ WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
|
|
|
+ orderRequest.setBody(payOrderParam.getBusinessType().getDesc());
|
|
|
+ orderRequest.setOutTradeNo(payOrderParam.getBusinessType().getPrefix() + "-" + storePayment.getPayCode());
|
|
|
+ orderRequest.setTotalFee(WxPayUnifiedOrderRequest.yuanToFen(storePayment.getPayMoney().toString()));
|
|
|
+ orderRequest.setTradeType("APP");
|
|
|
+ orderRequest.setSpbillCreateIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
|
|
|
+ orderRequest.setNotifyUrl(wxPayConfig.getNotifyUrl());
|
|
|
+ //调用统一下单接口,获取"预支付交易会话标识"
|
|
|
+ try {
|
|
|
+ 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());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建微信支付配置
|
|
|
+ */
|
|
|
+ private WxPayConfig buildWxPayConfig(FsPayConfig fsPayConfig) {
|
|
|
+ WxPayConfig payConfig = new WxPayConfig();
|
|
|
+ payConfig.setAppId(StringUtils.trimToNull(fsPayConfig.getAppId()));
|
|
|
+ payConfig.setMchId(StringUtils.trimToNull(fsPayConfig.getWxMchId()));
|
|
|
+ payConfig.setMchKey(StringUtils.trimToNull(fsPayConfig.getWxMchKey()));
|
|
|
+ payConfig.setSubAppId(StringUtils.trimToNull(null));
|
|
|
+ payConfig.setSubMchId(StringUtils.trimToNull(null));
|
|
|
+ payConfig.setKeyPath(null);
|
|
|
+ payConfig.setNotifyUrl(StringUtils.trimToNull(fsPayConfig.getNotifyUrlScrm()));
|
|
|
+ return payConfig;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建支付订单
|
|
|
+ */
|
|
|
+ private FsStorePaymentScrm createStorePaymentScrm(FsPayConfig payConfig, FsUserScrm user, PayOrderParam payOrderParam) {
|
|
|
+ String payCode = OrderCodeUtils.getOrderSn();
|
|
|
+ if (StringUtils.isEmpty(payCode)) {
|
|
|
+ throw new CustomException("订单生成失败,请重试");
|
|
|
+ }
|
|
|
+
|
|
|
+ FsStorePaymentScrm storePayment = new FsStorePaymentScrm();
|
|
|
+ if (PaymentMethodEnum.CZ_PAY == payOrderParam.getPaymentMethod()){
|
|
|
+ storePayment.setStatus(1);
|
|
|
+ storePayment.setPayMode("cz");
|
|
|
+ }else {
|
|
|
+ storePayment.setStatus(0);
|
|
|
+ storePayment.setPayMode(payConfig.getType());
|
|
|
+ }
|
|
|
+ storePayment.setAppId(payConfig.getAppId());
|
|
|
+ storePayment.setOrderId(payOrderParam.getOrderId());
|
|
|
+ storePayment.setBusinessCode(payOrderParam.getOrderCode());
|
|
|
+ storePayment.setPayCode(payCode);
|
|
|
+ storePayment.setPayMoney(payOrderParam.getAmount());
|
|
|
+ storePayment.setCreateTime(new Date());
|
|
|
+ storePayment.setPayTypeCode(payOrderParam.getPaymentMethod().getDesc());
|
|
|
+ storePayment.setBusinessType(payOrderParam.getBusinessType().getCode());
|
|
|
+ storePayment.setCompanyId(payOrderParam.getCompanyId());
|
|
|
+ storePayment.setCompanyUserId(payOrderParam.getCompanyUserId());
|
|
|
+ storePayment.setRemark(payOrderParam.getBusinessType().getDesc());
|
|
|
+ storePayment.setStoreId(payOrderParam.getStoreId());
|
|
|
+ storePayment.setUserId(user.getUserId());
|
|
|
+ storePayment.setBusinessId(payOrderParam.getOrderId().toString());
|
|
|
+
|
|
|
+ // 设置openId(如果是微信支付)
|
|
|
+ if (isWechatPayment(payOrderParam.getPaymentMethod())) {
|
|
|
+ storePayment.setOpenId(getOpenIdForPaymentMethod(user, payOrderParam.getPaymentMethod(), payConfig));
|
|
|
+ }
|
|
|
+
|
|
|
+ if (fsStorePaymentMapper.insertFsStorePayment(storePayment) <= 0) {
|
|
|
+ throw new CustomException("支付订单创建失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ return storePayment;
|
|
|
+ }
|
|
|
}
|