payment_id没有保存到financial_master表的问题,以及处理支付回调中 支付单、财务单、订单的关联关系

This commit is contained in:
HH 2022-07-21 15:12:41 +08:00
parent 2113e902e7
commit d37f005b8d
7 changed files with 34 additions and 45 deletions

View File

@ -21,10 +21,6 @@ public class PayCallback {
*/ */
@JSONField(name = "created_time") @JSONField(name = "created_time")
private Long createdTime; private Long createdTime;
/**
* 支付时间
*/
private long payTime;
/** /**
* 必填订单号 * 必填订单号
*/ */

View File

@ -20,6 +20,12 @@ public class PaymentDTO extends Payment {
*/ */
private String status; private String status;
/**
* 手续费
*/
@JSONField(name = "fee_amt")
private String feeAmt;
/** /**
* 支付时间 * 支付时间
*/ */

View File

@ -47,18 +47,18 @@ public interface FinancialMasterMapper {
/** /**
* 支付成功 * 支付成功
* *
* @param orderNo 订单号 * @param paymentId 支付ID
* @param payType 支付渠道 * @param payType 支付渠道
*/ */
void paySucceeded(@Param(value = "orderNo") String orderNo, @Param(value = "payType") int payType); void paySucceeded(@Param(value = "paymentId") String paymentId, @Param(value = "payType") int payType);
/** /**
* 支付成功 * 支付成功
* *
* @param orderNo 订单号 * @param orderMasterCode 订单号
* @param payStatus 支付渠道 * @param payStatus 支付渠道
*/ */
void updateOrderStatus(@Param(value = "orderNo") String orderNo, @Param(value = "payStatus") int payStatus); void updateOrderStatus(@Param(value = "orderMasterCode") String orderMasterCode, @Param(value = "payStatus") int payStatus);
/** /**

View File

@ -46,10 +46,10 @@ public interface FinancialMasterService {
/** /**
* 支付成功 * 支付成功
* *
* @param orderMasterCode 主订单号 * @param paymentId 支付ID
* @param payChannel 支付渠道 * @param payChannel 支付渠道
*/ */
void paySucceeded(String orderMasterCode, String payChannel); void paySucceeded(String paymentId, String payChannel);
/** /**
* 创建主财务单CODE * 创建主财务单CODE

View File

@ -8,8 +8,6 @@ import com.ghy.payment.domain.FinancialMaster;
import com.ghy.payment.mapper.FinancialMasterMapper; import com.ghy.payment.mapper.FinancialMasterMapper;
import com.ghy.payment.mapper.PaymentMapper; import com.ghy.payment.mapper.PaymentMapper;
import com.ghy.payment.service.FinancialMasterService; import com.ghy.payment.service.FinancialMasterService;
import com.huifu.adapay.model.Payment;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -21,8 +19,6 @@ import java.time.format.DateTimeFormatterBuilder;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
import static com.ghy.common.adapay.PayChannel.ALIPAY;
import static com.ghy.common.adapay.PayChannel.WX;
import static java.time.temporal.ChronoField.*; import static java.time.temporal.ChronoField.*;
/** /**
@ -74,14 +70,17 @@ public class FinancialMasterServiceImpl implements FinancialMasterService {
} }
@Override @Override
public void paySucceeded(String orderMasterCode, String payChannel) { public void paySucceeded(String paymentId, String payChannel) {
int payType;
try { try {
payType = PayTypeEnum.valueOf(payChannel.toUpperCase()).getCode();
financialMasterMapper.paySucceeded(orderMasterCode, PayTypeEnum.valueOf(payChannel.toUpperCase()).getCode());
financialMasterMapper.updateOrderStatus(orderMasterCode, PayStatus.PAID.getCode());
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
logger.warn("OrderNo[{}] Unknown payChannel [{}]!", orderMasterCode, payChannel); payType = -1;
logger.error("paymentId[{}] Unknown payChannel [{}]!", paymentId, payChannel);
} }
FinancialMaster financialMaster = financialMasterMapper.selectByPaymentId(paymentId);
financialMasterMapper.updateOrderStatus(financialMaster.getOrderMasterCode(), PayStatus.PAID.getCode());
financialMasterMapper.paySucceeded(paymentId, payType);
} }
@Override @Override

View File

@ -12,10 +12,8 @@ import com.ghy.payment.service.FinancialMasterService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.HashSet;
/** /**
* 支付回调 * 支付回调
@ -27,36 +25,28 @@ public class PayCallbackService implements CallBackService {
private static final Logger logger = LoggerFactory.getLogger(PayCallbackService.class); private static final Logger logger = LoggerFactory.getLogger(PayCallbackService.class);
// 用HashSet检索效率高
private final static HashSet<String> orderNoSet = new HashSet<>(1024);
@Resource @Resource
FinancialMasterService financialMasterService; FinancialMasterService financialMasterService;
@Override @Override
public void onCallback(Event event) { public void onCallback(Event event) {
logger.info("pay callback is {}", event); logger.info("支付回调: {}", event);
String data = event.getData(); String data = event.getData();
PayCallback payment = JSON.parseObject(data, PayCallback.class); PayCallback payment = JSON.parseObject(data, PayCallback.class);
Assert.hasText(payment.getOrderNo(), "orderNo is blank !!!"); PaymentDTO dto = financialMasterService.selectPaymentById(payment.getId());
// 校验是否是本系统发出去的回调请求 // 校验是否是本系统发出去的支付请求
boolean ours = orderNoSet.remove(payment.getOrderNo()); if (dto != null) {
if (!ours) {
//如果内存里没有 就从数据库里找这条记录
PaymentDTO dto = financialMasterService.selectPaymentById(payment.getId());
ours = dto != null;
}
if (ours) {
// 更新交易记录 // 更新交易记录
PaymentDTO param = new PaymentDTO(); PaymentDTO param = new PaymentDTO();
param.setId(payment.getId()); param.setId(payment.getId());
param.setFeeAmt(payment.getFeeAmt());
param.setStatus(payment.getStatus()); param.setStatus(payment.getStatus());
param.setPayTime(System.currentTimeMillis()); param.setPayTime(System.currentTimeMillis());
financialMasterService.updatePayment(param); financialMasterService.updatePayment(param);
if (AdapayStatusEnum.succeeded.code.equals(payment.getStatus())) { if (AdapayStatusEnum.succeeded.code.equals(payment.getStatus())) {
// 修改主财务单状态 // 更新主财务单状态
financialMasterService.paySucceeded(payment.getOrderNo().split("_")[0], payment.getPayChannel()); financialMasterService.paySucceeded(payment.getId(), payment.getPayChannel());
} else { } else {
logger.warn("支付失败 : {}", payment); logger.warn("支付失败 : {}", payment);
} }
@ -67,7 +57,7 @@ public class PayCallbackService implements CallBackService {
@Override @Override
public void onResponse(JSONObject response) { public void onResponse(JSONObject response) {
logger.info("支付结果: {}", response.toJSONString()); logger.info("发起支付 Response: {}", response.toJSONString());
// 保存一条支付记录 // 保存一条支付记录
PaymentDTO payment = response.toJavaObject(PaymentDTO.class); PaymentDTO payment = response.toJavaObject(PaymentDTO.class);
String status = payment.getStatus(); String status = payment.getStatus();
@ -79,10 +69,8 @@ public class PayCallbackService implements CallBackService {
update.setPaymentId(payment.getId()); update.setPaymentId(payment.getId());
financialMasterService.updateFinancialMaster(update); financialMasterService.updateFinancialMaster(update);
} else { } else {
logger.warn("请求支付失败 : {}", response.toJSONString()); logger.warn("发起支付失败 : {}", response.toJSONString());
} }
// 将记录保存到临时会话中
orderNoSet.add(response.getString("order_no"));
} }
} }

View File

@ -101,12 +101,12 @@
pay_type = #{payType}, pay_type = #{payType},
pay_time = SYSDATE(), pay_time = SYSDATE(),
update_time = SYSDATE() update_time = SYSDATE()
WHERE order_master_code = #{orderNo} WHERE payment_id = #{paymentId}
</update> </update>
<update id="updateOrderStatus"> <update id="updateOrderStatus">
UPDATE order_master SET pay_status = #{payStatus} , pay_time = SYSDATE(), update_time = SYSDATE() UPDATE order_master SET pay_status = #{payStatus} , pay_time = SYSDATE(), update_time = SYSDATE()
WHERE code = #{orderNo} WHERE code = #{orderMasterCode}
</update> </update>
<insert id="insertFinancialMaster" parameterType="com.ghy.payment.domain.FinancialMaster" useGeneratedKeys="true" keyProperty="id"> <insert id="insertFinancialMaster" parameterType="com.ghy.payment.domain.FinancialMaster" useGeneratedKeys="true" keyProperty="id">