fix(camel_oil): improve callback retry logic and token update handling

- Increase CamelOilMaxCallbackRetry from 3 to 5 for callback attempts
- Refactor order callback failure flow to update notify status and count correctly
- Fix HTTP callback request to capture and return errors properly
- Use constant CamelOilMaxCallbackRetry for pending callback query condition
- Correct token bind count update with proper chained Data calls
- Add error return when token is disabled due to frequent input errors
- Comment out test call in ListAccount to prevent unintended execution
This commit is contained in:
danial
2025-12-11 22:51:34 +08:00
parent 85b552eec3
commit 74d892fad9
4 changed files with 29 additions and 28 deletions

View File

@@ -239,5 +239,5 @@ const (
CamelOilOrderExpireDuration = gtime.H
// CamelOilMaxCallbackRetry 回调最大重试次数
CamelOilMaxCallbackRetry = 3
CamelOilMaxCallbackRetry = 5
)

View File

@@ -1,10 +1,9 @@
package camel_oil
import (
v1 "kami/api/camel_oil/v1"
"testing"
)
func Test_sCamelOil_ListAccount(t *testing.T) {
(&sCamelOil{}).ListAccount(t.Context(), &v1.ListAccountReq{Keyword: "12345", Status: 2})
//(&sCamelOil{}).ListAccount(t.Context(), &v1.ListAccountReq{Keyword: "12345", Status: 2})
}

View File

@@ -37,25 +37,25 @@ func (s *sCamelOil) updateCallbackResult(ctx context.Context, order *entity.V1Ca
}
_ = s.RecordOrderHistory(ctx, order.OrderNo, consts.CamelOilOrderChangeTypeCallbackSuccess, "", historyDesc)
} else {
// 回调失败
notifyCount := order.NotifyCount + 1
notifyStatus := consts.CamelOilCallbackStatusPending
if notifyCount >= consts.CamelOilMaxCallbackRetry {
notifyStatus = consts.CamelOilCallbackStatusFailed
}
_, err := m.Where(dao.V1CamelOilOrder.Columns().Id, order.Id).Update(&do.V1CamelOilOrder{
NotifyStatus: notifyStatus,
NotifyCount: notifyCount,
})
if err != nil {
return gerror.Wrap(err, "更新回调失败状态失败")
}
_ = s.RecordOrderHistory(ctx, order.OrderNo, consts.CamelOilOrderChangeTypeCallbackFail, "", historyDesc)
return nil
}
// 回调失败
notifyCount := order.NotifyCount + 1
notifyStatus := consts.CamelOilCallbackStatusPending
if notifyCount >= consts.CamelOilMaxCallbackRetry {
notifyStatus = consts.CamelOilCallbackStatusFailed
}
_, err := m.Where(dao.V1CamelOilOrder.Columns().Id, order.Id).Update(&do.V1CamelOilOrder{
NotifyStatus: notifyStatus,
NotifyCount: notifyCount,
})
if err != nil {
return gerror.Wrap(err, "更新回调失败状态失败")
}
_ = s.RecordOrderHistory(ctx, order.OrderNo, consts.CamelOilOrderChangeTypeCallbackFail, "", historyDesc)
return nil
}
@@ -115,7 +115,7 @@ func (s *sCamelOil) executeCallback(ctx context.Context, order *entity.V1CamelOi
return errors.New("商户不存在")
}
// 发送 HTTP 回调请求
_, _ = gclient.New().Get(ctx, "http://kami_gateway:12309/myself/notify", g.Map{
_, err = gclient.New().Get(ctx, "http://kami_gateway:12309/myself/notify", g.Map{
"orderNo": order.OrderNo,
"orderPrice": order.Amount,
"factPrice": order.Amount,
@@ -125,7 +125,7 @@ func (s *sCamelOil) executeCallback(ctx context.Context, order *entity.V1CamelOi
"statusCode": "1",
"failReason": "无",
})
return nil
return err
}
// ProcessPendingCallbacks 处理待回调订单(定时任务使用)
@@ -136,9 +136,10 @@ func (s *sCamelOil) ProcessPendingCallbacks(ctx context.Context) error {
InnerJoin(dao.V1CamelOilCardBinding.Table(), fmt.Sprintf("%s.%s = %s.%s",
dao.V1CamelOilOrder.Table(), dao.V1CamelOilOrder.Columns().Id,
dao.V1CamelOilCardBinding.Table(), dao.V1CamelOilCardBinding.Columns().OrderId)).
Where(dao.V1CamelOilOrder.Columns().Status, consts.CamelOilOrderStatusProcessing).
Where(dao.V1CamelOilOrder.Columns().PayStatus, consts.CamelOilPaymentStatusPaid).
Where(dao.V1CamelOilOrder.Columns().NotifyStatus, consts.CamelOilCallbackStatusPending).
WhereLTE(dao.V1CamelOilOrder.Columns().NotifyCount, 3).
WhereLTE(dao.V1CamelOilOrder.Columns().NotifyCount, consts.CamelOilMaxCallbackRetry).
Fields(dao.V1CamelOilOrder.Table() + ".*").
Distinct().
Limit(50).

View File

@@ -325,6 +325,7 @@ func (s *sCamelOil) BindCardToToken(ctx context.Context, req *model.CamelOilCard
NewStatus: consts.CamelOilTokenStatusDisabled,
Remark: "输错过于频繁Token被封禁",
})
return 0, gerror.Wrap(rechargeErr, "输错过于频繁Token被封禁")
case camel_oil_api.RechargeCardErrorToken:
// Token 过期/无效:标记 Token 为已过期
glog.Warningf(ctx, "Token 过期: %v", rechargeErr)
@@ -362,10 +363,10 @@ func (s *sCamelOil) BindCardToToken(ctx context.Context, req *model.CamelOilCard
Data(dao.V1CamelOilToken.Columns().TotalBindAmount, &gdb.Counter{
Field: dao.V1CamelOilToken.Columns().TotalBindAmount,
Value: gconv.Float64(amount),
}).Data(dao.V1CamelOilToken.Columns().BindCount, &gdb.Counter{
Field: dao.V1CamelOilToken.Columns().BindCount,
Value: gconv.Float64(amount),
}).Data(dao.V1CamelOilToken.Columns().LastBindAt, gtime.Now()).Data(dao.V1CamelOilToken.Columns().LastUsedAt, gtime.Now()).Update()
}, dao.V1CamelOilToken.Columns().BindCount, &gdb.Counter{
Field: dao.V1CamelOilToken.Columns().BindCount,
Value: gconv.Float64(amount),
}, dao.V1CamelOilToken.Columns().LastBindAt, gtime.Now(), dao.V1CamelOilToken.Columns().LastUsedAt, gtime.Now()).Update()
//给商户加宽
_, _ = service.SysUserPayment().Consumption(ctx, &model.SysUserPaymentRechargeOrConsumeInput{