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:
@@ -239,5 +239,5 @@ const (
|
||||
CamelOilOrderExpireDuration = gtime.H
|
||||
|
||||
// CamelOilMaxCallbackRetry 回调最大重试次数
|
||||
CamelOilMaxCallbackRetry = 3
|
||||
CamelOilMaxCallbackRetry = 5
|
||||
)
|
||||
|
||||
@@ -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})
|
||||
}
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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{
|
||||
|
||||
Reference in New Issue
Block a user