fadd
This commit is contained in:
@@ -122,6 +122,7 @@ func (l *AdminRefundOrderLogic) handleXpayRefund(order *model.Order, req *types.
|
|||||||
}
|
}
|
||||||
refundNo := l.generateRefundNo(order.OrderNo)
|
refundNo := l.generateRefundNo(order.OrderNo)
|
||||||
_ = l.createRefundRecordOnly(order, req, refundNo, "", model.OrderRefundStatusSuccess)
|
_ = l.createRefundRecordOnly(order, req, refundNo, "", model.OrderRefundStatusSuccess)
|
||||||
|
l.Infof("[xpay] admin refund OK order_no=%s amount=%.2f", order.OrderNo, req.RefundAmount)
|
||||||
return &types.AdminRefundOrderResp{
|
return &types.AdminRefundOrderResp{
|
||||||
Status: model.OrderStatusRefunded,
|
Status: model.OrderStatusRefunded,
|
||||||
RefundNo: refundNo,
|
RefundNo: refundNo,
|
||||||
|
|||||||
@@ -105,8 +105,17 @@ func (l *PaymentCheckLogic) syncXpayOrderStatus(order *model.Order) (xpaySyncInf
|
|||||||
return info, nil
|
return info, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if service.IsXpayRefundedStatus(status.Status) || service.IsXpayAlreadyRefunded(status) {
|
||||||
|
order.Status = model.OrderStatusRefunded
|
||||||
|
if updateErr := l.svcCtx.OrderModel.UpdateWithVersion(l.ctx, nil, order); updateErr != nil {
|
||||||
|
return info, updateErr
|
||||||
|
}
|
||||||
|
l.Infof("[xpay] check sync refunded order_no=%s wx_status=%d left_fee=%d", order.OrderNo, status.Status, status.LeftFee)
|
||||||
|
return info, nil
|
||||||
|
}
|
||||||
|
|
||||||
if service.IsXpayClosedStatus(status.Status) {
|
if service.IsXpayClosedStatus(status.Status) {
|
||||||
order.Status = "closed"
|
order.Status = model.OrderStatusClosed
|
||||||
if updateErr := l.svcCtx.OrderModel.UpdateWithVersion(l.ctx, nil, order); updateErr != nil {
|
if updateErr := l.svcCtx.OrderModel.UpdateWithVersion(l.ctx, nil, order); updateErr != nil {
|
||||||
return info, updateErr
|
return info, updateErr
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ func RefundXpayQueryOrder(ctx context.Context, svcCtx *svc.ServiceContext, order
|
|||||||
if refundErr := svcCtx.XpayService.RefundOrder(ctx, openid, order.OrderNo, refundOrderID, refundFeeFen); refundErr != nil {
|
if refundErr := svcCtx.XpayService.RefundOrder(ctx, openid, order.OrderNo, refundOrderID, refundFeeFen); refundErr != nil {
|
||||||
return refundErr
|
return refundErr
|
||||||
}
|
}
|
||||||
|
logx.WithContext(ctx).Infof("[xpay] refund local sync order_no=%s", order.OrderNo)
|
||||||
|
|
||||||
return svcCtx.OrderModel.Trans(ctx, func(transCtx context.Context, session sqlx.Session) error {
|
return svcCtx.OrderModel.Trans(ctx, func(transCtx context.Context, session sqlx.Session) error {
|
||||||
order.Status = model.OrderStatusRefunded
|
order.Status = model.OrderStatusRefunded
|
||||||
|
|||||||
@@ -294,8 +294,8 @@ func (s *XpayService) QueryOrder(ctx context.Context, openid, orderNo, sessionKe
|
|||||||
status.RawOrder = string(orderRaw)
|
status.RawOrder = string(orderRaw)
|
||||||
_ = json.Unmarshal(orderRaw, &status)
|
_ = json.Unmarshal(orderRaw, &status)
|
||||||
}
|
}
|
||||||
logx.WithContext(ctx).Infof("[xpay] query_order order_no=%s status=%d paid_fee=%d left_fee=%d wx_order_id=%s err_msg=%s raw=%s",
|
logx.WithContext(ctx).Infof("[xpay] query_order order_no=%s status=%d paid_fee=%d left_fee=%d wx_order_id=%s err_msg=%s",
|
||||||
orderNo, status.Status, status.PaidFee, status.LeftFee, status.WxOrderID, status.ErrMsg, status.RawOrder)
|
orderNo, status.Status, status.PaidFee, status.LeftFee, status.WxOrderID, status.ErrMsg)
|
||||||
return &status, nil
|
return &status, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -309,6 +309,11 @@ func (s *XpayService) RefundOrder(ctx context.Context, openid, orderNo, refundOr
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("退款前查单失败: %w", err)
|
return fmt.Errorf("退款前查单失败: %w", err)
|
||||||
}
|
}
|
||||||
|
if IsXpayAlreadyRefunded(status) {
|
||||||
|
logx.WithContext(ctx).Infof("[xpay] refund_order skip already refunded order_no=%s wx_status=%d left_fee=%d paid_fee=%d",
|
||||||
|
orderNo, status.Status, status.LeftFee, status.PaidFee)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
leftFee := status.LeftFee
|
leftFee := status.LeftFee
|
||||||
if leftFee <= 0 {
|
if leftFee <= 0 {
|
||||||
leftFee = status.PaidFee
|
leftFee = status.PaidFee
|
||||||
@@ -339,7 +344,7 @@ func (s *XpayService) RefundOrder(ctx context.Context, openid, orderNo, refundOr
|
|||||||
apiResp, err := s.callAPI(ctx, "/xpay/refund_order", bodyJSON, "", false)
|
apiResp, err := s.callAPI(ctx, "/xpay/refund_order", bodyJSON, "", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if xpayErr, ok := err.(*XpayAPIError); ok {
|
if xpayErr, ok := err.(*XpayAPIError); ok {
|
||||||
if xpayErr.ErrCode == 268490004 || xpayErr.ErrCode == 268490014 {
|
if xpayErr.ErrCode == 268490004 || xpayErr.ErrCode == 268490005 || xpayErr.ErrCode == 268490014 {
|
||||||
logx.WithContext(ctx).Infof("[xpay] refund_order idempotent order_no=%s errcode=%d", orderNo, xpayErr.ErrCode)
|
logx.WithContext(ctx).Infof("[xpay] refund_order idempotent order_no=%s errcode=%d", orderNo, xpayErr.ErrCode)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -384,14 +389,30 @@ func (s *XpayService) NotifyProvideGoods(ctx context.Context, openid, orderNo, w
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsPaidStatus 微信订单状态 2/3/4 视为支付成功
|
// IsXpayPaidStatus 微信订单状态 2/3/4 视为支付成功
|
||||||
func IsXpayPaidStatus(status int) bool {
|
func IsXpayPaidStatus(status int) bool {
|
||||||
return status == 2 || status == 3 || status == 4
|
return status == 2 || status == 3 || status == 4
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsXpayClosedStatus 5~10 视为关闭
|
// IsXpayRefundedStatus 微信侧已退款:5=订单已经退款,8=用户退款完成
|
||||||
|
func IsXpayRefundedStatus(status int) bool {
|
||||||
|
return status == 5 || status == 8
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsXpayAlreadyRefunded 查单结果表示微信侧已无可退金额(含在微信后台手动退款、本地未同步的情况)
|
||||||
|
func IsXpayAlreadyRefunded(status *xpayOrderStatus) bool {
|
||||||
|
if status == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if IsXpayRefundedStatus(status.Status) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return status.PaidFee > 0 && status.LeftFee == 0 && status.Status >= 2
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsXpayClosedStatus 6 视为关闭
|
||||||
func IsXpayClosedStatus(status int) bool {
|
func IsXpayClosedStatus(status int) bool {
|
||||||
return status >= 5 && status <= 10
|
return status == 6
|
||||||
}
|
}
|
||||||
|
|
||||||
// VerifyPushSignature GET 验签(消息推送配置)
|
// VerifyPushSignature GET 验签(消息推送配置)
|
||||||
|
|||||||
Reference in New Issue
Block a user