发货链接返回完整域名:DELIVERY_BASE_URL 未配置时按请求 scheme+Host 推导

- GetOrCreateDeliveryLink/RestoreDeliveryLink 增加 requestBaseURL 参数
- buildDeliveryURL 优先级:DELIVERY_BASE_URL → 请求域名 → 路径
- 支持 X-Forwarded-Proto 与 TLS 判断 https
This commit is contained in:
yml2213
2026-08-03 17:38:11 +08:00
parent 19ada1282e
commit 2e67e2cc3b
5 changed files with 37 additions and 15 deletions
+14 -10
View File
@@ -665,7 +665,7 @@ func optionalUint(value uint) *uint {
return &out
}
func (s *DeliveryService) GetOrCreateDeliveryLink(merchantID uint, orderNo string) (*DeliveryLinkResult, error) {
func (s *DeliveryService) GetOrCreateDeliveryLink(merchantID uint, orderNo, requestBaseURL string) (*DeliveryLinkResult, error) {
orderNo = strings.TrimSpace(orderNo)
if orderNo == "" {
return nil, errors.New("订单号不能为空")
@@ -679,7 +679,7 @@ func (s *DeliveryService) GetOrCreateDeliveryLink(merchantID uint, orderNo strin
return nil, newDeliveryHTTPError(http.StatusForbidden, "发货链接已作废")
}
if order.DeliveryLinkExpiresAt != nil && order.DeliveryLinkExpiresAt.After(now) {
return s.buildDeliveryLinkResult(order.OrderNo, order.DeliveryLinkExpiresAt.UTC().Truncate(time.Second)), nil
return s.buildDeliveryLinkResult(order.OrderNo, order.DeliveryLinkExpiresAt.UTC().Truncate(time.Second), requestBaseURL), nil
}
canShip, reason := CanFulfill(order)
if !canShip {
@@ -697,7 +697,7 @@ func (s *DeliveryService) GetOrCreateDeliveryLink(merchantID uint, orderNo strin
}).Error; err != nil {
return nil, err
}
return s.buildDeliveryLinkResult(order.OrderNo, expiresAt), nil
return s.buildDeliveryLinkResult(order.OrderNo, expiresAt, requestBaseURL), nil
}
func (s *DeliveryService) RevokeDeliveryLink(merchantID uint, orderNo string) error {
@@ -717,7 +717,7 @@ func (s *DeliveryService) RevokeDeliveryLink(merchantID uint, orderNo string) er
}).Error
}
func (s *DeliveryService) RestoreDeliveryLink(merchantID uint, orderNo string) (*DeliveryLinkResult, error) {
func (s *DeliveryService) RestoreDeliveryLink(merchantID uint, orderNo, requestBaseURL string) (*DeliveryLinkResult, error) {
orderNo = strings.TrimSpace(orderNo)
if orderNo == "" {
return nil, errors.New("订单号不能为空")
@@ -745,7 +745,7 @@ func (s *DeliveryService) RestoreDeliveryLink(merchantID uint, orderNo string) (
}).Error; err != nil {
return nil, err
}
return s.buildDeliveryLinkResult(order.OrderNo, expiresAt), nil
return s.buildDeliveryLinkResult(order.OrderNo, expiresAt, requestBaseURL), nil
}
func (s *DeliveryService) prepareOrder(orderNo string, requireCanShip bool, auth *DeliveryLinkAuth) (*DeliveryOrderInfo, *model.FulfillmentOrder, string, error) {
@@ -842,25 +842,29 @@ func (s *DeliveryService) authorizeDeliveryLink(order *model.FulfillmentOrder, a
return nil
}
func (s *DeliveryService) buildDeliveryLinkResult(orderNo string, expiresAt time.Time) *DeliveryLinkResult {
func (s *DeliveryService) buildDeliveryLinkResult(orderNo string, expiresAt time.Time, requestBaseURL string) *DeliveryLinkResult {
expiresAt = expiresAt.UTC()
exp := expiresAt.Unix()
sign := s.signDeliveryLink(orderNo, exp)
return &DeliveryLinkResult{
OrderNo: orderNo,
DeliveryURL: s.buildDeliveryURL(orderNo, exp, sign),
DeliveryURL: s.buildDeliveryURL(orderNo, exp, sign, requestBaseURL),
ExpiresAt: expiresAt,
Exp: exp,
Sign: sign,
}
}
func (s *DeliveryService) buildDeliveryURL(orderNo string, exp int64, sign string) string {
func (s *DeliveryService) buildDeliveryURL(orderNo string, exp int64, sign, requestBaseURL string) string {
path := fmt.Sprintf("/delivery/%s/%s?exp=%d&sign=%s", url.PathEscape(s.channel), url.PathEscape(orderNo), exp, url.QueryEscape(sign))
if s.linkBaseURL == "" {
base := strings.TrimRight(s.linkBaseURL, "/")
if base == "" {
base = strings.TrimRight(requestBaseURL, "/")
}
if base == "" {
return path
}
return s.linkBaseURL + path
return base + path
}
func (s *DeliveryService) signDeliveryLink(orderNo string, exp int64) string {
+2 -2
View File
@@ -29,7 +29,7 @@ func TestDeliveryLinkGenerateAuthorizeAndRevoke(t *testing.T) {
t.Fatalf("create order: %v", err)
}
link, err := deliverySvc.GetOrCreateDeliveryLink(merchantID, created.Order.OrderNo)
link, err := deliverySvc.GetOrCreateDeliveryLink(merchantID, created.Order.OrderNo, "https://shop.example")
if err != nil {
t.Fatalf("get delivery link: %v", err)
}
@@ -61,7 +61,7 @@ func TestDeliveryLinkGenerateAuthorizeAndRevoke(t *testing.T) {
t.Fatalf("delivery_link_revoked_at should be stored")
}
restored, err := deliverySvc.RestoreDeliveryLink(merchantID, created.Order.OrderNo)
restored, err := deliverySvc.RestoreDeliveryLink(merchantID, created.Order.OrderNo, "https://shop.example")
if err != nil {
t.Fatalf("restore delivery link: %v", err)
}