功能:发货链接支持永久有效,默认 TTL=0
- DELIVERY_LINK_TTL_MINUTES 设为 0 或负数时链接永久有效(expires_at 存 NULL), 默认值由 120 改为 0,本地 .env 同步改为永久 - 新增 delivery_link_generated_at 列区分从未生成与永久链接,兼容历史数据 - 永久链接授权仅校验 HMAC 签名、不校验过期(exp=0),作废/恢复语义不变 - 前端链接有效期列对永久链接显示"永久有效"
This commit is contained in:
@@ -18,7 +18,7 @@ func (s *DeliveryService) authorizeDeliveryLink(order *model.FulfillmentOrder, a
|
||||
if order == nil {
|
||||
return newDeliveryHTTPError(http.StatusNotFound, "订单不存在")
|
||||
}
|
||||
if auth.Exp <= 0 || strings.TrimSpace(auth.Sign) == "" {
|
||||
if strings.TrimSpace(auth.Sign) == "" {
|
||||
return newDeliveryHTTPError(http.StatusForbidden, "链接参数缺失")
|
||||
}
|
||||
if order.DeliveryLinkRevokedAt != nil {
|
||||
@@ -28,9 +28,18 @@ func (s *DeliveryService) authorizeDeliveryLink(order *model.FulfillmentOrder, a
|
||||
if normalizeOrderStatus(order) == model.OrderStatusCancelled {
|
||||
return newDeliveryHTTPError(http.StatusForbidden, "订单已取消,发货链接不可用")
|
||||
}
|
||||
if order.DeliveryLinkExpiresAt == nil {
|
||||
// 从未生成过链接(兼容历史数据:本次改动前生成的有时效链接没有 generated_at 记录)。
|
||||
if order.DeliveryLinkGeneratedAt == nil && order.DeliveryLinkExpiresAt == nil {
|
||||
return newDeliveryHTTPError(http.StatusForbidden, "发货链接未生成")
|
||||
}
|
||||
// 永久有效链接(expires_at 为 NULL):仅校验签名(exp 固定为 0),不检查过期。
|
||||
if order.DeliveryLinkExpiresAt == nil {
|
||||
expected := s.signDeliveryLink(order.OrderNo, auth.Exp)
|
||||
if !hmac.Equal([]byte(strings.ToLower(strings.TrimSpace(auth.Sign))), []byte(expected)) {
|
||||
return newDeliveryHTTPError(http.StatusForbidden, "发货链接签名无效")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
expiresAt := order.DeliveryLinkExpiresAt.UTC().Truncate(time.Second)
|
||||
linkExpires := time.Unix(auth.Exp, 0).UTC()
|
||||
if !linkExpires.Equal(expiresAt) {
|
||||
@@ -46,9 +55,12 @@ func (s *DeliveryService) authorizeDeliveryLink(order *model.FulfillmentOrder, a
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *DeliveryService) buildDeliveryLinkResult(orderNo string, expiresAt time.Time, requestBaseURL string) *DeliveryLinkResult {
|
||||
expiresAt = expiresAt.UTC()
|
||||
exp := expiresAt.Unix()
|
||||
// buildDeliveryLinkResult 组装链接结果;expiresAt 为 nil 表示永久有效(exp 固定为 0)。
|
||||
func (s *DeliveryService) buildDeliveryLinkResult(orderNo string, expiresAt *time.Time, requestBaseURL string) *DeliveryLinkResult {
|
||||
exp := int64(0)
|
||||
if expiresAt != nil {
|
||||
exp = expiresAt.UTC().Unix()
|
||||
}
|
||||
sign := s.signDeliveryLink(orderNo, exp)
|
||||
return &DeliveryLinkResult{
|
||||
OrderNo: orderNo,
|
||||
|
||||
Reference in New Issue
Block a user