# v1.5.0 - 退款与争议处理

## 退款策略

```go
func (s *SubscriptionManager) ProcessRefund(ctx context.Context, userID int64, txnID int64, reason string) error {
    txn, _ := s.dao.GetTransaction(ctx, txnID)
    
    // 检查退款资格
    if !s.isEligibleForRefund(txn) {
        return errors.New("not eligible for refund")
    }
    
    // 计算退款金额（按比例）
    refundAmount := s.calculateRefundAmount(txn)
    
    // 调用支付网关退款
    gateway := s.getGateway(txn.PaymentMethod)
    if err := gateway.Refund(txn.GatewayTransactionID, refundAmount); err != nil {
        return err
    }
    
    // 记录退款
    s.dao.CreateRefund(ctx, &Refund{
        TransactionID: txnID,
        Amount:        refundAmount,
        Reason:        reason,
        Status:        "completed",
    })
    
    // 降级用户
    s.downgradeToFree(userID)
    
    return nil
}

func (s *SubscriptionManager) isEligibleForRefund(txn *Transaction) bool {
    // 7天内可全额退款
    if time.Since(txn.CreatedAt) < 7*24*time.Hour {
        return true
    }
    // 30天内按比例退款
    if time.Since(txn.CreatedAt) < 30*24*time.Hour {
        return true
    }
    return false
}
```
