diff --git a/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java b/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java index 7c8058913..4c235345b 100644 --- a/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java +++ b/jsowell-admin/src/main/java/com/jsowell/service/MemberService.java @@ -608,8 +608,11 @@ public class MemberService { } log.info("使用汇付支付充值余额 支付配置参数:{}", JSON.toJSONString(config)); + // 查询延时支付模式,由一级运营商配置决定 + String payMode = pileMerchantInfoService.getDelayModeByWechatAppId(dto.getWechatAppId()); + // 封装对象 - String payMode = Constants.ADAPAY_PAY_MODE_DELAY; // 汇付延时分账 + // String payMode = Constants.ADAPAY_PAY_MODE_DELAY; // 汇付延时分账 CreateAdaPaymentParam createAdaPaymentParam = new CreateAdaPaymentParam(); createAdaPaymentParam.setOrder_no(SnowflakeIdWorker.getSnowflakeId()); createAdaPaymentParam.setPay_amt(AdapayUtil.formatAmount(dto.getAmount())); @@ -627,7 +630,9 @@ public class MemberService { map.put("memberId", dto.getMemberId()); createAdaPaymentParam.setDescription(JSON.toJSONString(map)); // 延时分账 - createAdaPaymentParam.setPay_mode(payMode); + if (StringUtils.isNotBlank(payMode)) { + createAdaPaymentParam.setPay_mode(payMode); + } try { log.info("创建汇付支付参数:{}", JSONObject.toJSONString(createAdaPaymentParam)); Map response = Payment.create(BeanMap.create(createAdaPaymentParam), config.getWechatAppId()); diff --git a/jsowell-admin/src/test/java/SpringBootTestController.java b/jsowell-admin/src/test/java/SpringBootTestController.java index 93ebf8af9..9c1b3550f 100644 --- a/jsowell-admin/src/test/java/SpringBootTestController.java +++ b/jsowell-admin/src/test/java/SpringBootTestController.java @@ -11,6 +11,7 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.common.primitives.Bytes; import com.huifu.adapay.core.exception.BaseAdaPayException; +import com.huifu.adapay.model.Payment; import com.huifu.adapay.model.Refund; import com.jsowell.JsowellApplication; import com.jsowell.adapay.config.AbstractAdapayConfig; @@ -205,6 +206,15 @@ public class SpringBootTestController { @Autowired private LTYTService ltytService; + @Test + public void queryPaymentInfoTest() throws BaseAdaPayException { + String wechatAppId = "wxbb3e0d474569481d"; + String paymentId = "002212023082514501110541039779091623936"; + // 在完成初始化设置情况下,调用查询方法,获取 Payment 查询结果 + Map response = Payment.query(paymentId, wechatAppId); + System.out.println(response); + } + /** * 手动变更银行卡信息 */ diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java b/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java index d3280c972..397d831e5 100644 --- a/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayService.java @@ -99,15 +99,12 @@ public class AdapayService { if (memberBasicInfo == null) { throw new BusinessException(ReturnCodeEnum.CODE_GET_OPEN_ID_BY_CODE_ERROR); } - String openId =memberBasicInfo.getOpenId(); - // String openId = wxAppletRemoteService.getOpenIdByCode(dto.getCode()); - // if (StringUtils.isBlank(openId)) { - // throw new BusinessException(ReturnCodeEnum.CODE_GET_OPEN_ID_BY_CODE_ERROR); - // } + String openId = memberBasicInfo.getOpenId(); // 封装对象 String amount = AdapayUtil.formatAmount(dto.getPayAmount()); // 用户支付金额 - String payMode = Constants.ADAPAY_PAY_MODE_DELAY; // 汇付延时分账 + // String payMode = Constants.ADAPAY_PAY_MODE_DELAY; // 汇付延时分账 + String payMode = pileMerchantInfoService.getDelayModeByWechatAppId(dto.getWechatAppId()); CreateAdaPaymentParam createAdaPaymentParam = new CreateAdaPaymentParam(); createAdaPaymentParam.setOrder_no(dto.getOrderCode()); createAdaPaymentParam.setPay_amt(amount); @@ -126,14 +123,17 @@ public class AdapayService { createAdaPaymentParam.setExpend(JSONObject.toJSONString(ImmutableMap.of("open_id", openId))); // 延时分账 - createAdaPaymentParam.setPay_mode(payMode); + if (StringUtils.isNotBlank(payMode)) { + createAdaPaymentParam.setPay_mode(payMode); + } try { log.info("创建汇付支付参数:{}", JSONObject.toJSONString(createAdaPaymentParam)); Map response = Payment.create(BeanMap.create(createAdaPaymentParam), config.getWechatAppId()); if (response != null && !response.isEmpty()) { JSONObject expend = JSONObject.parseObject(response.get("expend").toString()); JSONObject pay_info = expend.getJSONObject("pay_info"); - Map resultMap = JSONObject.parseObject(pay_info.toJSONString(), new TypeReference>() {}); + Map resultMap = JSONObject.parseObject(pay_info.toJSONString(), new TypeReference>() { + }); if (resultMap != null) { // 请求参数放入缓存,15分钟以内返回同一个支付参数 redisCache.setCacheObject(redisKey, resultMap, 15, TimeUnit.MINUTES); @@ -666,7 +666,7 @@ public class AdapayService { // 发送提现申请 Map settleCountParams = Maps.newHashMap(); - String orderNo = "drawcash_" + dto.getMerchantId() + "_" +System.currentTimeMillis(); + String orderNo = "drawcash_" + dto.getMerchantId() + "_" + System.currentTimeMillis(); settleCountParams.put("order_no", orderNo); settleCountParams.put("cash_amt", AdapayUtil.formatAmount(cashAmt)); settleCountParams.put("member_id", adapayAccountBalanceVO.getAdapayMemberId()); @@ -710,6 +710,7 @@ public class AdapayService { /** * 查询取现对象 + * * @param orderNo 请求订单号 */ public DrawCashDetailVO queryDrawCashDetail(String orderNo, String wechatAppId) throws BaseAdaPayException { @@ -877,15 +878,30 @@ public class AdapayService { /** * 创建退款请求 */ - public RefundResponse createRefundRequest(String paymentId, BigDecimal refundAmt) { - // 延迟分账确认的调退款接口 + public RefundResponse createRefundRequest(String paymentId, BigDecimal refundAmt, String wechatAppId, String memberId, String scenarioType, String orderCode) { + AbstractAdapayConfig config = AdapayConfigFactory.getConfig(wechatAppId); + if (config == null) { + throw new BusinessException(ReturnCodeEnum.CODE_ADAPAY_CONFIG_IS_NULL_ERROR); + } + + // 实时分账的调退款接口 Map refundParams = Maps.newHashMap(); refundParams.put("refund_amt", AdapayUtil.formatAmount(refundAmt)); refundParams.put("refund_order_no", IdUtils.fastSimpleUUID()); + // expand 为扩展域 + Map expendMap = Maps.newHashMap(); + expendMap.put("memberId", memberId); + expendMap.put("scenarioType", scenarioType); + if (StringUtils.isNotBlank(orderCode)) { + expendMap.put("orderCode", orderCode); + } + refundParams.put("expand", expendMap); + refundParams.put("reason", expendMap); refundParams.put("notify_url", ADAPAY_CALLBACK_URL); + Map resultResponse = null; try { - resultResponse = Refund.create(paymentId, refundParams); + resultResponse = Refund.create(paymentId, refundParams, config.getWechatAppId()); } catch (BaseAdaPayException e) { log.error("汇付支付创建退款对象error", e); } @@ -897,10 +913,10 @@ public class AdapayService { /** * 创建交易撤销请求 * 延迟分账未确认, 调交易撤销接口退款 + * * @param wechatAppId 微信小程序appId */ public PaymentReverseResponse createPaymentReverseRequest(String paymentId, BigDecimal reverseAmt, String wechatAppId, String memberId, String scenarioType, String orderCode) { - PaymentReverseResponse response; AbstractAdapayConfig config = AdapayConfigFactory.getConfig(wechatAppId); if (config == null) { throw new BusinessException(ReturnCodeEnum.CODE_ADAPAY_CONFIG_IS_NULL_ERROR); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/PileMerchantInfoMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/PileMerchantInfoMapper.java index a8235d91a..ef4d35a4a 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/PileMerchantInfoMapper.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/PileMerchantInfoMapper.java @@ -95,7 +95,7 @@ public interface PileMerchantInfoMapper { * @param appId * @return */ - String getFirstLevelMerchantIdByAppId(String appId); + PileMerchantInfo getFirstLevelMerchantByAppId(String appId); /** * 通过appid查询运营商部门id diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/IPileMerchantInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/IPileMerchantInfoService.java index 3c311c1d1..c7938e4fb 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/IPileMerchantInfoService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/IPileMerchantInfoService.java @@ -66,7 +66,9 @@ public interface IPileMerchantInfoService { */ public int deletePileMerchantInfoById(Long id); - /** + PileMerchantInfo getFirstLevelMerchantByAppId(String appId); + + /** * 通过微信小程序appId查询一级运营商merchantId * @param appId 微信小程序appId * @return 一级运营商merchantId @@ -105,4 +107,6 @@ public interface IPileMerchantInfoService { * @return */ List getDeptIdsByAppId(String appId); + + String getDelayModeByWechatAppId(String wechatAppId); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index 68f73bced..b673b4443 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -12,6 +12,7 @@ import com.jsowell.adapay.dto.QueryPaymentConfirmDTO; import com.jsowell.adapay.response.PaymentConfirmResponse; import com.jsowell.adapay.response.PaymentReverseResponse; import com.jsowell.adapay.response.QueryPaymentConfirmDetailResponse; +import com.jsowell.adapay.response.RefundResponse; import com.jsowell.adapay.service.AdapayService; import com.jsowell.adapay.vo.OrderSettleResult; import com.jsowell.common.constant.CacheConstants; @@ -2338,23 +2339,21 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { BigDecimal refundAmount = dto.getRefundAmount(); BigDecimal payAmt = callbackRecord.getPayAmt(); if (refundAmount.compareTo(payAmt) > 0) { - logger.error("汇付支付订单号:{}, 退款金额:{}(元),大于可退金额{}(元), 抛出异常", dto.getOrderCode(), refundAmount, payAmt); + logger.error("汇付支付订单号:{}, 退款金额:{}(元),大于付款金额{}(元), 抛出异常", dto.getOrderCode(), refundAmount, payAmt); throw new BusinessException(ReturnCodeEnum.CODE_REFUND_ORDER_AMOUNT_ERROR); } - // 创建汇付退款对象 在完成初始化设置情况下,调用方法,获取 Refund对象 - - // TODO 拿orderCode查询清分状态 - String payMode = "delay"; - if (StringUtils.equals("", payMode)) { - // 延迟分账确认的调退款接口 - adapayService.createRefundRequest(paymentId, refundAmount); - } else { + // 拿orderCode查询延时分账模式 延时分账的使用撤销方法退款,实时分账的使用退款方法 + String expend = callbackRecord.getExpend(); + JSONObject expendJsonObject = JSON.parseObject(expend); + String payMode = expendJsonObject.getString("payMode"); + // String payMode = "delay"; + if (StringUtils.equalsIgnoreCase(payMode, Constants.ADAPAY_PAY_MODE_DELAY)) { // 延迟分账未确认调撤销调撤销接口退款 PaymentReverseResponse response = adapayService.createPaymentReverseRequest( paymentId, refundAmount, dto.getWechatAppId(), dto.getMemberId(), ScenarioEnum.ORDER.getValue(), dto.getOrderCode()); - if (response != null && response.isFailed()) { + if (response != null && response.isNotFailed()) { MemberAdapayRecord record = memberAdapayRecordService.selectByPaymentId(paymentId); BigDecimal reverseAmt = new BigDecimal(response.getReverse_amt()); // 更新此笔交易单的消费金额 = 支付金额 - 撤销金额 @@ -2370,7 +2369,52 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { } memberAdapayRecordService.updateByPrimaryKeySelective(record); } + } else { + // 实时分账的调退款接口 + RefundResponse refundRequest = adapayService.createRefundRequest(paymentId, refundAmount, dto.getWechatAppId(), dto.getMemberId(), ScenarioEnum.ORDER.getValue(), + dto.getOrderCode()); + if (refundRequest != null && refundRequest.isNotFailed()) { + MemberAdapayRecord record = memberAdapayRecordService.selectByPaymentId(paymentId); + BigDecimal refundAmt = new BigDecimal(refundRequest.getRefund_amt()); + // 更新此笔交易单的消费金额 = 支付金额 - 撤销金额 + BigDecimal spendAmt = callbackRecord.getPayAmt().subtract(refundAmt); + record.setSpendAmt(spendAmt); + // 退款金额 + record.setRefundAmt(refundAmt); + // 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额 + record.setBalanceAmt(record.getPayAmt().subtract(record.getRefundAmt()).subtract(record.getSpendAmt())); + if (BigDecimal.ZERO.compareTo(record.getBalanceAmt()) != 0) { + logger.error("订单分账结束后账不平,paymentId:{}, orderCode:{}, 支付金额:{}, 消费金额:{}, 退款金额:{}", + paymentId, dto.getOrderCode(), payAmt, spendAmt, refundAmt); + } + memberAdapayRecordService.updateByPrimaryKeySelective(record); + } } + // if (StringUtils.equals("", payMode)) { + // // 延迟分账确认的调退款接口 + // adapayService.createRefundRequest(paymentId, refundAmount); + // } else { + // // 延迟分账未确认调撤销调撤销接口退款 + // PaymentReverseResponse response = adapayService.createPaymentReverseRequest( + // paymentId, refundAmount, dto.getWechatAppId(), dto.getMemberId(), ScenarioEnum.ORDER.getValue(), + // dto.getOrderCode()); + // if (response != null && response.isFailed()) { + // MemberAdapayRecord record = memberAdapayRecordService.selectByPaymentId(paymentId); + // BigDecimal reverseAmt = new BigDecimal(response.getReverse_amt()); + // // 更新此笔交易单的消费金额 = 支付金额 - 撤销金额 + // BigDecimal spendAmt = callbackRecord.getPayAmt().subtract(reverseAmt); + // record.setSpendAmt(spendAmt); + // // 退款金额 + // record.setRefundAmt(reverseAmt); + // // 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额 + // record.setBalanceAmt(record.getPayAmt().subtract(record.getRefundAmt()).subtract(record.getSpendAmt())); + // if (BigDecimal.ZERO.compareTo(record.getBalanceAmt()) != 0) { + // logger.error("订单分账结束后账不平,paymentId:{}, orderCode:{}, 支付金额:{}, 消费金额:{}, 退款金额:{}", + // paymentId, dto.getOrderCode(), payAmt, spendAmt, reverseAmt); + // } + // memberAdapayRecordService.updateByPrimaryKeySelective(record); + // } + // } } @Override diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileMerchantInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileMerchantInfoServiceImpl.java index 0e621a1a8..bba5ea84f 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileMerchantInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileMerchantInfoServiceImpl.java @@ -260,7 +260,19 @@ public class PileMerchantInfoServiceImpl implements IPileMerchantInfoService { // 逻辑删除部门 sysDeptService.deleteDeptById(Long.parseLong(deptId)); } + } + /** + * 通过微信小程序appId查询一级运营商merchant对象 + * @param appId 微信小程序appId + * @return 一级运营商merchant对象 + */ + @Override + public PileMerchantInfo getFirstLevelMerchantByAppId(String appId) { + if (StringUtils.isBlank(appId)) { + return null; + } + return pileMerchantInfoMapper.getFirstLevelMerchantByAppId(appId); } /** @@ -270,18 +282,12 @@ public class PileMerchantInfoServiceImpl implements IPileMerchantInfoService { */ @Override public String getFirstLevelMerchantIdByAppId(String appId) { - if (StringUtils.isBlank(appId)) { - return null; + String merchantId = null; + PileMerchantInfo merchant = getFirstLevelMerchantByAppId(appId); + if (Objects.nonNull(merchant)) { + merchantId = String.valueOf(merchant.getId()); } - try { - String merchantId = pileMerchantInfoMapper.getFirstLevelMerchantIdByAppId(appId); - if (StringUtils.isNotBlank(merchantId)) { - return merchantId; - } - } catch (Exception e) { - log.error("通过appid获取运营商id error", e); - } - return null; + return merchantId; } @Override @@ -327,10 +333,6 @@ public class PileMerchantInfoServiceImpl implements IPileMerchantInfoService { return pileMerchantInfoMapper.queryInfoListByIds(deptIds); } - public List getLoginUserMerchantIds() { - AuthorizedDeptVO authorizedMap = SecurityUtils.getAuthorizedMap(); - return null; - } /** * 查询一级运营商列表 @@ -388,5 +390,21 @@ public class PileMerchantInfoServiceImpl implements IPileMerchantInfoService { return pileMerchantInfoMapper.getDeptIdsByAppId(appId); } + /** + * 通过wechatAppId查询一级运营商的延时支付模式配置 + * @param wechatAppId 微信小程序id + * @return + */ + @Override + public String getDelayModeByWechatAppId(String wechatAppId) { + PileMerchantInfo merchant = getFirstLevelMerchantByAppId(wechatAppId); + if (merchant != null) { + String delayMode = merchant.getDelayMode(); + if (StringUtils.equals(delayMode, Constants.ONE)) { + return Constants.ADAPAY_PAY_MODE_DELAY; + } + } + return null; + } } diff --git a/jsowell-pile/src/main/resources/mapper/pile/PileMerchantInfoMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/PileMerchantInfoMapper.xml index f944f90e1..86cacf91a 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/PileMerchantInfoMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/PileMerchantInfoMapper.xml @@ -348,9 +348,9 @@ and merchant_level = '1' - select - id + from pile_merchant_info where del_flag = '0'