diff --git a/bd-third/src/main/java/com/hzs/third/pay/controller/manage/OnlinePaymentController.java b/bd-third/src/main/java/com/hzs/third/pay/controller/manage/OnlinePaymentController.java index a0c2ca1e..04f31b7b 100644 --- a/bd-third/src/main/java/com/hzs/third/pay/controller/manage/OnlinePaymentController.java +++ b/bd-third/src/main/java/com/hzs/third/pay/controller/manage/OnlinePaymentController.java @@ -2,6 +2,7 @@ package com.hzs.third.pay.controller.manage; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.hzs.common.core.annotation.AccessPermissions; import com.hzs.common.core.annotation.Log; import com.hzs.common.core.constant.EnumsPrefixConstants; @@ -21,6 +22,7 @@ import com.hzs.common.service.ITransactionCommonService; import com.hzs.common.util.TransactionUtils; import com.hzs.third.pay.param.OnlinePaymentParam; import com.hzs.third.pay.param.OnlinePaymentRetryParam; +import com.hzs.third.pay.service.IJdPayService; import com.hzs.third.pay.service.IPayService; import com.hzs.third.pay.service.ITOnlinePaymentService; import com.hzs.third.pay.vo.OnlinePaymentVO; @@ -48,6 +50,8 @@ public class OnlinePaymentController extends BaseController { private ITOnlinePaymentService itOnlinePaymentService; @Autowired private IPayService iPayService; + @Autowired + private IJdPayService iJdPayService; @Autowired private ITransactionCommonService iTransactionCommonService; @@ -144,4 +148,16 @@ public class OnlinePaymentController extends BaseController { return toAjax(iPayService.retryHandle(tOnlinePayment, false)); } + /** + * 补偿支付回调 + * + * @param param 业务重试入参 + * @return + */ + @Log(module = EOperationModule.ONLINE_PAY_DETAIL, business = EOperationBusiness.ONLINE_PAY_DETAIL, method = EOperationMethod.SUBMIT) + @GetMapping("/compensationCallBack") + public AjaxResult compensationCallBack(@RequestParam("businessCode") String businessCode) { + return iJdPayService.compensationCallBack(businessCode); + } + } diff --git a/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayQueryOrderRequest.java b/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayQueryOrderRequest.java new file mode 100644 index 00000000..96be5cad --- /dev/null +++ b/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayQueryOrderRequest.java @@ -0,0 +1,27 @@ +package com.hzs.third.pay.jdpay.dto; + + +import java.io.Serializable; + +public class JdPayQueryOrderRequest implements Serializable { + /** + * 商户订单号 + */ + private String outTradeNo; + + + public String getOutTradeNo() { + return outTradeNo; + } + + public void setOutTradeNo(String outTradeNo) { + this.outTradeNo = outTradeNo; + } + + @Override + public String toString() { + return "{ \"outTradeNo\":\"" + outTradeNo + "\"" + + "}" + ; + } +} diff --git a/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayQueryOrderResponse.java b/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayQueryOrderResponse.java new file mode 100644 index 00000000..7900664a --- /dev/null +++ b/bd-third/src/main/java/com/hzs/third/pay/jdpay/dto/JdPayQueryOrderResponse.java @@ -0,0 +1,197 @@ +package com.hzs.third.pay.jdpay.dto; + +import java.io.Serializable; + +public class JdPayQueryOrderResponse implements Serializable { + /** + * 京东交易订单号 + */ + private String tradeNo; + /** + * 商户订单号 + */ + private String outTradeNo; + /** + * 订单总金额 + */ + private String tradeAmount; + /** + * 支付完成时间 + */ + private String finishDate; + /** + * 交易类型 + */ + private String tradeType; + /** + * 交易状态 + */ + private String tradeStatus; + /** + * 回传字段 + */ + private String returnParams; + /** + * 商户用户标识 + */ + private String userId; + /** + * 优惠金额 + */ + private String discountAmount; + /** + * 支付工具 + */ + private String payTool; + /** + * ] + * 掩码卡号 + */ + private String maskCardNo; + /** + * 卡类型 + */ + private String cardType; + /** + * 银行编码 + */ + private String bankCode; + /** + * 白条分期数 + */ + private String installmentNum; + + + public String getTradeNo() { + return tradeNo; + } + + public void setTradeNo(String tradeNo) { + this.tradeNo = tradeNo; + } + + public String getOutTradeNo() { + return outTradeNo; + } + + public void setOutTradeNo(String outTradeNo) { + this.outTradeNo = outTradeNo; + } + + public String getTradeAmount() { + return tradeAmount; + } + + public void setTradeAmount(String tradeAmount) { + this.tradeAmount = tradeAmount; + } + + public String getFinishDate() { + return finishDate; + } + + public void setFinishDate(String finishDate) { + this.finishDate = finishDate; + } + + public String getTradeType() { + return tradeType; + } + + public void setTradeType(String tradeType) { + this.tradeType = tradeType; + } + + public String getTradeStatus() { + return tradeStatus; + } + + public void setTradeStatus(String tradeStatus) { + this.tradeStatus = tradeStatus; + } + + public String getReturnParams() { + return returnParams; + } + + public void setReturnParams(String returnParams) { + this.returnParams = returnParams; + } + + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getDiscountAmount() { + return discountAmount; + } + + public void setDiscountAmount(String discountAmount) { + this.discountAmount = discountAmount; + } + + public String getPayTool() { + return payTool; + } + + public void setPayTool(String payTool) { + this.payTool = payTool; + } + + public String getMaskCardNo() { + return maskCardNo; + } + + public void setMaskCardNo(String maskCardNo) { + this.maskCardNo = maskCardNo; + } + + public String getCardType() { + return cardType; + } + + public void setCardType(String cardType) { + this.cardType = cardType; + } + + public String getBankCode() { + return bankCode; + } + + public void setBankCode(String bankCode) { + this.bankCode = bankCode; + } + + public String getInstallmentNum() { + return installmentNum; + } + + public void setInstallmentNum(String installmentNum) { + this.installmentNum = installmentNum; + } + + @Override + public String toString() { + return "{\"tradeNo\":\"" + tradeNo + "\"" + + ", \"outTradeNo\":\"" + outTradeNo + "\"" + + ", \"tradeAmount\":\"" + tradeAmount + "\"" + + ", \"finishDate\":\"" + finishDate + "\"" + + ", \"tradeType\":\"" + tradeType + "\"" + + ", \"tradeStatus\":\"" + tradeStatus + "\"" + + ", \"returnParams\":\"" + returnParams + "\"" + + ", \"userId\":\"" + userId + "\"" + + ", \"discountAmount\":\"" + discountAmount + "\"" + + ", \"payTool\":\"" + payTool + "\"" + + ", \"maskCardNo\":\"" + maskCardNo + "\"" + + ", \"cardType\":\"" + cardType + "\"" + + ", \"bankCode\":\"" + bankCode + "\"" + + ", \"installmentNum\":\"" + installmentNum + "\"" + + "}" + ; + } +} 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 f5898780..82ac5acc 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 @@ -56,9 +56,9 @@ public class JdPay { // * @return JdPayQueryOrderResponse 返回数据 // * @throws Exception // */ -// public JdPayQueryOrderResponse queryOrder(JdPayQueryOrderRequest request) throws Exception { -// return this.baseExecute(JdPayConstant.TRADE_QUERY_URL, request, JdPayQueryOrderResponse.class); -// } + public JdPayQueryOrderResponse queryOrder(JdPayQueryOrderRequest request) throws Exception { + return this.baseExecute(JdPayConstant.TRADE_QUERY_URL, request, JdPayQueryOrderResponse.class); + } // // /** // * 作用:代扣 diff --git a/bd-third/src/main/java/com/hzs/third/pay/service/IJdPayService.java b/bd-third/src/main/java/com/hzs/third/pay/service/IJdPayService.java index ccd9a9d1..9b69a4b9 100644 --- a/bd-third/src/main/java/com/hzs/third/pay/service/IJdPayService.java +++ b/bd-third/src/main/java/com/hzs/third/pay/service/IJdPayService.java @@ -2,6 +2,7 @@ package com.hzs.third.pay.service; import com.hzs.common.core.domain.R; import com.hzs.common.core.enums.EDataSource; +import com.hzs.common.core.web.domain.AjaxResult; import com.hzs.common.domain.third.pay.TOnlinePayment; /** @@ -18,4 +19,12 @@ public interface IJdPayService { */ R cashRegister(TOnlinePayment onlinePayment, EDataSource dataSource); + /** + * 收银台支付 + * + * @param onlinePayment + * @param dataSource + * @return + */ + AjaxResult compensationCallBack(String businessCode); } 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 a2c6b4ac..2492cbdc 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 @@ -2,11 +2,12 @@ package com.hzs.third.pay.service.impl; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.hzs.common.core.config.BdConfig; import com.hzs.common.core.domain.R; -import com.hzs.common.core.enums.EDataSource; -import com.hzs.common.core.enums.EEnv; +import com.hzs.common.core.enums.*; import com.hzs.common.core.utils.DateUtils; +import com.hzs.common.core.web.domain.AjaxResult; import com.hzs.common.domain.third.pay.TOnlinePayment; import com.hzs.common.domain.third.pay.TOnlinePaymentSepAcc; import com.hzs.common.domain.third.pay.TOnlinePaymentSepAccD; @@ -15,16 +16,10 @@ import com.hzs.third.pay.config.JdPayBankProperties; import com.hzs.third.pay.config.JdPayConfig; import com.hzs.third.pay.config.JdPaySeparateAccountConfig; import com.hzs.third.pay.config.JdPayWechatAlipayProperties; -import com.hzs.third.pay.jdpay.dto.JdPayAggregateCreateOrderRequest; -import com.hzs.third.pay.jdpay.dto.JdPayAggregateCreateOrderResponse; -import com.hzs.third.pay.jdpay.dto.JdPayDivisionAccount; -import com.hzs.third.pay.jdpay.dto.JdPayDivisionAccountTradeInfo; +import com.hzs.third.pay.jdpay.dto.*; import com.hzs.third.pay.jdpay.sdk.JdPay; import com.hzs.third.pay.jdpay.util.GsonUtil; -import com.hzs.third.pay.service.IJdPayService; -import com.hzs.third.pay.service.ITOnlineCardService; -import com.hzs.third.pay.service.ITOnlinePaymentSepAccService; -import com.hzs.third.pay.service.ITOnlinePaymentService; +import com.hzs.third.pay.service.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; @@ -35,6 +30,7 @@ import java.math.BigDecimal; import java.net.InetAddress; import java.util.ArrayList; import java.util.Comparator; +import java.util.Date; import java.util.List; /** @@ -59,6 +55,8 @@ public class JdPayServiceImpl implements IJdPayService { @Autowired private ITOnlinePaymentService itOnlinePaymentService; + @Autowired + private IPayService iPayService; @Resource private JdPayWechatAlipayProperties jdPayWechatAlipayProperties; @@ -196,4 +194,94 @@ public class JdPayServiceImpl implements IJdPayService { } + + @Override + public AjaxResult compensationCallBack(String businessCode) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(TOnlinePayment::getBusinessCode, businessCode); + queryWrapper.eq(TOnlinePayment::getDelFlag, EDelFlag.UN_DELETE.getValue()); + TOnlinePayment tOnlinePayment = itOnlinePaymentService.getOne(queryWrapper, false); + if(ObjectUtil.isEmpty(tOnlinePayment)){ + return AjaxResult.error("订单不存在"); + } + JdPayQueryOrderRequest request = new JdPayQueryOrderRequest(); + request.setOutTradeNo(tOnlinePayment.getBusinessCode()); + JdPayQueryOrderResponse response = null; + try { + response = jdPay.queryOrder(request); + if (ObjectUtil.isEmpty(response.getTradeNo()) || EPayStatus.PAID.getValue() == tOnlinePayment.getPayStatus()) { + log.error("支付信息不存在或已支付"); + return AjaxResult.success("已支付订单 无需补偿回调!"); + } + log.info("queryOrder : {}", JSONUtil.toJsonStr(response)); + { + // 支付成功处理 + + // 商户订单号 + String payNumber = response.getTradeNo(); + // 渠道流水号 + String channelNumber = ""; + // 支付完成时间 + Date payTime = DateUtils.parseDateOne(response.getFinishDate(), DateUtils.YAMMERERS); + + // 回调订单编号 + String thirdOrderCode = response.getOutTradeNo(); + // 订单编号 + String acqOrderId = "compensationCallBack"; + + // 订单金额 + int tradeAmount = Integer.parseInt(response.getTradeAmount()); + BigDecimal payMoney = new BigDecimal(tradeAmount).divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_UP); + Integer payType = convertPayType(response.getPayTool()); + // 支付后续业务处理 + if (iPayService.notifyHandle(tOnlinePayment.getBusinessType().toString() , thirdOrderCode, thirdOrderCode, payNumber, payTime, payMoney, EPayChannel.JD, channelNumber, payType, acqOrderId)) { + return AjaxResult.success(); + } + } + } catch (Exception e) { + throw new RuntimeException(e); + } + return AjaxResult.success(); + } + + + /** + * 京东收银台处理成功返回 + */ + private static final String SUCCESS = "SUCCESS"; + /** + * 京东收银台处理失败返回 + */ + private static final String ERROR = "ERROR"; + private Integer convertPayType(String payName){ + Integer result = EPayType.WECHAT.getValue(); + switch (payName){ + case "XJK": + result = EPayType.MINI_TREASURY.getValue(); + break; + case "JIOU": + result = EPayType.CREDIT_LINE.getValue(); + break; + case "SJIOU": + result = EPayType.SUPER_CREDIT_LINE.getValue(); + break; + case "ACCT": + result = EPayType.WALLET_BALANCE.getValue(); + break; + case "EXPR": + result = EPayType.BANK_CARD.getValue(); + break; + case "WX": + result = EPayType.WECHAT.getValue(); + break; + case "ALIPAY": + result = EPayType.ALIPAY.getValue(); + break; + case "YSF": + result = EPayType.CLOUD_PAY.getValue(); + break; + + } + return result; + } } diff --git a/bd-third/src/main/java/com/hzs/third/pay/service/impl/PayServiceImpl.java b/bd-third/src/main/java/com/hzs/third/pay/service/impl/PayServiceImpl.java index 52524fdd..58c1bf2d 100644 --- a/bd-third/src/main/java/com/hzs/third/pay/service/impl/PayServiceImpl.java +++ b/bd-third/src/main/java/com/hzs/third/pay/service/impl/PayServiceImpl.java @@ -2,10 +2,12 @@ package com.hzs.third.pay.service.impl; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.hzs.common.core.constant.CacheConstants; import com.hzs.common.core.constant.MagicNumberConstants; import com.hzs.common.core.constant.RabbitMqConstants; import com.hzs.common.core.domain.R; import com.hzs.common.core.enums.*; +import com.hzs.common.core.service.RedisService; import com.hzs.common.domain.third.pay.TOnlinePayment; import com.hzs.member.account.IMemberTradeServiceApi; import com.hzs.retail.sale.IRetailOrderServiceApi; @@ -33,6 +35,8 @@ public class PayServiceImpl implements IPayService { private ITOnlinePaymentService itOnlinePaymentService; @Autowired private RabbitTemplate rabbitTemplate; + @Autowired + private RedisService redisService; @DubboReference IRetailOrderServiceApi iRetailOrderServiceApi; @@ -118,8 +122,11 @@ public class PayServiceImpl implements IPayService { log.error("支付信息不存在或已支付"); return false; } - + String redisKey = CacheConstants.ONLINE_PAY_KEY + businessCode; try { + if(!redisService.lockKeyOnce(redisKey, 10)){ + return false; + } if (!PayUtil.checkAmount(onlinePayment.getBusinessMoney(), payMoney)) { // 业务金额 大于 实际支付金额 log.error("业务金额大于实际支付金额,支付编号:{}, 支付金额:{}", onlinePayment.getPaymentCode(), payMoney); @@ -156,6 +163,8 @@ public class PayServiceImpl implements IPayService { .set(TOnlinePayment::getCallbackStatus, ECallbackStatus.FAIL.getValue()) .set(TOnlinePayment::getCallbackInfo, e.getMessage()) ); + } finally { + redisService.unlock(redisKey); } return false; } diff --git a/bd-third/src/main/java/com/hzs/third/pay/vo/OnlinePaymentVO.java b/bd-third/src/main/java/com/hzs/third/pay/vo/OnlinePaymentVO.java index dcb37984..a7d68908 100644 --- a/bd-third/src/main/java/com/hzs/third/pay/vo/OnlinePaymentVO.java +++ b/bd-third/src/main/java/com/hzs/third/pay/vo/OnlinePaymentVO.java @@ -97,7 +97,7 @@ public class OnlinePaymentVO { /** * 支付状态(0=未支付,1=已支付) */ - @JsonIgnore +// @JsonIgnore @Transaction(transactionKey = EnumsPrefixConstants.PAY_STATUS) private Integer payStatus; /**