|
|
@@ -42,8 +42,11 @@ import com.fs.course.mapper.FsCoursePlaySourceConfigMapper;
|
|
|
import com.fs.course.mapper.FsCourseRedPacketLogMapper;
|
|
|
import com.fs.course.service.IFsCourseRedPacketLogService;
|
|
|
import com.fs.his.domain.*;
|
|
|
+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;
|
|
|
@@ -77,6 +80,7 @@ import com.github.binarywang.wxpay.exception.WxPayException;
|
|
|
import com.github.binarywang.wxpay.service.TransferService;
|
|
|
import com.github.binarywang.wxpay.service.WxPayService;
|
|
|
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
|
|
|
+import com.hc.openapi.tool.fastjson.JSON;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import me.chanjar.weixin.common.error.WxErrorException;
|
|
|
import org.slf4j.Logger;
|
|
|
@@ -104,7 +108,8 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
|
|
|
Logger logger = LoggerFactory.getLogger(getClass());
|
|
|
@Autowired
|
|
|
private WxPayService wxPayService;
|
|
|
-
|
|
|
+ @Autowired
|
|
|
+ private FsUserWxMapper userWxMapper;
|
|
|
@Autowired
|
|
|
private FsCoursePlaySourceConfigMapper fsCoursePlaySourceConfigMapper;
|
|
|
@Autowired
|
|
|
@@ -1102,4 +1107,256 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 发起支付
|
|
|
+ * @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("用户不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ FsPayConfig payConfig=new FsPayConfig();
|
|
|
+ //支付宝可以不需要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 (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);
|
|
|
+ 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 = createStorePaymentScrm(payConfig, user, payOrderParam);
|
|
|
+
|
|
|
+ // 根据配置类型创建第三方支付订单
|
|
|
+ return createThirdPartyPaymentScrm(payConfig, storePayment, user, payOrderParam);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断是否微信支付
|
|
|
+ * @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 "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";
|
|
|
+ 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());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建微信支付配置
|
|
|
+ */
|
|
|
+ private WxPayConfig buildWxPayConfig(FsPayConfig fsPayConfig) {
|
|
|
+ WxPayConfig payConfig = new WxPayConfig();
|
|
|
+ payConfig.setAppId(fsPayConfig.getAppId());
|
|
|
+ payConfig.setMchId(fsPayConfig.getWxMchId());
|
|
|
+ payConfig.setMchKey(fsPayConfig.getWxMchKey());
|
|
|
+ payConfig.setSubAppId(StringUtils.trimToNull(null));
|
|
|
+ payConfig.setSubMchId(StringUtils.trimToNull(null));
|
|
|
+ payConfig.setKeyPath(null);
|
|
|
+ payConfig.setNotifyUrl(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();
|
|
|
+ storePayment.setStatus(0);
|
|
|
+ storePayment.setPayMode(payConfig.getType());
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+
|
|
|
}
|