diff --git a/bd-api/bd-api-third/src/main/java/com/hzs/third/pay/ITOnlinePaymentServiceApi.java b/bd-api/bd-api-third/src/main/java/com/hzs/third/pay/ITOnlinePaymentServiceApi.java new file mode 100644 index 00000000..c4477cd8 --- /dev/null +++ b/bd-api/bd-api-third/src/main/java/com/hzs/third/pay/ITOnlinePaymentServiceApi.java @@ -0,0 +1,9 @@ +package com.hzs.third.pay; + +import com.hzs.common.core.domain.R; +import com.hzs.common.domain.third.pay.TOnlinePayment; + +public interface ITOnlinePaymentServiceApi { + R getOnlinePayment(String orderNo); + R refund(String orderNo, Long userId); +} diff --git a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/impl/CuMemberBusinessServiceImpl.java b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/impl/CuMemberBusinessServiceImpl.java index 5fb807bf..377244fe 100644 --- a/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/impl/CuMemberBusinessServiceImpl.java +++ b/bd-business/bd-business-member/src/main/java/com/hzs/member/base/service/impl/CuMemberBusinessServiceImpl.java @@ -2,6 +2,7 @@ package com.hzs.member.base.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.hzs.activity.pick.IAcPickServiceApi; import com.hzs.bonus.settle.IMemberSettleBonusApi; @@ -40,6 +41,7 @@ import com.hzs.common.domain.sale.ext.SaOrderExt; import com.hzs.common.domain.sale.order.SaOrder; import com.hzs.common.domain.system.config.BdAccount; import com.hzs.common.domain.system.config.BdAwards; +import com.hzs.common.domain.third.pay.TOnlinePayment; import com.hzs.common.util.TransactionUtils; import com.hzs.member.account.dto.BusinessCommissionDTO; import com.hzs.member.account.service.ICuMemberAccountService; @@ -63,6 +65,7 @@ import com.hzs.system.config.IAwardsServiceApi; import com.hzs.system.config.IGradeServiceApi; import com.hzs.system.config.dto.AreaCurrencyDTO; import com.hzs.system.config.dto.GradeDTO; +import com.hzs.third.pay.ITOnlinePaymentServiceApi; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.beans.factory.annotation.Autowired; @@ -125,7 +128,8 @@ public class CuMemberBusinessServiceImpl implements ICuMemberBusinessService { @Autowired private ICuMemberSettlePeriodService iCuMemberSettlePeriodService; - + @DubboReference + private ITOnlinePaymentServiceApi itOnlinePaymentServiceApi; @Override @Transactional(rollbackFor = Exception.class) public void updateCuMember(CuMember cuMember) { @@ -772,8 +776,16 @@ public class CuMemberBusinessServiceImpl implements ICuMemberBusinessService { List cuMemberTradeDetailList = new ArrayList<>(); CuMemberAccount updateMemberAccount = new CuMemberAccount(); List cuMemberTradeList = packageCancelOrderCuMemberTrades(pkApprove, saOrder, payMemberAccount, newCuMemberTradeBonusList, cuMemberTradeDetailList, updateMemberAccount); - if (newCuMemberTradeBonusList.size() > 0) { - iCuMemberTradeBonusService.batchInsertCuMemberTradeBonus(newCuMemberTradeBonusList); + R onlinePaymentR = itOnlinePaymentServiceApi.getOnlinePayment(saOrder.getOrderCode()); + TOnlinePayment onlinePayment = null; + if(ObjectUtil.isNotEmpty(onlinePaymentR)){ + onlinePayment = onlinePaymentR.getData(); + } + // 2025年7月2日 在线支付无视现金流水明细 + if(ObjectUtil.isEmpty(onlinePayment)){ + if (newCuMemberTradeBonusList.size() > 0) { + iCuMemberTradeBonusService.batchInsertCuMemberTradeBonus(newCuMemberTradeBonusList); + } } // 根据 newCuMemberTradeBonusList 更新 cu_member_trade_detail iCuMemberTradeDetailService.updateAddCuMemberTradeDetail(cuMemberTradeDetailList); diff --git a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/service/impl/SaOrderServiceImpl.java b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/service/impl/SaOrderServiceImpl.java index c4f56a16..97b68ff1 100644 --- a/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/service/impl/SaOrderServiceImpl.java +++ b/bd-business/bd-business-sale/src/main/java/com/hzs/sale/order/service/impl/SaOrderServiceImpl.java @@ -2,6 +2,7 @@ package com.hzs.sale.order.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.crypto.SecureUtil; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONObject; @@ -20,6 +21,7 @@ import com.hzs.common.core.service.RedisService; import com.hzs.common.core.utils.*; import com.hzs.common.core.utils.reflect.ReflectUtils; import com.hzs.common.domain.member.account.CuMemberAccount; +import com.hzs.common.domain.member.account.CuMemberTrade; import com.hzs.common.domain.member.base.CuMember; import com.hzs.common.domain.member.base.CuMemberRegister; import com.hzs.common.domain.member.base.CuMemberShare; @@ -35,6 +37,7 @@ import com.hzs.common.domain.sale.wares.BdWares; import com.hzs.common.domain.system.base.BdCountry; import com.hzs.common.domain.system.base.ext.BdProductStorehouseExt; import com.hzs.common.domain.system.config.BdAwards; +import com.hzs.common.domain.third.pay.TOnlinePayment; import com.hzs.common.security.service.UserTokenService; import com.hzs.common.security.utils.SecurityUtils; import com.hzs.common.util.TransactionUtils; @@ -76,6 +79,7 @@ import com.hzs.system.sys.IApprovalServiceApi; import com.hzs.system.sys.dto.ApprovalBusinessResultDTO; import com.hzs.system.sys.dto.ApprovalSubmitDTO; import com.hzs.system.sys.dto.LoginUser; +import com.hzs.third.pay.ITOnlinePaymentServiceApi; import com.hzs.third.sms.ISmsServiceApi; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; @@ -131,6 +135,9 @@ public class SaOrderServiceImpl extends ServiceImpl impl @DubboReference ICuMemberAgreementWhiteApi cuMemberAgreementWhiteApi; + @DubboReference + private ITOnlinePaymentServiceApi itOnlinePaymentServiceApi; + @Autowired private IBdWaresService iBdWaresService; @Autowired @@ -2293,7 +2300,18 @@ public class SaOrderServiceImpl extends ServiceImpl impl public void selfRevokeOrder(Long pkApprove, MyOrderVO myOrderVO) { SaOrderExt saOrderExt = myOrderVO.getSaOrderExt(); BusinessCommissionDTO businessCommissionDTO = null; - if (saOrderExt != null) { + R onlinePaymentR = itOnlinePaymentServiceApi.getOnlinePayment(saOrderExt.getOrderCode()); + TOnlinePayment onlinePayment = null; + if(ObjectUtil.isNotEmpty(onlinePaymentR)){ + onlinePayment = onlinePaymentR.getData(); + if(ObjectUtil.isNotEmpty(onlinePayment)){ + R result = itOnlinePaymentServiceApi.refund(saOrderExt.getOrderCode(), SecurityUtils.getUserId()); + if(!result.isSuccess()){ + throw new ServiceException(result.getMsg()); + } + } + } + if (ObjectUtil.isNotEmpty(saOrderExt)) { // 删除订单 saOrderExt.setDelFlag(EDelFlag.DELETE.getValue()); Date currentDate = DateUtils.currentDateTime(); diff --git a/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/third/pay/TOnlinePayment.java b/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/third/pay/TOnlinePayment.java index abaebf07..4ec0ec8e 100644 --- a/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/third/pay/TOnlinePayment.java +++ b/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/third/pay/TOnlinePayment.java @@ -122,4 +122,9 @@ public class TOnlinePayment extends BaseEntity { @TableField("PAY_SOURCE") private Integer paySource; + /** + * 支付-前端回调页面的扩展参数 + */ + @TableField(exist = false) + private String extParam; } diff --git a/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/third/pay/TOnlinePaymentSepAcc.java b/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/third/pay/TOnlinePaymentSepAcc.java index 3d8d0a1d..3bfe77a1 100644 --- a/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/third/pay/TOnlinePaymentSepAcc.java +++ b/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/third/pay/TOnlinePaymentSepAcc.java @@ -67,6 +67,9 @@ public class TOnlinePaymentSepAcc extends BaseEntity { @TableField("TRADE_AMOUNT") private BigDecimal tradeAmount; + @TableField("OUT_TRADE_NO") + private String outTradeNo; + @TableField(exist = false) private List sepAccDList; } diff --git a/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/third/pay/TOnlinePaymentSepAccD.java b/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/third/pay/TOnlinePaymentSepAccD.java index 8cdcb72e..ae9ed643 100644 --- a/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/third/pay/TOnlinePaymentSepAccD.java +++ b/bd-common/bd-common-domain/src/main/java/com/hzs/common/domain/third/pay/TOnlinePaymentSepAccD.java @@ -53,4 +53,7 @@ public class TOnlinePaymentSepAccD extends BaseEntity { @TableField("TRADE_AMOUNT") private BigDecimal tradeAmount; + + @TableField("OUT_TRADE_NO") + private String outTradeNo; } diff --git a/bd-third/src/main/java/com/hzs/third/mqcall/listener/RefundOrderListener.java b/bd-third/src/main/java/com/hzs/third/mqcall/listener/RefundOrderListener.java index 90523722..3790b0b9 100644 --- a/bd-third/src/main/java/com/hzs/third/mqcall/listener/RefundOrderListener.java +++ b/bd-third/src/main/java/com/hzs/third/mqcall/listener/RefundOrderListener.java @@ -180,6 +180,10 @@ public class RefundOrderListener { // 通联 str = iRefundService.allInRefundHandle(refundDTO, tOnlinePayment); break; + case JD: + // 京东 + str = iRefundService.jdRefundDivision(tOnlinePayment.getBusinessCode(), tOnlinePayment.getPkCreator()); + break; default: } return str; diff --git a/bd-third/src/main/java/com/hzs/third/pay/config/JdPayBankProperties.java b/bd-third/src/main/java/com/hzs/third/pay/config/JdPayBankProperties.java new file mode 100644 index 00000000..e04fda30 --- /dev/null +++ b/bd-third/src/main/java/com/hzs/third/pay/config/JdPayBankProperties.java @@ -0,0 +1,27 @@ +package com.hzs.third.pay.config; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Setter +@Getter +@Component +@ConfigurationProperties(prefix = "jd.bank") // 绑定jd.pay前缀的配置 +public class JdPayBankProperties { + + private String merchantNo; + private String signKey; + private String priCertPwd; + private String priCert; + private String pubCert; + private String apiDomain; + private String pageBackUrl; + private String notifyUrl; + private String refundNotifyUrl; + + private List separateAccounts; +} diff --git a/bd-third/src/main/java/com/hzs/third/pay/config/JdPayProperties.java b/bd-third/src/main/java/com/hzs/third/pay/config/JdPayProperties.java deleted file mode 100644 index 0da66bcc..00000000 --- a/bd-third/src/main/java/com/hzs/third/pay/config/JdPayProperties.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.hzs.third.pay.config; - -import lombok.Getter; -import lombok.Setter; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -import java.util.List; - -@Setter -@Getter -@Component -@ConfigurationProperties(prefix = "jd.pay") // 绑定jd.pay前缀的配置 -public class JdPayProperties { - private List separateAccounts; - -} diff --git a/bd-third/src/main/java/com/hzs/third/pay/config/JdPayWechatAlipayProperties.java b/bd-third/src/main/java/com/hzs/third/pay/config/JdPayWechatAlipayProperties.java new file mode 100644 index 00000000..94c814d3 --- /dev/null +++ b/bd-third/src/main/java/com/hzs/third/pay/config/JdPayWechatAlipayProperties.java @@ -0,0 +1,27 @@ +package com.hzs.third.pay.config; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Setter +@Getter +@Component +@ConfigurationProperties(prefix = "jd.wechat-alipay") // 绑定jd.pay前缀的配置 +public class JdPayWechatAlipayProperties { + + private String merchantNo; + private String signKey; + private String priCertPwd; + private String priCert; + private String pubCert; + private String apiDomain; + private String pageBackUrl; + private String notifyUrl; + private String refundNotifyUrl; + + private List separateAccounts; +} diff --git a/bd-third/src/main/java/com/hzs/third/pay/controller/api/JdRefundController.java b/bd-third/src/main/java/com/hzs/third/pay/controller/api/JdRefundController.java index 7bb9788f..d634df91 100644 --- a/bd-third/src/main/java/com/hzs/third/pay/controller/api/JdRefundController.java +++ b/bd-third/src/main/java/com/hzs/third/pay/controller/api/JdRefundController.java @@ -13,10 +13,7 @@ import com.hzs.third.pay.service.IRefundService; import com.hzs.third.pay.service.ITOnlinePaymentService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** * @Description: 京东退款控制器 @@ -35,6 +32,18 @@ public class JdRefundController extends PayBaseController { @Autowired private ITOnlinePaymentService itOnlinePaymentService; + @GetMapping("/test/{orderCode}") + public AjaxResult test(@PathVariable String orderCode) { + iRefundService.jdRefundDivision(orderCode, SecurityUtils.getUserId()); + return AjaxResult.success(); + } + + @GetMapping("/test2") + public AjaxResult test2() { + iRefundService.jdQueryEnterpriseWalletBalance(); + return AjaxResult.success(); + } + /** * 京东退款接口 * diff --git a/bd-third/src/main/java/com/hzs/third/pay/controller/api/PayController.java b/bd-third/src/main/java/com/hzs/third/pay/controller/api/PayController.java index e45f8a8f..61b25607 100644 --- a/bd-third/src/main/java/com/hzs/third/pay/controller/api/PayController.java +++ b/bd-third/src/main/java/com/hzs/third/pay/controller/api/PayController.java @@ -123,6 +123,7 @@ public class PayController { onlinePayment.setOriginalOrder(onlinePayment.getBusinessCode()); onlinePayment.setPaySource(dataSource.getValue()); } + onlinePayment.setExtParam(payParam.getExtParam()); // 业务金额 BigDecimal businessMoney = null; @@ -208,7 +209,8 @@ public class PayController { case WECHAT: case ALIPAY: // 微信、支付宝 扫码支付 - payResult = iJdPayService.scanPay(onlinePayment); +// payResult = iJdPayService.scanPay(onlinePayment); + payResult = iJdPayService.cashRegister(onlinePayment, dataSource); break; case BANK_CARD: // 银行卡支付 @@ -270,7 +272,10 @@ public class PayController { */ @GetMapping("/status") public AjaxResult status(PayParam param) { - if (null == param.getBusinessType() || StringUtils.isEmpty(param.getBusinessCode())) { +// if (null == param.getBusinessType() || StringUtils.isEmpty(param.getBusinessCode())) { +// return AjaxResult.success("缺少参数"); +// } + if (StringUtils.isEmpty(param.getBusinessCode())) { return AjaxResult.success("缺少参数"); } diff --git a/bd-third/src/main/java/com/hzs/third/pay/controller/notify/JdPayNotifyController.java b/bd-third/src/main/java/com/hzs/third/pay/controller/notify/JdPayNotifyController.java index c8222d48..71834057 100644 --- a/bd-third/src/main/java/com/hzs/third/pay/controller/notify/JdPayNotifyController.java +++ b/bd-third/src/main/java/com/hzs/third/pay/controller/notify/JdPayNotifyController.java @@ -88,7 +88,7 @@ public class JdPayNotifyController extends JdBaseController { } - @Resource + @Resource(name = "jdPayBank") private JdPay jdPay; /** diff --git a/bd-third/src/main/java/com/hzs/third/pay/controller/notify/JdRefundNotifyController.java b/bd-third/src/main/java/com/hzs/third/pay/controller/notify/JdRefundNotifyController.java index f6ff3ea0..63ce6814 100644 --- a/bd-third/src/main/java/com/hzs/third/pay/controller/notify/JdRefundNotifyController.java +++ b/bd-third/src/main/java/com/hzs/third/pay/controller/notify/JdRefundNotifyController.java @@ -91,7 +91,7 @@ public class JdRefundNotifyController extends JdBaseController { } - @Resource + @Resource(name = "jdPayBank") private JdPay jdPay; /** diff --git a/bd-third/src/main/java/com/hzs/third/pay/jdpay/config/JdPayAutoConfiguration.java b/bd-third/src/main/java/com/hzs/third/pay/jdpay/config/JdPayAutoConfiguration.java index 3cbf854d..b2c2069f 100644 --- a/bd-third/src/main/java/com/hzs/third/pay/jdpay/config/JdPayAutoConfiguration.java +++ b/bd-third/src/main/java/com/hzs/third/pay/jdpay/config/JdPayAutoConfiguration.java @@ -1,9 +1,12 @@ package com.hzs.third.pay.jdpay.config; +import com.hzs.third.pay.config.JdPayBankProperties; +import com.hzs.third.pay.config.JdPayWechatAlipayProperties; import com.hzs.third.pay.jdpay.sdk.JdPay; import com.hzs.third.pay.jdpay.sdk.JdPayNewConfig; import com.hzs.third.pay.jdpay.sdk.JdPayDefaultNewConfig; import com.hzs.third.pay.jdpay.util.FileUtil; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -15,30 +18,50 @@ import org.springframework.context.annotation.Configuration; *************************************************/ @Configuration public class JdPayAutoConfiguration { + @Autowired + private JdPayBankProperties jdPayBankProperties; + @Autowired + private JdPayWechatAlipayProperties jdPayWechatAlipayProperties; - @Value("${jd.pay.merchantNo}") - private String merchantNo; - @Value("${jd.pay.signKey}") - private String signKey; - @Value("${jd.pay.priCertPwd}") - private String priCertPwd; - @Value("${jd.pay.priCert}") - private String priCert; - @Value("${jd.pay.pubCert}") - private String pubCert; - @Value("${jd.pay.apiDomain}") - private String apiDomain; - @Bean(name = "jdPay") - public JdPay initJddPay() { + + @Bean(name = "jdPayBank") + public JdPay initJdBankPay() { // 加载商户私钥证书 - byte[] privateCert = FileUtil.readFile(priCert); +// byte[] privateCert = FileUtil.readFile(priCert); + byte[] privateCert = FileUtil.readFile(jdPayBankProperties.getPriCert()); // 加载商户公钥证书 - byte[] publicCert = FileUtil.readFile(pubCert); +// byte[] publicCert = FileUtil.readFile(pubCert); + byte[] publicCert = FileUtil.readFile(jdPayBankProperties.getPubCert()); // 检查商户证书 checkCert(privateCert, publicCert); // 初始化京东支付配置对象 - JdPayNewConfig myConfig = new JdPayDefaultNewConfig(merchantNo, signKey, privateCert, priCertPwd, publicCert, apiDomain); +// JdPayNewConfig myConfig = new JdPayDefaultNewConfig(merchantNo, signKey, privateCert, priCertPwd, publicCert, apiDomain); + JdPayNewConfig myConfig = new JdPayDefaultNewConfig(jdPayBankProperties.getMerchantNo() + , jdPayBankProperties.getSignKey() + , privateCert + , jdPayBankProperties.getPriCertPwd() + , publicCert + , jdPayBankProperties.getApiDomain()); + return new JdPay(myConfig); + }@Bean(name = "jdPayWechatAli") + public JdPay initJdWechatAliPay() { + // 加载商户私钥证书 +// byte[] privateCert = FileUtil.readFile(priCert); + byte[] privateCert = FileUtil.readFile(jdPayWechatAlipayProperties.getPriCert()); + // 加载商户公钥证书 +// byte[] publicCert = FileUtil.readFile(pubCert); + byte[] publicCert = FileUtil.readFile(jdPayWechatAlipayProperties.getPubCert()); + // 检查商户证书 + checkCert(privateCert, publicCert); + // 初始化京东支付配置对象 +// JdPayNewConfig myConfig = new JdPayDefaultNewConfig(merchantNo, signKey, privateCert, priCertPwd, publicCert, apiDomain); + JdPayNewConfig myConfig = new JdPayDefaultNewConfig(jdPayWechatAlipayProperties.getMerchantNo() + , jdPayWechatAlipayProperties.getSignKey() + , privateCert + , jdPayWechatAlipayProperties.getPriCertPwd() + , publicCert + , jdPayWechatAlipayProperties.getApiDomain()); return new JdPay(myConfig); } diff --git a/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayDivisionAccount.java b/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayDivisionAccount.java new file mode 100644 index 00000000..d7f51f69 --- /dev/null +++ b/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayDivisionAccount.java @@ -0,0 +1,45 @@ +package com.hzs.third.pay.jdpay.dto; + + +import java.io.Serializable; +import java.util.List; + +/** + * 分账业务字段 + */ +public class JdPayDivisionAccount implements Serializable { + + /** + * 版本号 + */ + private String version = "v2"; +// private String version; + /** + * 分账交易信息 + */ + private List divisionAccountTradeInfoList; + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public List getDivisionAccountTradeInfoList() { + return divisionAccountTradeInfoList; + } + + public void setDivisionAccountTradeInfoList(List divisionAccountTradeInfoList) { + this.divisionAccountTradeInfoList = divisionAccountTradeInfoList; + } + + @Override + public String toString() { + return "{\"JdPayDivisionAccount\":{" + + "\"version\":\"" + version + "\"" + + ", \"divisionAccountTradeInfoList\":" + divisionAccountTradeInfoList + + "}}"; + } +} diff --git a/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayDivisionAccountRefund.java b/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayDivisionAccountRefund.java new file mode 100644 index 00000000..9c9767c9 --- /dev/null +++ b/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayDivisionAccountRefund.java @@ -0,0 +1,46 @@ +package com.hzs.third.pay.jdpay.dto; + + +import java.io.Serializable; +import java.util.List; + +/** + * 分账业务字段 + * @author liulian115 + */ +public class JdPayDivisionAccountRefund implements Serializable { + + /** + * 版本号 + */ + private String version="V2"; + /** + * 分账交易信息 + * @see JdPayDivisionAccountRefundInfo + */ + private List divisionAccountRefundInfoList; + + @Override + public String toString() { + return "{\"JdPayDivisionAccountRefund\":{" + + "\"version\":\"" + version + "\"" + + ", \"divisionAccountRefundInfoList\":" + divisionAccountRefundInfoList + + "}}"; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public List getDivisionAccountRefundInfoList() { + return divisionAccountRefundInfoList; + } + + public void setDivisionAccountRefundInfoList(List divisionAccountRefundInfoList) { + this.divisionAccountRefundInfoList = divisionAccountRefundInfoList; + } +} diff --git a/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayDivisionAccountRefundInfo.java b/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayDivisionAccountRefundInfo.java new file mode 100644 index 00000000..b38de727 --- /dev/null +++ b/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayDivisionAccountRefundInfo.java @@ -0,0 +1,80 @@ +package com.hzs.third.pay.jdpay.dto; + +import java.io.Serializable; + +/** + * 分账交易信息 + */ +public class JdPayDivisionAccountRefundInfo implements Serializable { + /** + * 分账子商户号 + */ + private String merchantNo; + /** + * 分账子商户订单号 + */ + private String outTradeNo; + /** + * 分账子商户业务单号 + */ + private String bizTradeNo; + /** + * 分账子单金额 + */ + private String tradeAmount; + /** + * 原商户订单号 + */ + private String originalOutTradeNo; + + public String getOriginalOutTradeNo() { + return originalOutTradeNo; + } + + public void setOriginalOutTradeNo(String originalOutTradeNo) { + this.originalOutTradeNo = originalOutTradeNo; + } + + public String getMerchantNo() { + return merchantNo; + } + + public void setMerchantNo(String merchantNo) { + this.merchantNo = merchantNo; + } + + public String getOutTradeNo() { + return outTradeNo; + } + + public void setOutTradeNo(String outTradeNo) { + this.outTradeNo = outTradeNo; + } + + public String getBizTradeNo() { + return bizTradeNo; + } + + public void setBizTradeNo(String bizTradeNo) { + this.bizTradeNo = bizTradeNo; + } + + public String getTradeAmount() { + return tradeAmount; + } + + public void setTradeAmount(String tradeAmount) { + this.tradeAmount = tradeAmount; + } + + @Override + public String toString() { + return "{\"JdPayDivisionAccountRefundInfo\":{" + + "\"merchantNo\":\"" + merchantNo + "\"" + + ", \"outTradeNo\":\"" + outTradeNo + "\"" + + ", \"bizTradeNo\":\"" + bizTradeNo + "\"" + + ", \"tradeAmount\":\"" + tradeAmount + "\"" + + ", \"originalOutTradeNo\":\"" + originalOutTradeNo + "\"" + + "}}"; + } +} diff --git a/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayDivisionAccountTradeInfo.java b/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayDivisionAccountTradeInfo.java new file mode 100644 index 00000000..d56c960f --- /dev/null +++ b/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayDivisionAccountTradeInfo.java @@ -0,0 +1,67 @@ +package com.hzs.third.pay.jdpay.dto; + +import java.io.Serializable; + +/** + * 分账交易信息 + */ +public class JdPayDivisionAccountTradeInfo implements Serializable { + /** + * 分账子商户号 + */ + private String merchantNo; + /** + * 分账子商户订单号 + */ + private String outTradeNo; + /** + * 分账子商户业务单号 + */ + private String bizTradeNo; + /** + * 分账子单金额 + */ + private String tradeAmount; + + public String getMerchantNo() { + return merchantNo; + } + + public void setMerchantNo(String merchantNo) { + this.merchantNo = merchantNo; + } + + public String getOutTradeNo() { + return outTradeNo; + } + + public void setOutTradeNo(String outTradeNo) { + this.outTradeNo = outTradeNo; + } + + public String getBizTradeNo() { + return bizTradeNo; + } + + public void setBizTradeNo(String bizTradeNo) { + this.bizTradeNo = bizTradeNo; + } + + public String getTradeAmount() { + return tradeAmount; + } + + public void setTradeAmount(String tradeAmount) { + this.tradeAmount = tradeAmount; + } + + @Override + public String toString() { + return "{\"JdPayDivisionAccountTradeInfo\":{" + + "\"merchantNo\":\"" + merchantNo + "\"" + + ", \"outTradeNo\":\"" + outTradeNo + "\"" + + ", \"bizTradeNo\":\"" + bizTradeNo + "\"" + + ", \"tradeAmount\":\"" + tradeAmount + "\"" + + "}}"; + } +} diff --git a/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayQueryEnterpriseWalletBalanceRequest.java b/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayQueryEnterpriseWalletBalanceRequest.java new file mode 100644 index 00000000..dc6b5f38 --- /dev/null +++ b/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayQueryEnterpriseWalletBalanceRequest.java @@ -0,0 +1,16 @@ +package com.hzs.third.pay.jdpay.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Data +public class JdPayQueryEnterpriseWalletBalanceRequest implements Serializable { + private String accountNo; +} diff --git a/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayQueryEnterpriseWalletBalanceResponse.java b/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayQueryEnterpriseWalletBalanceResponse.java new file mode 100644 index 00000000..7d60d58b --- /dev/null +++ b/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayQueryEnterpriseWalletBalanceResponse.java @@ -0,0 +1,25 @@ +package com.hzs.third.pay.jdpay.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Data +public class JdPayQueryEnterpriseWalletBalanceResponse implements Serializable { + + /** + * 业务结果 + */ + private String resultCode; + /** + * 响应描述 + */ + private String resultDesc; + +} diff --git a/bd-third/src/main/java/com/hzs/third/pay/jdpay/sdk/JdPay.java b/bd-third/src/main/java/com/hzs/third/pay/jdpay/sdk/JdPay.java index 7da33e06..f5898780 100644 --- a/bd-third/src/main/java/com/hzs/third/pay/jdpay/sdk/JdPay.java +++ b/bd-third/src/main/java/com/hzs/third/pay/jdpay/sdk/JdPay.java @@ -1,9 +1,6 @@ package com.hzs.third.pay.jdpay.sdk; -import com.hzs.third.pay.jdpay.dto.JdPayAggregateCreateOrderRequest; -import com.hzs.third.pay.jdpay.dto.JdPayAggregateCreateOrderResponse; -import com.hzs.third.pay.jdpay.dto.JdPayRefundRequest; -import com.hzs.third.pay.jdpay.dto.JdPayRefundResponse; +import com.hzs.third.pay.jdpay.dto.*; import com.hzs.third.pay.jdpay.util.GsonUtil; import com.hzs.third.pay.jdpay.util.JdPayApiUtil; import com.hzs.third.pay.jdpay.util.SignUtil; @@ -172,4 +169,9 @@ public class JdPay { // public JdPayAgreementSignApplyResponse agreementSignApply(JdPayAgreementSignApplyRequest request) throws Exception{ // return this.baseExecute(JdPayConstant.AGREEMENT_SIGN_APPLY_URL, request, JdPayAgreementSignApplyResponse.class); // } + + + public JdPayQueryEnterpriseWalletBalanceResponse queryEnterpriseWalletBalance(JdPayQueryEnterpriseWalletBalanceRequest request) throws Exception{ + return this.baseExecute(JdPayConstant.QUERY_ENTERPRISE_WALLET_BALANCE_URL, request, JdPayQueryEnterpriseWalletBalanceResponse.class); + } } diff --git a/bd-third/src/main/java/com/hzs/third/pay/jdpay/sdk/JdPayConstant.java b/bd-third/src/main/java/com/hzs/third/pay/jdpay/sdk/JdPayConstant.java index b92e78dd..4d2e5cc1 100644 --- a/bd-third/src/main/java/com/hzs/third/pay/jdpay/sdk/JdPayConstant.java +++ b/bd-third/src/main/java/com/hzs/third/pay/jdpay/sdk/JdPayConstant.java @@ -46,6 +46,7 @@ public class JdPayConstant { * 账户签约 */ public static final String AGREEMENT_SIGN_APPLY_URL = "/api/agreementSignApply"; + public static final String QUERY_ENTERPRISE_WALLET_BALANCE_URL = "/api/queryEnterpriseWalletBalance"; /** * 随机字符常量 diff --git a/bd-third/src/main/java/com/hzs/third/pay/mapper/TOnlinePaymentSepAccMapper.java b/bd-third/src/main/java/com/hzs/third/pay/mapper/TOnlinePaymentSepAccMapper.java index 64655522..3a4f9d63 100644 --- a/bd-third/src/main/java/com/hzs/third/pay/mapper/TOnlinePaymentSepAccMapper.java +++ b/bd-third/src/main/java/com/hzs/third/pay/mapper/TOnlinePaymentSepAccMapper.java @@ -2,6 +2,7 @@ package com.hzs.third.pay.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.hzs.common.domain.third.pay.TOnlinePaymentSepAcc; +import org.apache.ibatis.annotations.Param; /** *

@@ -12,5 +13,5 @@ import com.hzs.common.domain.third.pay.TOnlinePaymentSepAcc; * @since 2025-07-01 */ public interface TOnlinePaymentSepAccMapper extends BaseMapper { - + TOnlinePaymentSepAcc getSepAccByOrderCode(@Param("orderCode") String orderCode); } diff --git a/bd-third/src/main/java/com/hzs/third/pay/param/PayParam.java b/bd-third/src/main/java/com/hzs/third/pay/param/PayParam.java index 121e3aa5..62eb07c8 100644 --- a/bd-third/src/main/java/com/hzs/third/pay/param/PayParam.java +++ b/bd-third/src/main/java/com/hzs/third/pay/param/PayParam.java @@ -1,5 +1,6 @@ package com.hzs.third.pay.param; +import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; /** @@ -36,4 +37,8 @@ public class PayParam { */ private Integer appletFlag; + /** + * 支付-前端回调页面的扩展参数 + */ + private String extParam; } diff --git a/bd-third/src/main/java/com/hzs/third/pay/provider/ITOnlinePaymentServiceProvider.java b/bd-third/src/main/java/com/hzs/third/pay/provider/ITOnlinePaymentServiceProvider.java new file mode 100644 index 00000000..6ea93df7 --- /dev/null +++ b/bd-third/src/main/java/com/hzs/third/pay/provider/ITOnlinePaymentServiceProvider.java @@ -0,0 +1,42 @@ +package com.hzs.third.pay.provider; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.hzs.common.core.domain.R; +import com.hzs.common.core.enums.EPayChannel; +import com.hzs.common.core.exception.ServiceException; +import com.hzs.common.domain.third.pay.TOnlinePayment; +import com.hzs.third.pay.ITOnlinePaymentServiceApi; +import com.hzs.third.pay.service.IRefundService; +import com.hzs.third.pay.service.ITOnlinePaymentService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Objects; + +@DubboService +public class ITOnlinePaymentServiceProvider implements ITOnlinePaymentServiceApi { + @Autowired + private ITOnlinePaymentService itOnlinePaymentService; + @Autowired + private IRefundService iRefundService; + @Override + public R getOnlinePayment(String orderNo) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(TOnlinePayment::getBusinessCode, orderNo); + return R.ok(itOnlinePaymentService.getOne(queryWrapper, false)); + } + + @Override + public R refund(String orderNo, Long userId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(TOnlinePayment::getBusinessCode, orderNo); + TOnlinePayment tOnlinePayment = itOnlinePaymentService.getOne(queryWrapper, false); + if(ObjectUtil.isNotEmpty(tOnlinePayment)){ + if (Objects.requireNonNull(EPayChannel.getEnumByValue(tOnlinePayment.getPayChannel())) == EPayChannel.JD) { + return R.ok(iRefundService.jdRefundDivision(orderNo, userId)); + } + } + return R.fail(); + } +} diff --git a/bd-third/src/main/java/com/hzs/third/pay/service/IRefundService.java b/bd-third/src/main/java/com/hzs/third/pay/service/IRefundService.java index 68f5cafa..54ab541a 100644 --- a/bd-third/src/main/java/com/hzs/third/pay/service/IRefundService.java +++ b/bd-third/src/main/java/com/hzs/third/pay/service/IRefundService.java @@ -63,4 +63,6 @@ public interface IRefundService { */ String jdCashRefundHandle(RefundDTO refundDTO, TOnlinePayment tOnlinePayment); + String jdRefundDivision(String orderCode, Long userId); + String jdQueryEnterpriseWalletBalance(); } diff --git a/bd-third/src/main/java/com/hzs/third/pay/service/ITOnlinePaymentSepAccService.java b/bd-third/src/main/java/com/hzs/third/pay/service/ITOnlinePaymentSepAccService.java index dd382d26..8f48f38a 100644 --- a/bd-third/src/main/java/com/hzs/third/pay/service/ITOnlinePaymentSepAccService.java +++ b/bd-third/src/main/java/com/hzs/third/pay/service/ITOnlinePaymentSepAccService.java @@ -13,4 +13,6 @@ import com.hzs.common.domain.third.pay.TOnlinePaymentSepAcc; */ public interface ITOnlinePaymentSepAccService extends IService { void saveOrUpdateReq(TOnlinePaymentSepAcc tOnlinePaymentSepAcc); + + TOnlinePaymentSepAcc getSepAccByOrderCode(String code); } diff --git a/bd-third/src/main/java/com/hzs/third/pay/service/impl/JdPayServiceImpl.java b/bd-third/src/main/java/com/hzs/third/pay/service/impl/JdPayServiceImpl.java index d3a17d31..0e96d58f 100644 --- a/bd-third/src/main/java/com/hzs/third/pay/service/impl/JdPayServiceImpl.java +++ b/bd-third/src/main/java/com/hzs/third/pay/service/impl/JdPayServiceImpl.java @@ -12,9 +12,10 @@ import com.hzs.common.domain.third.pay.TOnlineCard; import com.hzs.common.domain.third.pay.TOnlinePayment; import com.hzs.common.domain.third.pay.TOnlinePaymentSepAcc; import com.hzs.common.domain.third.pay.TOnlinePaymentSepAccD; +import com.hzs.third.pay.config.JdPayBankProperties; import com.hzs.third.pay.config.JdPayConfig; -import com.hzs.third.pay.config.JdPayProperties; import com.hzs.third.pay.config.JdPaySeparateAccountConfig; +import com.hzs.third.pay.config.JdPayWechatAlipayProperties; import com.hzs.third.pay.constants.JdPayConstants; import com.hzs.third.pay.constants.PayRedisConstants; import com.hzs.third.pay.dto.jd.JdFastDTO; @@ -59,10 +60,10 @@ public class JdPayServiceImpl implements IJdPayService { private JdPayConfig jdPayConfig; @Autowired private ITOnlineCardService itOnlineCardService; - @Resource + @Resource(name = "jdPayBank") private JdPay jdPay; @Autowired - private JdPayProperties jdPayProperties; + private JdPayBankProperties jdPayBankProperties; @Autowired private RedisTemplate redisTemplate; @Autowired @@ -71,16 +72,8 @@ public class JdPayServiceImpl implements IJdPayService { @Autowired private ITOnlinePaymentService itOnlinePaymentService; - /** - * 页面回调地址 - */ - @Value("${jd.pay.pageBackUrl}") - private String pageBackUrl; - /** - * 支付回调地址 - */ - @Value("${jd.pay.notifyUrl}") - private String notifyUrl; + @Resource + private JdPayWechatAlipayProperties jdPayWechatAlipayProperties; @Override @@ -248,15 +241,54 @@ public class JdPayServiceImpl implements IJdPayService { // 用户标识(收银台必传) .userId(userId) // 同步通知URL(收银台必传,页面回调地址) - .pageBackUrl(this.pageBackUrl) + .pageBackUrl(jdPayWechatAlipayProperties.getPageBackUrl() + "?extParam=" + onlinePayment.getExtParam()) // 支付回调地址 - .notifyUrl(this.notifyUrl) + .notifyUrl(jdPayWechatAlipayProperties.getNotifyUrl()) // 交易类型 .tradeType(tradeType) // 交易场景(ONLINE_APP:线上移动端 ONLINE_PC:线上PC) .sceneType(sceneType) .build(); + + JdPayDivisionAccount divisionAccount = new JdPayDivisionAccount(); + List divisionAccountTradeInfoList = new ArrayList(); + List sepAccDList = new ArrayList<>(); + if(ObjectUtil.isNotEmpty(jdPayBankProperties)){ + List separateAccounts = jdPayBankProperties.getSeparateAccounts(); + if(ObjectUtil.isNotEmpty(separateAccounts)){ + BigDecimal tradeAmount = onlinePayment.getPayMoney(); + BigDecimal remaining = onlinePayment.getPayMoney(); + for (int i = 0; i < separateAccounts.size(); i++) { + JdPaySeparateAccountConfig separateAccount = separateAccounts.get(i); + BigDecimal subTradeAmount; + if(i == separateAccounts.size() - 1){ + subTradeAmount = remaining; + }else{ + subTradeAmount = tradeAmount.subtract(tradeAmount.multiply(separateAccount.getProportion().setScale(2, BigDecimal.ROUND_HALF_UP))); + remaining = remaining.subtract(subTradeAmount).setScale(2, BigDecimal.ROUND_HALF_UP); + } + JdPayDivisionAccountTradeInfo divisionAccountTradeInfo = new JdPayDivisionAccountTradeInfo(); + divisionAccountTradeInfo.setMerchantNo(separateAccount.getAccount()); + divisionAccountTradeInfo.setOutTradeNo(onlinePayment.getBusinessCode() + "_" + (i + 1)); + divisionAccountTradeInfo.setTradeAmount(subTradeAmount.multiply(new BigDecimal(100)).intValue() + ""); + divisionAccountTradeInfoList.add(divisionAccountTradeInfo); + sepAccDList.add( + TOnlinePaymentSepAccD.builder() + .account(separateAccount.getAccount()) + .proportion(separateAccount.getProportion()) + .tradeAmount(subTradeAmount) + .outTradeNo(divisionAccountTradeInfo.getOutTradeNo()) + .build() + ); + } + } + } + + divisionAccount.setVersion( "V2" ); + divisionAccount.setDivisionAccountTradeInfoList(divisionAccountTradeInfoList); + request.setDivisionAccount(GsonUtil.toJson(divisionAccount)); + // 请求京东支付接口 JdPayAggregateCreateOrderResponse response = jdPay.aggregateCreateOrder(request); TOnlinePaymentSepAcc sepAcc = TOnlinePaymentSepAcc.builder() @@ -266,6 +298,7 @@ public class JdPayServiceImpl implements IJdPayService { .version(divisionAccount.getVersion()) .respContent(JSONUtil.toJsonStr(response)) .tradeAmount(onlinePayment.getPayMoney()) + .outTradeNo(request.getOutTradeNo()) .build(); if ("0000".equals(response.getResultCode())) { // 请求响应成功 diff --git a/bd-third/src/main/java/com/hzs/third/pay/service/impl/RefundServiceImpl.java b/bd-third/src/main/java/com/hzs/third/pay/service/impl/RefundServiceImpl.java index 8d93de4c..909de373 100644 --- a/bd-third/src/main/java/com/hzs/third/pay/service/impl/RefundServiceImpl.java +++ b/bd-third/src/main/java/com/hzs/third/pay/service/impl/RefundServiceImpl.java @@ -1,32 +1,38 @@ package com.hzs.third.pay.service.impl; import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.hzs.common.core.domain.R; import com.hzs.common.core.enums.*; -import com.hzs.common.core.utils.*; +import com.hzs.common.core.utils.CommonUtil; +import com.hzs.common.core.utils.DateUtils; +import com.hzs.common.core.utils.StringUtils; import com.hzs.common.domain.third.pay.TOnlinePayment; +import com.hzs.common.domain.third.pay.TOnlinePaymentSepAcc; +import com.hzs.common.domain.third.pay.TOnlinePaymentSepAccD; import com.hzs.common.domain.third.pay.TOnlineRefund; import com.hzs.common.domain.third.pay.ext.TOnlineRefundExt; import com.hzs.sale.refund.ISaRefundServiceApi; -import com.hzs.third.pay.config.*; -import com.hzs.third.pay.constants.*; +import com.hzs.third.pay.config.AllInPayConfig; +import com.hzs.third.pay.config.JdPayConfig; +import com.hzs.third.pay.config.JdPayWechatAlipayProperties; +import com.hzs.third.pay.constants.AllInPayConstants; +import com.hzs.third.pay.constants.JdPayConstants; import com.hzs.third.pay.dto.RefundDTO; -import com.hzs.third.pay.jdpay.dto.JdPayRefundRequest; -import com.hzs.third.pay.jdpay.dto.JdPayRefundResponse; +import com.hzs.third.pay.jdpay.dto.*; import com.hzs.third.pay.jdpay.sdk.JdPay; -import com.hzs.third.pay.service.IAllInPayService; -import com.hzs.third.pay.service.IRefundService; -import com.hzs.third.pay.service.ITOnlineRefundService; +import com.hzs.third.pay.jdpay.util.GsonUtil; +import com.hzs.third.pay.service.*; import com.hzs.third.pay.util.JdPayUtil; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.net.InetAddress; +import java.text.SimpleDateFormat; import java.util.*; /** @@ -47,11 +53,18 @@ public class RefundServiceImpl implements IRefundService { @DubboReference ISaRefundServiceApi iSaRefundServiceApi; - @Value("${jd.pay.refundNotifyUrl}") - private String refundNotifyUrl; - @Resource + @Resource(name = "jdPayBank") private JdPay jdPay; + @Resource + private JdPayWechatAlipayProperties jdPayWechatAlipayProperties; + + @Autowired + private ITOnlinePaymentService itOnlinePaymentService; + @Autowired + private ITOnlinePaymentSepAccService sepAccService; + @Autowired + private ITOnlinePaymentSepAccDService sepAccDService; @Override @@ -232,19 +245,19 @@ public class RefundServiceImpl implements IRefundService { // 服务调用返回信息 String resultMsg = ""; // 根据业务类型调用具体业务处理 dubbo 服务 - switch (businessType) { - case DIRECT_SELLING: - // 直销订单 - R saRefundR = iSaRefundServiceApi.onlinePayRefundCallback(onlineRefund.getPayBusinessCode(), onlineRefund.getBusinessCode(), onlineRefund.getRefundStatus(), onlineRefund.getErrorMsg()); - if (saRefundR.isSuccess()) { - resultBool = true; - } else { - resultBool = false; - resultMsg = saRefundR.getMsg(); - } - break; - default: - } +// switch (businessType) { +// case DIRECT_SELLING: +// // 直销订单 +// R saRefundR = iSaRefundServiceApi.onlinePayRefundCallback(onlineRefund.getPayBusinessCode(), onlineRefund.getRefundCode(), onlineRefund.getRefundStatus(), onlineRefund.getErrorMsg()); +// if (saRefundR.isSuccess()) { +// resultBool = true; +// } else { +// resultBool = false; +// resultMsg = saRefundR.getMsg(); +// } +// break; +// default: +// } if (null != resultBool) { if (resultBool) { @@ -363,7 +376,7 @@ public class RefundServiceImpl implements IRefundService { // 货币种类 .currency("CNY") // 退款回调地址 - .notifyUrl(this.refundNotifyUrl) + .notifyUrl(jdPayWechatAlipayProperties.getRefundNotifyUrl()) // 回传信息 // .returnParams("") .build(); @@ -397,4 +410,85 @@ public class RefundServiceImpl implements IRefundService { return "退款异常,请重试"; } } + + @Override + public String jdRefundDivision(String orderCode, Long userId) { + TOnlinePaymentSepAcc sepAcc = sepAccService.getSepAccByOrderCode(orderCode); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(TOnlinePaymentSepAccD::getPkSepAcc, sepAcc.getPkId()); + queryWrapper.eq(TOnlinePaymentSepAccD::getDelFlag, EDelFlag.UN_DELETE.getValue()); + queryWrapper.orderByAsc(TOnlinePaymentSepAccD::getPkId); + LambdaQueryWrapper paymentQueryWrapper = new LambdaQueryWrapper<>(); + paymentQueryWrapper.eq(TOnlinePayment::getBusinessCode, orderCode); + TOnlinePayment tOnlinePayment = itOnlinePaymentService.getOne(paymentQueryWrapper, false); + List sepAccDList = sepAccDService.list(queryWrapper); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); + String now = sdf.format(new Date()); + String refundCode = "R_" + orderCode; + JdPayRefundRequest request = JdPayRefundRequest.builder() + .outTradeNo("R_" + orderCode) + .originalOutTradeNo(orderCode) + .tradeAmount(sepAcc.getTradeAmount().multiply(new BigDecimal("100")).intValue() + "") + .currency("CNY") + .tradeDate(now) + .returnParams("") + .notifyUrl(jdPayWechatAlipayProperties.getRefundNotifyUrl()) + .build(); + + JdPayDivisionAccountRefund divisionAccountRefund = new JdPayDivisionAccountRefund(); + List divisionAccountTradeInfoList = new ArrayList<>(); + for (int i = 0; i < sepAccDList.size(); i++) { + TOnlinePaymentSepAccD sepAccD = sepAccDList.get(i); + JdPayDivisionAccountRefundInfo divisionAccountTradeInfo = new JdPayDivisionAccountRefundInfo(); + divisionAccountTradeInfo.setMerchantNo(sepAccD.getAccount()); + divisionAccountTradeInfo.setOutTradeNo("R_" + orderCode + "_" + ( i + 1 )); + divisionAccountTradeInfo.setOriginalOutTradeNo(sepAccD.getOutTradeNo()); + divisionAccountTradeInfo.setTradeAmount(sepAccD.getTradeAmount().multiply(new BigDecimal("100")).intValue() + ""); + divisionAccountTradeInfoList.add(divisionAccountTradeInfo); + } + divisionAccountRefund.setDivisionAccountRefundInfoList(divisionAccountTradeInfoList); + request.setDivisionAccountRefund(GsonUtil.toJson(divisionAccountRefund)); + try { + JdPayRefundResponse response = jdPay.refund(request); + log.info("JdPayRefundResponse -> {}", JSONUtil.toJsonStr(response)); + if ("0000".equals(response.getResultCode())) { + log.info("提交退款成功"); + TOnlineRefund tOnlineRefund = new TOnlineRefund(); + tOnlineRefund.setRefundCode(refundCode); + tOnlineRefund.setPkOnlinePayment(tOnlinePayment.getPkId()); + tOnlineRefund.setBusinessCode(tOnlinePayment.getBusinessCode()); + tOnlineRefund.setRefundMoney(tOnlinePayment.getPayMoney()); + tOnlineRefund.setRefundChannel(tOnlinePayment.getPayChannel()); + tOnlineRefund.setRefundNumber(response.getTradeNo()); + tOnlineRefund.setPkCountry(1); + tOnlineRefund.setPkCreator(userId); + itOnlineRefundService.save(tOnlineRefund); + return "提交退款成功"; + } else { + log.info("提交退款失败"); + return "提交退款失败!["+response.getResultDesc()+"]"; + } + } catch (Exception e) { + return "提交退款异常! ["+e.getMessage()+"]"; + } + } + + @Override + public String jdQueryEnterpriseWalletBalance() { + JdPayQueryEnterpriseWalletBalanceRequest request1 = JdPayQueryEnterpriseWalletBalanceRequest.builder() + .accountNo("153428607005") + .build(); + JdPayQueryEnterpriseWalletBalanceRequest request2 = JdPayQueryEnterpriseWalletBalanceRequest.builder() + .accountNo("153428607007") + .build(); + try { + JdPayQueryEnterpriseWalletBalanceResponse response1 = jdPay.queryEnterpriseWalletBalance(request1); + log.info("response1 -> {}", JSONUtil.toJsonStr(response1)); + JdPayQueryEnterpriseWalletBalanceResponse response2 = jdPay.queryEnterpriseWalletBalance(request2); + log.info("response2 -> {}", JSONUtil.toJsonStr(response2)); + } catch (Exception e) { + throw new RuntimeException(e); + } + return ""; + } } diff --git a/bd-third/src/main/java/com/hzs/third/pay/service/impl/TOnlinePaymentSepAccServiceImpl.java b/bd-third/src/main/java/com/hzs/third/pay/service/impl/TOnlinePaymentSepAccServiceImpl.java index aadf5ac3..dc014c05 100644 --- a/bd-third/src/main/java/com/hzs/third/pay/service/impl/TOnlinePaymentSepAccServiceImpl.java +++ b/bd-third/src/main/java/com/hzs/third/pay/service/impl/TOnlinePaymentSepAccServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.hzs.common.core.enums.EDelFlag; import com.hzs.common.core.utils.DateUtils; import com.hzs.common.domain.third.pay.TOnlinePaymentSepAcc; import com.hzs.common.domain.third.pay.TOnlinePaymentSepAccD; @@ -38,9 +39,10 @@ public class TOnlinePaymentSepAccServiceImpl extends ServiceImpl wrapperD = new LambdaQueryWrapper<>(); wrapperD.eq(TOnlinePaymentSepAccD::getPkSepAcc, tOnlinePaymentSepAcc.getPkId()); itOnlinePaymentSepAccDService.remove(wrapperD); @@ -51,9 +53,15 @@ public class TOnlinePaymentSepAccServiceImpl extends ServiceImpl - + @@ -14,6 +14,7 @@ + diff --git a/bd-third/src/main/resources/mapper/third/pay/TOnlinePaymentSepAccMapper.xml b/bd-third/src/main/resources/mapper/third/pay/TOnlinePaymentSepAccMapper.xml index a7a28bfe..e3890570 100644 --- a/bd-third/src/main/resources/mapper/third/pay/TOnlinePaymentSepAccMapper.xml +++ b/bd-third/src/main/resources/mapper/third/pay/TOnlinePaymentSepAccMapper.xml @@ -1,6 +1,6 @@ - + @@ -16,6 +16,7 @@ + @@ -27,5 +28,8 @@ PK_MODIFIED, PK_ID, PK_PAYMENT, VERSION, REQ_CONTENT, REQ_CONTENT_SEP_ACC, RESP_CONTENT + diff --git a/sql/2025年7月1日_京东支付_分账.sql b/sql/2025年7月1日_京东支付_分账.sql index 9e5e94d5..56ccbaf0 100644 --- a/sql/2025年7月1日_京东支付_分账.sql +++ b/sql/2025年7月1日_京东支付_分账.sql @@ -87,3 +87,13 @@ COMMENT ON COLUMN "CLOUD_2"."T_ONLINE_PAYMENT_SEP_ACC"."TRADE_AMOUNT" IS '总金 ALTER TABLE "CLOUD_2"."T_ONLINE_PAYMENT_SEP_ACC_D" ADD ("TRADE_AMOUNT" NUMBER(16,2)); COMMENT ON COLUMN "CLOUD_2"."T_ONLINE_PAYMENT_SEP_ACC_D"."TRADE_AMOUNT" IS '分账金额'; + +ALTER TABLE "CLOUD_2"."T_ONLINE_PAYMENT_SEP_ACC" + ADD ("OUT_TRADE_NO" VARCHAR2(255)); + +COMMENT ON COLUMN "CLOUD_2"."T_ONLINE_PAYMENT_SEP_ACC"."OUT_TRADE_NO" IS '支付流水号'; + +ALTER TABLE "CLOUD_2"."T_ONLINE_PAYMENT_SEP_ACC_D" + ADD ("OUT_TRADE_NO" VARCHAR2(255)); + +COMMENT ON COLUMN "CLOUD_2"."T_ONLINE_PAYMENT_SEP_ACC_D"."OUT_TRADE_NO" IS '支付流水号';